.net操作Excel的支持库下载 NPOI2.0.1.zip
以前用过依赖于office的方法对Excel文件进行操作,在自己机器上运行正常,到服务器上就不能运行。
这个问题困扰了我好久,终于找到了好的解决方法 。
使用不依赖于office的外部dll来操作Excel。。
首先,我自己建立的类,NpoiHelper,用来进行Excel与DataSet之间的转化,放于自己的类库Tools中
类的内容如下:
using System; using System.Collections.Generic; using System.Text; using System.IO; using NPOI.HSSF.UserModel; using System.Data; using System.Collections; namespace Tools { /// <summary> /// Excel文件到DataSet的转换类 /// </summary> public class NpoiHelper { #region 读取Excel文件内容转换为DataSet /// <summary> /// 读取Excel文件内容转换为DataSet,列名依次为 "c0"……c[columnlength-1] /// </summary> /// <param name="FileName">文件绝对路径</param> /// <param name="startRow">数据开始行数(1为第一行)</param> /// <param name="ColumnDataType">每列的数据类型</param> /// <returns></returns> public static DataSet ReadExcel(string FileName, int startRow, params datatype[] ColumnDataType) { int ertime = 0; int intime = 0; DataSet ds = new DataSet("ds"); DataTable dt = new DataTable("dt"); DataRow dr; StringBuilder sb = new StringBuilder(); using (FileStream stream = new FileStream(@FileName, FileMode.Open, FileAccess.Read)) { HSSFWorkbook workbook = new HSSFWorkbook(stream);//整个Excel文件 HSSFSheet sheet = workbook.GetSheetAt(0);//得到里面第一个sheet int j; for (j = 0; j < ColumnDataType.Length; j++) dt.Columns.Add("c" + j, Type.GetType("System.String")); for (int i = startRow - 1; i <= sheet.LastRowNum; i++) { HSSFRow row = sheet.GetRow(i);//得到第i行 try { dr = dt.NewRow(); for (j = 0; j < ColumnDataType.Length; j++) dr["c" + j] = GetCellData(ColumnDataType[j], row, j).ToString(); dt.Rows.Add(dr); intime++; } catch (Exception er) { ertime++; sb.Append(string.Format("第{0}行出错:{1} ", i + 1, er.Message)); continue; } } ds.Tables.Add(dt); } if (ds.Tables[0].Rows.Count == 0 && sb.ToString() != "") throw new Exception(sb.ToString()); return ds; } #endregion #region 从DataSet导出到MemoryStream流 /// <summary> /// 从DataSet导出到MemoryStream流 /// </summary> /// <param name="SheetName">Excel文件中的Sheet名称</param> /// <param name="ds">存储数据的DataSet</param> /// <param name="HeaderNames">DataSet中的表头(数组形式)</param> /// <param name="columnNames">DataSet中的列名集合(数组形式)</param> /// <param name="datatypes">DataSet中的列名对应的数据类型(datatype枚举类)集合(数组形式)</param> public static MemoryStream CreateExcel(string SheetName, DataSet ds, string[] columnNames, string[] HeaderNames, datatype[] datatypes) { try { HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.CreateSheet(SheetName); HSSFRow row; HSSFCell cell; DataRow dr; int j; string column; object columnValue; #region 创建表头 row = sheet.CreateRow(0);//创建第i行 for (j = 0; j < columnNames.Length; j++) { column = columnNames[j]; columnValue = HeaderNames[j]; try { cell = row.CreateCell(j);//创建第0行的第j列 try { cell.SetCellType(HSSFCell.CELL_TYPE_STRING); cell.SetCellValue(columnValue.ToString()); } catch { } } catch { continue; } } #endregion #region 创建每一行 for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { dr = ds.Tables[0].Rows[i]; row = sheet.CreateRow(i + 1);//创建第i行 for (j = 0; j < columnNames.Length; j++) { column = columnNames[j]; columnValue = dr[column]; try { cell = row.CreateCell(j);//创建第i行的第j列 &