午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    Asp.net:常見數(shù)據(jù)導(dǎo)入Excel
    來源:易賢網(wǎng) 閱讀:1586 次 日期:2014-08-28 13:34:27
    溫馨提示:易賢網(wǎng)小編為您整理了“Asp.net:常見數(shù)據(jù)導(dǎo)入Excel”,方便廣大網(wǎng)友查閱!

    引言

    項目中常用到將數(shù)據(jù)導(dǎo)入Excel,將Excel中的數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫的功能,曾經(jīng)也查找過相關(guān)的內(nèi)容,將曾經(jīng)用過的方案總結(jié)一下。

    方案一

    NPOI

    NPOI 是 POI 項目的 .NET 版本。POI是一個開源的Java讀寫Excel、WORD等微軟OLE2組件文檔的項目。

    使用 NPOI 你就可以在沒有安裝 Office 或者相應(yīng)環(huán)境的機器上對 WORD/EXCEL 文檔進行讀寫。NPOI是構(gòu)建在POI 3.x版本之上的,它可以在沒有安裝Office的情況下對Word/Excel文檔進行讀寫操作。

    優(yōu)勢

    (一)傳統(tǒng)操作Excel遇到的問題:

    1、如果是.NET,需要在服務(wù)器端裝Office,且及時更新它,以防漏洞,還需要設(shè)定權(quán)限允許.NET訪問COM+,如果在導(dǎo)出過程中出問題可能導(dǎo)致服務(wù)器宕機。

    2、Excel會把只包含數(shù)字的列進行類型轉(zhuǎn)換,本來是文本型的,Excel會將其轉(zhuǎn)成數(shù)值型的,比如編號000123會變成123。

    3、導(dǎo)出時,如果字段內(nèi)容以“-”或“=”開頭,Excel會把它當(dāng)成公式進行,會報錯。

    4、Excel會根據(jù)Excel文件前8行分析數(shù)據(jù)類型,如果正好你前8行某一列只是數(shù)字,那它會認(rèn)為該列為數(shù)值型,自動將該列轉(zhuǎn)變成類似1.42702E+17格式,日期列變成包含日期和數(shù)字的。

    (二)使用NPOI的優(yōu)勢

    1、您可以完全免費使用該框架

    2、包含了大部分EXCEL的特性(單元格樣式、數(shù)據(jù)格式、公式等等)

    3、專業(yè)的技術(shù)支持服務(wù)(24*7全天候) (非免費)

    4、支持處理的文件格式包括xls, xlsx, docx.

    5、采用面向接口的設(shè)計架構(gòu)( 可以查看 NPOI.SS 的命名空間)

    6、同時支持文件的導(dǎo)入和導(dǎo)出

    7、基于.net 2.0 也支持xlsx 和 docx格式(當(dāng)然也支持.net 4.0)

    8、來自全世界大量成功且真實的測試Cases

    9、大量的實例代碼

    11、你不需要在服務(wù)器上安裝微軟的Office,可以避免版權(quán)問題。

    12、使用起來比Office PIA的API更加方便,更人性化。

    13、你不用去花大力氣維護NPOI,NPOI Team會不斷更新、改善NPOI,絕對省成本。

    NPOI之所以強大,并不是因為它支持導(dǎo)出Excel,而是因為它支持導(dǎo)入Excel,并能“理解”O(jiān)LE2文檔結(jié)構(gòu),這也是其他一些Excel讀寫庫比較弱的方面。通常,讀入并理解結(jié)構(gòu)遠比導(dǎo)出來得復(fù)雜,因為導(dǎo)入你必須假設(shè)一切情況都是可能的,而生成你只要保證滿足你自己需求就可以了,如果把導(dǎo)入需求和生成需求比做兩個集合,那么生成需求通常都是導(dǎo)入需求的子集,這一規(guī)律不僅體現(xiàn)在Excel讀寫庫中,也體現(xiàn)在pdf讀寫庫中,目前市面上大部分的pdf庫僅支持生成,不支持導(dǎo)入。

    構(gòu)成

    NPOI 1.2.x主要由POIFS、DDF、HPSF、HSSF、SS、Util六部分組成。

    NPOI.POIFS

    OLE2/ActiveX文檔屬性讀寫庫

    NPOI.DDF

    Microsoft Office Drawing讀寫庫

    NPOI.HPSF

    OLE2/ActiveX文檔讀寫庫

    NPOI.HSSF

    Microsoft Excel BIFF(Excel 97-2003)格式讀寫庫

    NPOI.SS

    Excel公用接口及Excel公式計算引擎

    NPOI.Util

    基礎(chǔ)類庫,提供了很多實用功能,可用于其他讀寫文件格式項目的開發(fā)

    NPOI組成部分

    NPOI 1.x的最新版為NPOI 1.2.5,其中包括了以下功能:

    1、讀寫OLE2文檔

    2、讀寫DocummentSummaryInformation和SummaryInformation

    3、基于LittleEndian的字節(jié)讀寫

    4、讀寫Excel BIFF格式

    5、識別并讀寫Excel BIFF中的常見Record,如RowRecord, StyleRecord, ExtendedFormatRecord

    6、支持設(shè)置單元格的高、寬、樣式等

    7、支持調(diào)用部分Excel內(nèi)建函數(shù),比如說sum, countif以及計算符號

    8、支持在生成的XLS內(nèi)嵌入打印設(shè)置,比如說橫向/縱向打印、縮放、使用的紙張等。

    NPOI 2.0主要由SS, HPSF, DDF, HSSF, XWPF, XSSF, OpenXml4Net, OpenXmlFormats組成,具體列表如下:

    Assembly名稱 模塊/命名空間 說明

    NPOI.DLL

    NPOI.POIFS

    OLE2/ActiveX文檔屬性讀寫庫

    NPOI.DLL

    NPOI.DDF

    微軟Office Drawing讀寫庫

    NPOI.DLL

    NPOI.HPSF

    OLE2/ActiveX文檔讀寫庫

    NPOI.DLL

    NPOI.HSSF

    微軟Excel BIFF(Excel 97-2003, doc)格式讀寫庫

    NPOI.DLL

    NPOI.SS

    Excel公用接口及Excel公式計算引擎

    NPOI.DLL

    NPOI.Util

    基礎(chǔ)類庫,提供了很多實用功能,可用于其他讀寫文件格式項目的開發(fā)

    NPOI.OOXML.DLL NPOI.XSSF Excel 2007(xlsx)格式讀寫庫

    NPOI.OOXML.DLL NPOI.XWPF Word 2007(docx)格式讀寫庫

    NPOI.OpenXml4Net.DLL NPOI.OpenXml4Net OpenXml底層zip包讀寫庫

    NPOI.OpenXmlFormats.DLL NPOI.OpenXmlFormats 微軟Office OpenXml對象關(guān)系庫

    (以上內(nèi)容來自百度百科)從上表可知NPOI組件已支持excel2007,記得之前用的時候只支持excel2003。很久沒研究過這玩意兒了。

    首先引入

    ICSharpCode.SharpZipLib.dll

    NPOI.dll

    NPOI.OOXML.dll

    NPOI.OpenXml4Net.dll

    NPOI.OpenXmlFormats.dll

    然后引入命名空間:

    using NPOI.XSSF.UserModel;

    using NPOI.SS.UserModel;

    using NPOI.HSSF.UserModel;

    輔助類

    using NPOI.XSSF.UserModel;

    using NPOI.SS.UserModel;

    using NPOI.HSSF.UserModel;

    using System;

    using System.Collections.Generic;

    using System.Data;

    using System.IO;

    using System.Linq;

    using System.Text;

    using System.Threading.Tasks;

    using NPOI.SS.Formula.Eval;

    namespace Wolfy.Common

    {

    ///

    /// 使用NPOI組件

    /// 需引入ICSharpCode.SharpZipLib.dll/NPOI.dll/NPOI.OOXML.dll/NPOI.OpenXml4Net.dll/NPOI.OpenXmlFormats.dll

    /// office2007

    ///

    public class NPOIExcelHelper

    {

    ///

    /// 將Excel文件中的數(shù)據(jù)讀出到DataTable中

    ///

    ///

    ///

    public static DataTable Excel2DataTable(string file, string sheetName, string tableName)

    {

    DataTable dt = new DataTable();

    IWorkbook workbook = null;

    using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))

    {

    //office2003 HSSFWorkbook

    workbook = new XSSFWorkbook(fs);

    }

    ISheet sheet = workbook.GetSheet(sheetName);

    dt = Export2DataTable(sheet, 0, true);

    return dt;

    }

    ///

    /// 將指定sheet中的數(shù)據(jù)導(dǎo)入到datatable中

    ///

    /// 指定需要導(dǎo)出的sheet

    /// 列頭所在的行號,-1沒有列頭

    ///

    ///

    private static DataTable Export2DataTable(ISheet sheet, int HeaderRowIndex, bool needHeader)

    {

    DataTable dt = new DataTable();

    XSSFRow headerRow = null;

    int cellCount;

    try

    {

    if (HeaderRowIndex < 0 || !needHeader)

    {

    headerRow = sheet.GetRow(0) as XSSFRow;

    cellCount = headerRow.LastCellNum;

    for (int i = headerRow.FirstCellNum; i <= cellCount; i++)

    {

    DataColumn column = new DataColumn(Convert.ToString(i));

    dt.Columns.Add(column);

    }

    }

    else

    {

    headerRow = sheet.GetRow(HeaderRowIndex) as XSSFRow;

    cellCount = headerRow.LastCellNum;

    for (int i = headerRow.FirstCellNum; i <= cellCount; i++)

    {

    ICell cell = headerRow.GetCell(i);

    if (cell == null)

    {

    break;//到最后 跳出循環(huán)

    }

    else

    {

    DataColumn column = new DataColumn(headerRow.GetCell(i).ToString());

    dt.Columns.Add(column);

    }

    }

    }

    int rowCount = sheet.LastRowNum;

    for (int i = HeaderRowIndex + 1; i <= sheet.LastRowNum; i++)

    {

    XSSFRow row = null;

    if (sheet.GetRow(i) == null)

    {

    row = sheet.CreateRow(i) as XSSFRow;

    }

    else

    {

    row = sheet.GetRow(i) as XSSFRow;

    }

    DataRow dtRow = dt.NewRow();

    for (int j = row.FirstCellNum; j <= cellCount; j++)

    {

    if (row.GetCell(j) != null)

    {

    switch (row.GetCell(j).CellType)

    {

    case CellType.Boolean:

    dtRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);

    break;

    case CellType.Error:

    dtRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);

    break;

    case CellType.Formula:

    switch (row.GetCell(j).CachedFormulaResultType)

    {

    case CellType.Boolean:

    dtRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);

    break;

    case CellType.Error:

    dtRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);

    break;

    case CellType.Numeric:

    dtRow[j] = Convert.ToString(row.GetCell(j).NumericCellValue);

    break;

    case CellType.String:

    string strFORMULA = row.GetCell(j).StringCellValue;

    if (strFORMULA != null && strFORMULA.Length > 0)

    {

    dtRow[j] = strFORMULA.ToString();

    }

    else

    {

    dtRow[j] = null;

    }

    break;

    default:

    dtRow[j] = "";

    break;

    }

    break;

    case CellType.Numeric:

    if (DateUtil.IsCellDateFormatted(row.GetCell(j)))

    {

    dtRow[j] = DateTime.FromOADate(row.GetCell(j).NumericCellValue);

    }

    else

    {

    dtRow[j] = Convert.ToDouble(row.GetCell(j).NumericCellValue);

    }

    break;

    case CellType.String:

    string str = row.GetCell(j).StringCellValue;

    if (!string.IsNullOrEmpty(str))

    {

    dtRow[j] = Convert.ToString(str);

    }

    else

    {

    dtRow[j] = null;

    }

    break;

    default:

    dtRow[j] = "";

    break;

    }

    }

    }

    dt.Rows.Add(dtRow);

    }

    }

    catch (Exception)

    {

    return null;

    }

    return dt;

    }

    ///

    /// 將DataTable中的數(shù)據(jù)導(dǎo)入Excel文件中

    ///

    ///

    ///

    public static void DataTable2Excel(DataTable dt, string file, string sheetName)

    {

    IWorkbook workbook = new XSSFWorkbook();

    ISheet sheet = workbook.CreateSheet(sheetName);

    IRow header = sheet.CreateRow(0);

    for (int i = 0; i < dt.Columns.Count; i++)

    {

    ICell cell = header.CreateCell(i);

    cell.SetCellValue(dt.Columns[i].ColumnName);

    }

    //數(shù)據(jù)

    for (int i = 0; i < dt.Rows.Count; i++)

    {

    IRow row = sheet.CreateRow(i + 1);

    for (int j = 0; j < dt.Columns.Count; j++)

    {

    ICell cell = row.CreateCell(j);

    cell.SetCellValue(dt.Rows[i][j].ToString());

    }

    }

    MemoryStream stream = new MemoryStream();

    workbook.Write(stream);

    byte[] buffer = stream.ToArray();

    using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))

    {

    fs.Write(buffer, 0, buffer.Length);

    fs.Flush();

    }

    }

    ///

    /// 獲取單元格類型

    ///

    ///

    ///

    private static object GetValueType(XSSFCell cell)

    {

    if (cell == null)

    {

    return null;

    }

    switch (cell.CellType)

    {

    case CellType.Blank:

    return null;

    case CellType.Boolean:

    return cell.BooleanCellValue;

    case CellType.Error:

    return cell.ErrorCellValue;

    case CellType.Numeric:

    return cell.NumericCellValue;

    case CellType.String:

    return cell.StringCellValue;

    case CellType.Formula:

    default:

    return "=" + cell.StringCellValue;

    }

    }

    }

    }

    更多信息請查看IT技術(shù)專欄

    更多信息請查看網(wǎng)絡(luò)編程
    易賢網(wǎng)手機網(wǎng)站地址:Asp.net:常見數(shù)據(jù)導(dǎo)入Excel
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2025國考·省考課程試聽報名

    • 報班類型
    • 姓名
    • 手機號
    • 驗證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報警專用圖標(biāo)