项目中经常会遇到Excel导入数据,Excel的模板会可能是存在合并单元格的,模板如下图所示

读取时需要填充合并单元格的值,转成datatable单元格值时,填充合并单元格的值,如下图所示:

合并单元格的值填充,这种格式的datatable使用SqlBulkCopy批量导入更为方便

Excel转datatable方法代码:

  1. /// <summary>
  2. /// Excel转DataTable
  3. /// </summary>
  4. /// <param name="filePath">excel文件路径</param>
  5. /// <returns></returns>
  6. public static DataTable ExcelToDataTable(string filePath)
  7. {
  8. DataTable dt = new DataTable();
  9. using (FileStream fsRead = System.IO.File.OpenRead(filePath))
  10. {
  11. IWorkbook wk = null;
  12. //获取后缀名
  13. string extension = filePath.Substring(filePath.LastIndexOf(".")).ToString().ToLower();
  14. //判断是否是excel文件
  15. if (extension == ".xlsx" || extension == ".xls")
  16. {
  17. //判断excel的版本
  18. if (extension == ".xlsx")
  19. {
  20. wk = new XSSFWorkbook(fsRead);
  21. }
  22. else
  23. {
  24. wk = new HSSFWorkbook(fsRead);
  25. }
  26.  
  27. //获取第一个sheet
  28. ISheet sheet = wk.GetSheetAt();
  29. //获取第一行
  30. IRow headrow = sheet.GetRow();
  31. //创建列
  32. for (int i = headrow.FirstCellNum; i < headrow.Cells.Count; i++)
  33. {
  34. ICell cell = headrow.GetCell(i);
  35. dt.Columns.Add(cell.ToString());
  36. }
  37. //读取每行,从第二行起
  38. for (int r = ; r <= sheet.LastRowNum; r++)
  39. {
  40. bool result = false;
  41. DataRow dr = dt.NewRow();
  42. //获取当前行
  43. IRow row = sheet.GetRow(r);
  44.  
  45. //读取每列
  46. for (int j = ; j < row.Cells.Count; j++)
  47. {
  48. ICell cell = row.GetCell(j); //一个单元格
  49.  
  50. if (cell.IsMergedCell && r>) //检测列的单元格是否合并
  51. {
  52. dr[j] = dt.Rows[r-][j];
  53. }
  54. else
  55. {
  56. dr[j] = GetCellValue(cell); //获取单元格的值
  57.  
  58. if (string.IsNullOrWhiteSpace(dr[j].ToString()) && j>)
  59. {
  60. dr[j] = dr[j - ];
  61. }
  62. }
  63.  
  64. if (dr[j].ToString() != "")//全为空则不取
  65. {
  66. result = true;
  67. }
  68. }
  69. if (result == true)
  70. {
  71. dt.Rows.Add(dr); //把每行追加到DataTable
  72. }
  73. }
  74. }
  75.  
  76. }
  77. return dt;
  78. }
  79.  
  80. #region 对单元格进行判断取值
  81. /// <summary>
  82. /// 对单元格进行判断取值
  83. /// </summary>
  84. /// <param name="cell"></param>
  85. /// <returns></returns>
  86. private static string GetCellValue(ICell cell)
  87. {
  88. if (cell == null)
  89. return string.Empty;
  90. switch (cell.CellType)
  91. {
  92. case CellType.Blank: //空数据类型 这里类型注意一下,不同版本NPOI大小写可能不一样,有的版本是Blank(首字母大写)
  93. return string.Empty;
  94. case CellType.Boolean: //bool类型
  95. return cell.BooleanCellValue.ToString();
  96. case CellType.Error:
  97. return cell.ErrorCellValue.ToString();
  98. case CellType.Numeric: //数字类型
  99. if (HSSFDateUtil.IsCellDateFormatted(cell))//日期类型
  100. {
  101. return cell.DateCellValue.ToString();
  102. }
  103. else //其它数字
  104. {
  105. return cell.NumericCellValue.ToString();
  106. }
  107. case CellType.Unknown: //无法识别类型
  108. default: //默认类型
  109. return cell.ToString();//
  110. case CellType.String: //string 类型
  111. {
  112. if (cell.IsMergedCell)
  113. {
  114.  
  115. }
  116. return cell.StringCellValue;
  117. }
  118.  
  119. case CellType.Formula: //带公式类型
  120. try
  121. {
  122. HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(cell.Sheet.Workbook);
  123. e.EvaluateInCell(cell);
  124. return cell.ToString();
  125. }
  126. catch
  127. {
  128. return cell.NumericCellValue.ToString();
  129. }
  130. }
  131. }
  132. #endregion

demo下载链接: https://pan.baidu.com/s/19xjsljfWe_ezffmjKDSwVg 提取码: udgh

.net读取Excel转datatable、.net读取的Excel存在合并单元格并且转成datatable的更多相关文章

  1. 在Asp.Net MVC中使用NPOI插件实现对Excel的操作(导入,导出,合并单元格,设置样式,输入公式)

    前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Ex ...

  2. 个人永久性免费-Excel催化剂功能第52波-相同内容批量合并单元格,取消合并单元格并填充内容

    在高级Excel用户群体中无比痛恨的合并单元格,在现实的表格中却阴魂不散的纠缠不断.今天Excel催化剂也来成为“帮凶”,制造更多的合并单元格.虽然开发出此功能,请使用过程中务必要保持节制,在可以称为 ...

  3. C# 如何使用NPOI操作Excel以及读取合并单元格等

    C#操作Excel方法有很多,以前用的需要电脑安装office才能用,但因为版权问题公司不允许安装office.所以改用NPOI进行Excel操作,基本上一些简单的Excel操作都没有问题,读写合并单 ...

  4. python 利用三方的xlrd模块读取excel文件,处理合并单元格

      目的: python能使用xlrd模块实现对Excel数据的读取,且按照想要的输出形式.  总体思路: (1)要想实现对Excel数据的读取,需要用到第三方应用,直接应用. (2)实际操作时候和我 ...

  5. python-利用xlrd模块中读取有合并单元格的excel数据

    前言 对于excel中有合并单元格的情况,合并的单元格只能取到第一个单元格的值,合并的单元格后面的单元格内容的值为空,针对这个情况,写了下面一段代码实现, 对单元格进行判断,如果是传入的索引是合并单元 ...

  6. python-Excel读取-合并单元格读取

    python-Excel读取-合并单元格读取(后续会补充python-Excel写入的部分) 1. python读取Excel单元格 代码包含读取Excel中数据,以及出现横向合并单元格,以及竖向合并 ...

  7. poi读取合并单元格

    poi读取合并单元格 学习了:http://blog.csdn.net/ycb1689/article/details/9764191 进行了列合并单元格的修正:原来是我自己找错了地方: import ...

  8. 带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel

    步骤: 一.前台JS取HtmlTable数据,根据设定的分隔符把数据拼接起来 <!--导出Excel--> <script type="text/javascript&qu ...

  9. Excel催化剂开源第14波-VSTO开发之单元格区域转DataTable

    在Excel开发过程中,大部分时候是和Range单元格区域打交道,在VBA开发中,大家都知道的一点是,不能动不动就去遍历所有单元格,那性能是非常糟糕的,很多时候,是需要把整个单元格区域装入数组中再作处 ...

随机推荐

  1. Python标准库12 数学与随机数

    想用高斯分布生成随机数,在网上看到很强大的总结,保留一下,以备后用 https://www.cnblogs.com/vamei/archive/2012/10/26/2741702.html

  2. D3

    D3.js是一个JavaScript库,它可以通过数据来操作文档.D3可以通过使用HTML.SVG和CSS把数据鲜活形象地展现出来.D3严格遵循Web标准,因而可以让你的程序轻松兼容现代主流浏览器并避 ...

  3. css-div翻转动画

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  4. 160多个android开源码汇总

    第一部分 个性化控件(View) 主要介绍那些不错个性化的View,包含ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Pro ...

  5. codeforces 13EE. Holes(分块&amp;动态树)

    E. Holes time limit per test 1 second memory limit per test 64 megabytes input standard input output ...

  6. git强制修改注释

    在一些公司项目中,常常要求git注释提交的时候加上前缀,比如JIRA号,但是有的时候我们常常会忘了 如果用source tree等一些工具,会推送到本地仓库一半,但远程又上不去. 这个时候我们就需要强 ...

  7. 终端下将 man 命令的结果输出到文件保存

    终端下将 man 命令的结果输出到文件保存 在linux或mac下,当我们使用man命令查看某一个命令的详细帮助说明信息时: 可能终端的显示效果不是那么方便: 那么我们可以将man命令的结果输出到tx ...

  8. yarn upgrade

    更新一个依赖 yarn upgrade 用于更新包到基于规范范围的最新版本 yarn upgrade --latest # 忽略版本规则,升级到最新版本,并且更新 package.json .

  9. iOS如何在应用中添加图标更换功能

    一.在info.plist中设置图标信息 首先将需要更换的图标按照下面的方式声明,以便我们能够正常调用文件和方法.注意,每个图标的图标名称和对应的文件名要一一对应. 二.在工程根目录下添加图标文件 图 ...

  10. Linux Shell 运算符

    Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 逻辑运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 ...