Asp.net:常见数据导入Excel

   引言

  项目中常用到将数据导入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;

  }

  }

  }

  }

时间: 2024-08-18 04:41:38

Asp.net:常见数据导入Excel的相关文章

[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!

原文:[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你! 引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在

常见数据导入Excel及Excel数据导入数据库的解决方案

项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下.方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作. 优势

用c#怎么吧数据导入Excel 中

问题描述 用c#怎么吧数据导入Excel中 解决方案 解决方案二:最简单的办法,用tab和回车分割,保存为xls就可以了解决方案三:把我的代码给你,若又问题可以给我发邮件.mq_jx@163.comSqlDataAdapterda=newSqlDataAdapter("sql语句",conn);DataSetds=newDataSet();da.Fill(ds,"tabel");ds.Tables["tabel"].AcceptChanges()

winform中 将DataGrid中的数据导入Excel中,并显示Excel应用程序

datagrid|excel|程序|数据|显示    /// <summary>        /// 将DataGrid中的数据导入Excel中,并显示Excel应用程序,        /// 注意调用该方法必须有安装Excel 2000应用程序,并且假定DataGrid中绑定的是一DataSet        /// </summary>        /// <param name="grid"></param>        /

怎么由DataSet将数据导入Excel?

excel|数据 /// <summary> /// 将DataSet里所有数据导入Excel. /// 需要添加COM: Microsoft Excel Object Library. /// using Excel; /// </summary> /// <param name="filePath"></param> /// <param name="ds"></param> public

[Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你!

原文:[Asp.net]常见word,excel,ppt,pdf在线预览方案,有图有真相,总有一款适合你! 引言 之前项目需要,查找了office文档在线预览的解决方案,顺便记录一下,方便以后查询. 方案一 直接在浏览器中打开Office文档在页面上的链接.会弹出如下窗口:   优点:主流浏览器都支持. 缺点:Office文档链接在浏览器中打开,会有如上图的提示,需用户自己选择打开或者保存功能,如果客户电脑上安装迅雷下载软件,会启动迅雷下载,用户体验不好. 方案二 office文档转html,首

导入导出-C#怎样通过代码实现讲数据导入excel表并将excel设置为只读模式

问题描述 C#怎样通过代码实现讲数据导入excel表并将excel设置为只读模式 C#怎样通过代码实现讲数据导入excel表并将excel设置为只读模式,目前写入数据没问题,关键就是怎么设为只读 解决方案 不用宏也可以做到的,直接用C#去调用excel com组件 这是我以前的解决方案:http://www.ourcodelife.com/thread-49258-1-1.html 解决方案二: 参考:http://office.jb51.net/excel/3889.html 你录制一个宏,看

从dataset将数据导入excel中超过5行中文将出现乱码,这是为什么?

问题描述 在网上找的一个函数,从dataset将数据导入excel中超过5行中文将出现乱码,函数如下:publicvoidCreateExcel(DataSetds,stringFileName){HttpResponseresp;resp=Page.Response;resp.ContentType="application/vnd.ms-excel";resp.ContentEncoding=System.Text.Encoding.GetEncoding("UTF-8&

Spread显示数据导入Excel,怎么让combox 选项ID 显示相应的字符串

问题描述 将Spread显示数据导入Excel,其中有列属性是combox的,怎么让combox列导入到Excel后选项ID显示相应的字符串 解决方案