最近项目用到的读取Excel 为DataTable 兼容2003、2007、2010。记录一下,以后会用到

引用 NPOI.dll 和 EPPlus.dll

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using OfficeOpenXml;
using System.IO;
using NPOI.SS.UserModel;
using NPOI.HSSF.Util;
using NPOI.HSSF.UserModel; public class ExcelUtil
{
/// <summary>
/// Excel 转 DataTable 约定 Excel第一行为列名,即为转换后的Datatable中的DataColumn列
/// </summary>
/// <param name="file">Excel文件路径</param>
/// <param name="sheet">sheet名称</param>
/// <returns></returns>
public static DataTable ExcelSheet2DataTable(string file, string sheet)
{
DataTable dt = null;
FileInfo existingFile = new FileInfo(file);
try
{
ExcelPackage package = new ExcelPackage(existingFile);
int vSheetCount = package.Workbook.Worksheets.Count; //获取总Sheet页 ExcelWorksheet worksheet = package.Workbook.Worksheets[sheet];//选定 指定页 int maxColumnNum = worksheet.Dimension.End.Column;//最大列
int minColumnNum = worksheet.Dimension.Start.Column;//最小列 int maxRowNum = worksheet.Dimension.End.Row;//最小行
int minRowNum = worksheet.Dimension.Start.Row;//最大行 DataTable vTable = new DataTable();
DataColumn vC;
for (int j = ; j <= maxColumnNum; j++)
{
string colname = worksheet.Cells[, j].Text;
if (vTable.Columns.Contains(colname))
{
colname += "";//对于可能的重名列的处理
}
vC = new DataColumn(colname, typeof(string)); vTable.Columns.Add(vC);
} for (int n = ; n <= maxRowNum; n++)
{
DataRow vRow = vTable.NewRow();
for (int m = ; m <= maxColumnNum; m++)
{
vRow[m - ] = worksheet.Cells[n, m].Value;
}
vTable.Rows.Add(vRow);
}
dt = vTable;
worksheet = null;
sheet = null;
}
catch (Exception vErr)
{
try
{
using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
{
using (HSSFWorkbook workbook = new HSSFWorkbook(fs)) //根据EXCEL文件流初始化工作簿
{
//var sheet1 = workbook.GetSheetAt(0); //获取第一个sheet
var sheet1 = workbook.GetSheet(sheet); //获取sheet
DataTable table = new DataTable();//
var row1 = sheet1.GetRow();//获取第一行即标头 int cellCount = row1.LastCellNum; //第一行的列数
int rowCount = sheet1.LastRowNum; //总行数 //把第一行的数据添加到datatable的列名
for (int i = row1.FirstCellNum; i < cellCount; i++)
{
string colname = string.Empty;
if (row1.GetCell(i).CellType == NPOI.SS.UserModel.CellType.STRING)
{
colname = row1.GetCell(i).StringCellValue;
}
else
{
colname = row1.GetCell(i).ToString();
}
if (table.Columns.Contains(colname))
{
colname += "";
}
DataColumn column = new DataColumn(colname);
table.Columns.Add(column);
}
//把每行数据添加到datatable中
for (int i = (sheet1.FirstRowNum + ); i < sheet1.LastRowNum; i++)
{
HSSFRow row = sheet1.GetRow(i) as HSSFRow;
DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
dataRow[j] = row.GetCell(j).ToString();
} table.Rows.Add(dataRow);
}
dt = table;
}
}
}
catch
{ }
}
return dt;
}
}

最新文章

  1. a标签的href值
  2. Apache MPM winnt
  3. CSS Clip属性
  4. HDOJ(HDU) 2503 a/b + c/d(最大公约数问题)
  5. &#39;swap file &quot;xx&quot; exists&#39; linux
  6. Unity 单元测试(PLUnitTest工具)
  7. [Phonegap+Sencha Touch] 移动开发24 包wp8.1的App,弹出软键盘输入框聚焦实施后,无移动采收率方法来解决接口
  8. Java分布式应用技术架构
  9. [nginx]统计文件下载是否完整思路(flask)
  10. int*p[ ]与int(*p)[ ]的不同
  11. java中的stream的泛型方法的使用示例
  12. day13.装饰器进阶,迭代器
  13. request请求携带证书,如:微信企业零钱付款
  14. 通过源码分析View的测量
  15. linux中bashrc与profile的区别
  16. cocos2d-Lua02Lua面向对象
  17. Spring Boot + thymeleaf 实现文件上传下载
  18. MVC $.Ajax()+Json实现数据库访问并显示数据
  19. Docker技术这些应用场景【转】
  20. 41:和为S的两个数

热门文章

  1. CODEVS 1287 矩阵乘法
  2. [Unity优化] Unity CPU性能优化
  3. Sql Server 连接池及其用法
  4. [转]Windows与Linux系统下的库文件介绍
  5. 用jQuery与JSONP轻松解决跨域访问的问题【转】
  6. php 之 文件上传(0523)
  7. php 之 数据访问 增删改查
  8. centos6 安装 lamp
  9. Mac实用技巧
  10. java实现双向链表