程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> Asp.net:常見數據導入Excel

Asp.net:常見數據導入Excel

編輯:關於ASP.NET

       引言

      項目中常用到將數據導入Excel,將Excel中的數據導入數據庫的功能,曾經也查找過相關的內容,將曾經用過的方案總結一下。

      方案一

      NPOI

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

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

      優勢

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

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

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

      3、導出時,如果字段內容以“-”或“=”開頭,Excel會把它當成公式進行,會報錯。

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

      (二)使用NPOI的優勢

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

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

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

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

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

      6、同時支持文件的導入和導出

      7、基於.net 2.0 也支持xlsx 和 docx格式(當然也支持.net 4.0)

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

      9、大量的實例代碼

      11、你不需要在服務器上安裝微軟的Office,可以避免版權問題。

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

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

      NPOI之所以強大,並不是因為它支持導出Excel,而是因為它支持導入Excel,並能“理解”OLE2文檔結構,這也是其他一些Excel讀寫庫比較弱的方面。通常,讀入並理解結構遠比導出來得復雜,因為導入你必須假設一切情況都是可能的,而生成你只要保證滿足你自己需求就可以了,如果把導入需求和生成需求比做兩個集合,那麼生成需求通常都是導入需求的子集,這一規律不僅體現在Excel讀寫庫中,也體現在pdf讀寫庫中,目前市面上大部分的pdf庫僅支持生成,不支持導入。

      構成

      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

      基礎類庫,提供了很多實用功能,可用於其他讀寫文件格式項目的開發

      NPOI組成部分

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

      1、讀寫OLE2文檔

      2、讀寫DocummentSummaryInformation和SummaryInformation

      3、基於LittleEndian的字節讀寫

      4、讀寫Excel BIFF格式

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

      6、支持設置單元格的高、寬、樣式等

      7、支持調用部分Excel內建函數,比如說sum, countif以及計算符號

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

      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

      基礎類庫,提供了很多實用功能,可用於其他讀寫文件格式項目的開發

      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對象關系庫

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

      案例

      官網地址:http://npoi.codeplex.com/,可以從官網下載NPOI2.X版本的。

      首先引入

      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文件中的數據讀出到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中的數據導入到datatable中

      ///

     

      /// 指定需要導出的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;//到最後 跳出循環

      }

      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中的數據導入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);

      }

      //數據

      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;

      }

      }

      }

      }

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved