.net读取Excel转datatable、.net读取的Excel存在合并单元格并且转成datatable
项目中经常会遇到Excel导入数据,Excel的模板会可能是存在合并单元格的,模板如下图所示
读取时需要填充合并单元格的值,转成datatable单元格值时,填充合并单元格的值,如下图所示:
合并单元格的值填充,这种格式的datatable使用SqlBulkCopy批量导入更为方便
Excel转datatable方法代码:
- /// <summary>
- /// Excel转DataTable
- /// </summary>
- /// <param name="filePath">excel文件路径</param>
- /// <returns></returns>
- public static DataTable ExcelToDataTable(string filePath)
- {
- DataTable dt = new DataTable();
- using (FileStream fsRead = System.IO.File.OpenRead(filePath))
- {
- IWorkbook wk = null;
- //获取后缀名
- string extension = filePath.Substring(filePath.LastIndexOf(".")).ToString().ToLower();
- //判断是否是excel文件
- if (extension == ".xlsx" || extension == ".xls")
- {
- //判断excel的版本
- if (extension == ".xlsx")
- {
- wk = new XSSFWorkbook(fsRead);
- }
- else
- {
- wk = new HSSFWorkbook(fsRead);
- }
- //获取第一个sheet
- ISheet sheet = wk.GetSheetAt();
- //获取第一行
- IRow headrow = sheet.GetRow();
- //创建列
- for (int i = headrow.FirstCellNum; i < headrow.Cells.Count; i++)
- {
- ICell cell = headrow.GetCell(i);
- dt.Columns.Add(cell.ToString());
- }
- //读取每行,从第二行起
- for (int r = ; r <= sheet.LastRowNum; r++)
- {
- bool result = false;
- DataRow dr = dt.NewRow();
- //获取当前行
- IRow row = sheet.GetRow(r);
- //读取每列
- for (int j = ; j < row.Cells.Count; j++)
- {
- ICell cell = row.GetCell(j); //一个单元格
- if (cell.IsMergedCell && r>) //检测列的单元格是否合并
- {
- dr[j] = dt.Rows[r-][j];
- }
- else
- {
- dr[j] = GetCellValue(cell); //获取单元格的值
- if (string.IsNullOrWhiteSpace(dr[j].ToString()) && j>)
- {
- dr[j] = dr[j - ];
- }
- }
- if (dr[j].ToString() != "")//全为空则不取
- {
- result = true;
- }
- }
- if (result == true)
- {
- dt.Rows.Add(dr); //把每行追加到DataTable
- }
- }
- }
- }
- return dt;
- }
- #region 对单元格进行判断取值
- /// <summary>
- /// 对单元格进行判断取值
- /// </summary>
- /// <param name="cell"></param>
- /// <returns></returns>
- private static string GetCellValue(ICell cell)
- {
- if (cell == null)
- return string.Empty;
- switch (cell.CellType)
- {
- case CellType.Blank: //空数据类型 这里类型注意一下,不同版本NPOI大小写可能不一样,有的版本是Blank(首字母大写)
- return string.Empty;
- case CellType.Boolean: //bool类型
- return cell.BooleanCellValue.ToString();
- case CellType.Error:
- return cell.ErrorCellValue.ToString();
- case CellType.Numeric: //数字类型
- if (HSSFDateUtil.IsCellDateFormatted(cell))//日期类型
- {
- return cell.DateCellValue.ToString();
- }
- else //其它数字
- {
- return cell.NumericCellValue.ToString();
- }
- case CellType.Unknown: //无法识别类型
- default: //默认类型
- return cell.ToString();//
- case CellType.String: //string 类型
- {
- if (cell.IsMergedCell)
- {
- }
- return cell.StringCellValue;
- }
- case CellType.Formula: //带公式类型
- try
- {
- HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
- e.EvaluateInCell(cell);
- return cell.ToString();
- }
- catch
- {
- return cell.NumericCellValue.ToString();
- }
- }
- }
- #endregion
demo下载链接: https://pan.baidu.com/s/19xjsljfWe_ezffmjKDSwVg 提取码: udgh
.net读取Excel转datatable、.net读取的Excel存在合并单元格并且转成datatable的更多相关文章
- 在Asp.Net MVC中使用NPOI插件实现对Excel的操作(导入,导出,合并单元格,设置样式,输入公式)
前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Ex ...
- 个人永久性免费-Excel催化剂功能第52波-相同内容批量合并单元格,取消合并单元格并填充内容
在高级Excel用户群体中无比痛恨的合并单元格,在现实的表格中却阴魂不散的纠缠不断.今天Excel催化剂也来成为“帮凶”,制造更多的合并单元格.虽然开发出此功能,请使用过程中务必要保持节制,在可以称为 ...
- C# 如何使用NPOI操作Excel以及读取合并单元格等
C#操作Excel方法有很多,以前用的需要电脑安装office才能用,但因为版权问题公司不允许安装office.所以改用NPOI进行Excel操作,基本上一些简单的Excel操作都没有问题,读写合并单 ...
- python 利用三方的xlrd模块读取excel文件,处理合并单元格
目的: python能使用xlrd模块实现对Excel数据的读取,且按照想要的输出形式. 总体思路: (1)要想实现对Excel数据的读取,需要用到第三方应用,直接应用. (2)实际操作时候和我 ...
- python-利用xlrd模块中读取有合并单元格的excel数据
前言 对于excel中有合并单元格的情况,合并的单元格只能取到第一个单元格的值,合并的单元格后面的单元格内容的值为空,针对这个情况,写了下面一段代码实现, 对单元格进行判断,如果是传入的索引是合并单元 ...
- python-Excel读取-合并单元格读取
python-Excel读取-合并单元格读取(后续会补充python-Excel写入的部分) 1. python读取Excel单元格 代码包含读取Excel中数据,以及出现横向合并单元格,以及竖向合并 ...
- poi读取合并单元格
poi读取合并单元格 学习了:http://blog.csdn.net/ycb1689/article/details/9764191 进行了列合并单元格的修正:原来是我自己找错了地方: import ...
- 带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel
步骤: 一.前台JS取HtmlTable数据,根据设定的分隔符把数据拼接起来 <!--导出Excel--> <script type="text/javascript&qu ...
- Excel催化剂开源第14波-VSTO开发之单元格区域转DataTable
在Excel开发过程中,大部分时候是和Range单元格区域打交道,在VBA开发中,大家都知道的一点是,不能动不动就去遍历所有单元格,那性能是非常糟糕的,很多时候,是需要把整个单元格区域装入数组中再作处 ...
随机推荐
- Python标准库12 数学与随机数
想用高斯分布生成随机数,在网上看到很强大的总结,保留一下,以备后用 https://www.cnblogs.com/vamei/archive/2012/10/26/2741702.html
- D3
D3.js是一个JavaScript库,它可以通过数据来操作文档.D3可以通过使用HTML.SVG和CSS把数据鲜活形象地展现出来.D3严格遵循Web标准,因而可以让你的程序轻松兼容现代主流浏览器并避 ...
- css-div翻转动画
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...
- 160多个android开源码汇总
第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包含ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...
- codeforces 13EE. Holes(分块&动态树)
E. Holes time limit per test 1 second memory limit per test 64 megabytes input standard input output ...
- git强制修改注释
在一些公司项目中,常常要求git注释提交的时候加上前缀,比如JIRA号,但是有的时候我们常常会忘了 如果用source tree等一些工具,会推送到本地仓库一半,但远程又上不去. 这个时候我们就需要强 ...
- 终端下将 man 命令的结果输出到文件保存
终端下将 man 命令的结果输出到文件保存 在linux或mac下,当我们使用man命令查看某一个命令的详细帮助说明信息时: 可能终端的显示效果不是那么方便: 那么我们可以将man命令的结果输出到tx ...
- yarn upgrade
更新一个依赖 yarn upgrade 用于更新包到基于规范范围的最新版本 yarn upgrade --latest # 忽略版本规则,升级到最新版本,并且更新 package.json .
- iOS如何在应用中添加图标更换功能
一.在info.plist中设置图标信息 首先将需要更换的图标按照下面的方式声明,以便我们能够正常调用文件和方法.注意,每个图标的图标名称和对应的文件名要一一对应. 二.在工程根目录下添加图标文件 图 ...
- Linux Shell 运算符
Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 逻辑运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 ...