dataTable和excel的转换
来源:互联网 发布:特别好的句子 知乎 编辑:程序博客网 时间:2024/06/01 20:26
转自http://www.cnblogs.com/mora1988/p/5715097.html
将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel
添加NPOI的.dll程序集引用,下载自http://npoi.codeplex.com/releases
1.第一种是根据excel文件路径读取excel并返回datatable
/// <summary> /// 将excel文件内容读取到DataTable数据表中 /// </summary> /// <param name="fileName">文件完整路径名</param> /// <param name="sheetName">指定读取excel工作薄sheet的名称</param> /// <param name="isFirstRowColumn">第一行是否是DataTable的列名:true=是,false=否</param> /// <returns>DataTable数据表</returns> public static DataTable ReadExcelToDataTable(string fileName, string sheetName = null, bool isFirstRowColumn = true) { //定义要返回的datatable对象 DataTable data = new DataTable();//datatable格式,里面存放所有的表格的内容,可以直接显示出来 //excel工作表 NPOI.SS.UserModel.ISheet sheet = null; //数据开始行(排除标题行) int startRow = 0; try { if (!File.Exists(fileName)) { return null; } //根据指定路径读取文件 FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); //根据文件流创建excel数据结构 NPOI.SS.UserModel.IWorkbook workbook = NPOI.SS.UserModel.WorkbookFactory.Create(fs); //IWorkbook workbook = new HSSFWorkbook(fs); //如果有指定工作表名称,这里是处理表名,表名可以给定名称 if (!string.IsNullOrEmpty(sheetName)) { sheet = workbook.GetSheet(sheetName); //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet if (sheet == null) { sheet = workbook.GetSheetAt(0); } } else { //如果没有指定的sheetName,则尝试获取第一个sheet sheet = workbook.GetSheetAt(0); } if (sheet != null) { NPOI.SS.UserModel.IRow firstRow = sheet.GetRow(0); //得到表格的第一行 //一行最后一个cell的编号 即总的列数 int cellCount = firstRow.LastCellNum; //读取的表格的最后一列,cellcount为总的列数 //如果第一行是标题列名 if (isFirstRowColumn) { for (int i = firstRow.FirstCellNum; i < cellCount; ++i) { NPOI.SS.UserModel.ICell cell = firstRow.GetCell(i); if (cell != null) { string cellValue = cell.StringCellValue; if (cellValue != null) { DataColumn column = new DataColumn(cellValue);//column是列名,这里读取表格的第一行,依次得到每一列的列名 data.Columns.Add(column);//data中保存列名 } } } startRow = sheet.FirstRowNum + 1;//读取表格的行数开始从第二行开始,第一行是列名 } else { startRow = sheet.FirstRowNum; } //最后一列的标号 int rowCount = sheet.LastRowNum; for (int i = startRow; i <= rowCount; ++i)//每行数据进行处理 { NPOI.SS.UserModel.IRow row = sheet.GetRow(i); if (row == null) continue; //没有数据的行默认是null DataRow dataRow = data.NewRow(); for (int j = row.FirstCellNum; j < cellCount; ++j)//每一列数据进行处理 { if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null dataRow[j] = row.GetCell(j).ToString();//第i行的第j列的元素 } data.Rows.Add(dataRow); } } return data; } catch (Exception ex) { throw ex; } }
2.第二种是将excel文件流读取到datatable中
/// <summary> /// 将文件流读取到DataTable数据表中 /// </summary> /// <param name="fileStream">文件流</param> /// <param name="sheetName">指定读取excel工作薄sheet的名称</param> /// <param name="isFirstRowColumn">第一行是否是DataTable的列名:true=是,false=否</param> /// <returns>DataTable数据表</returns> public static DataTable ReadStreamToDataTable(Stream fileStream, string sheetName = null, bool isFirstRowColumn = true) { //定义要返回的datatable对象 DataTable data = new DataTable(); //excel工作表 Npoi.SS.UserModel.ISheet sheet = null; //数据开始行(排除标题行) int startRow = 0; try { //根据文件流创建excel数据结构,NPOI的工厂类WorkbookFactory会自动识别excel版本,创建出不同的excel数据结构 Npoi.SS.UserModel.IWorkbook workbook = Npoi.SS.UserModel.WorkbookFactory.Create(fileStream); //如果有指定工作表名称 if (!string.IsNullOrEmpty(sheetName)) { sheet = workbook.GetSheet(sheetName); //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet if (sheet == null) { sheet = workbook.GetSheetAt(0); } } else { //如果没有指定的sheetName,则尝试获取第一个sheet sheet = workbook.GetSheetAt(0); } if (sheet != null) { Npoi.SS.UserModel.IRow firstRow = sheet.GetRow(0); //一行最后一个cell的编号 即总的列数 int cellCount = firstRow.LastCellNum; //如果第一行是标题列名 if (isFirstRowColumn) { for (int i = firstRow.FirstCellNum; i < cellCount; ++i) { Npoi.SS.UserModel.ICell cell = firstRow.GetCell(i); if (cell != null) { string cellValue = cell.StringCellValue; if (cellValue != null) { DataColumn column = new DataColumn(cellValue); data.Columns.Add(column); } } } startRow = sheet.FirstRowNum + 1; } else { startRow = sheet.FirstRowNum; } //最后一列的标号 int rowCount = sheet.LastRowNum; for (int i = startRow; i <= rowCount; ++i) { Npoi.SS.UserModel.IRow row = sheet.GetRow(i); if (row == null || row.FirstCellNum < 0) continue; //没有数据的行默认是null DataRow dataRow = data.NewRow(); for (int j = row.FirstCellNum; j < cellCount; ++j) { //同理,没有数据的单元格都默认是null Npoi.SS.UserModel.ICell cell = row.GetCell(j); if (cell != null) { if (cell.CellType == Npoi.SS.UserModel.CellType.Numeric) { //判断是否日期类型 if (Npoi.SS.UserModel.DateUtil.IsCellDateFormatted(cell)) { dataRow[j] = row.GetCell(j).DateCellValue; } else { dataRow[j] = row.GetCell(j).ToString().Trim(); } } else { dataRow[j] = row.GetCell(j).ToString().Trim(); } } } data.Rows.Add(dataRow); } } return data; } catch (Exception ex) { throw ex; } }
阅读全文
0 0
- dataTable和excel的转换
- C#DataTable的使用(将DataTable与csv文件和excel文件)的转换
- DataSet和DataTable转换为excel文件的类,最基本的转换
- excel 与 DataTable 转换
- Excel转换为DataTable
- Excel转换成DataTable DataTable转换成Excel
- 上传Excel转换成DataTable
- Csv-DataTable-Excel格式的相互转换附StopWathch
- "DataTable是System.DataTable和Excel.DataTable 之间的不明确的引用 "问题的解决办法
- “DataTable”是“System.Data.DataTable”和“Microsoft.Office.Interop.Excel.DataTable”之间的不明确的引用
- DataTable 和List之间的转换
- 完整的DataTable和list转换
- datatable 和XML转换
- DataTable和list转换
- Excel和DataTable互操作
- DataTable的行列转换
- DataTable的行列转换
- C#中 dataGridView和DataTable 导出Excel的方法
- 常用 Linux shell & vim 命令
- java 回调机制
- 移动端默认横屏显示
- 使用Java发送邮件
- java面试题总结
- dataTable和excel的转换
- qq能登录outlook可以收发邮件浏览器却无法上网
- 解决UITableViewCell选中状态下UILabel背景消失的问题
- 大数据—史上最全大数据解析
- python2.x中函数在python3.x中的改动方法
- 理财平台架构分析
- 获取android 系统音量
- PhpStorm里怎样配置与GIT关联,在编辑器点击拉取按钮更新
- SharedPreferences存储变量的文件路径