最近公司让做各种数据表格的导入导出,就涉及到电子表格的解析,做了这么多天总结一下心得。

  工具:NOPI

  语言:C#

  目的:因为涉及到导入到数据库,具有合并单元格的多行必然要拆分,而NPOI自动解析的时候拆分单元格除第一个单元格外其余值都是空,对于列头有合并项目的,数据库设计一般才有合并单元格下面的最小列单元作为数据库字段。于是希望达到这样一个效果。于是有了一个思路就是把读入的Excel复制到新建的Excel,然后再去读新的Excel。总体思路就是把合并单元格所包含的所有最小单元格的值都设置成合并单元格的值。达到如图这样一个效果:

  左边是需要解析的单元格,右边是复制之后的单元格,可以看出右边的单元格解析是很简单的。如果需求合适,那么目的就达到了……好了,下面贴代码。

  1. /// <summary>
  2. /// 复制电子表格,达到拆分单元格的目的
  3. /// </summary>
  4. /// <returns></returns>
  5. public IWorkbook AnalyseExcel(IWorkbook book)
  6. {
  7. /*用于存复制之后的电子表格*/
  8. IWorkbook result = null;
  9. /*判断传入的格式,返回同类的格式*/
  10. if (book == null)
  11. {
  12. return null;
  13. }
  14. else if (book is HSSFWorkbook)
  15. {
  16. result = new HSSFWorkbook();//.xls
  17. }
  18. else if (book is XSSFWorkbook)
  19. {
  20. result = new XSSFWorkbook();//.xlsx
  21. }
  22. else//其他文件类型,不支持
  23. {
  24. return null;
  25. }
  26. for (int index = ; index < book.NumberOfSheets;index++ )//遍历所有sheet
  27. {
  28. ISheet sheet = book.GetSheetAt(index);
  29. ISheet sheet1 = result.CreateSheet(sheet.SheetName);
  30. int rows = sheet.PhysicalNumberOfRows;
  31. /*先复制所有数据*/
  32. for (int j = ; j < rows; j++)
  33. {
  34. IRow row = sheet.GetRow(j);
  35. IRow row1 = sheet1.CreateRow(j);
  36. List<ICell> cells = row.Cells;
  37. for (int k = ; k < cells.Count; k++)
  38. {
  39. row1.CreateCell(k).SetCellValue(cells[k].ToString());
  40. }
  41. }
  42.  
  43. /*拆分已合并单元格,并给余下单元格赋值*/
  44. for (int j = ; j < sheet.NumMergedRegions; j++)
  45. {
  46. var cellRange = sheet.GetMergedRegion(j);//获取第i个合并单元格
  47. int rowStart = cellRange.FirstRow;//获取该合并单元格起始行
  48. int colStart = cellRange.FirstColumn;//获取该合并单元格起始列
  49. int rowEnd = cellRange.LastRow;//获取该合并单元格终止行
  50. int colEnd = cellRange.LastColumn;//获取该合并单元格终止列
  51. string data = sheet.GetRow(rowStart).GetCell(colStart).ToString();//获取该合并单元格值
  52. for (int m = rowStart; m <= rowEnd; m++)//遍历该合并单元格所包含的所有单元格
  53. {
  54. IRow row = null;
  55. for (int n = colStart; n <= colEnd; n++)
  56. {
  57. try
  58. {
  59. sheet1.GetRow(m).GetCell(n).SetCellValue(data);//中间部分可能存在空行,如果是空行则捕获异常,创建该行即可
  60. }
  61. catch (Exception e)
  62. {
  63. if (row == null)
  64. {
  65. row = sheet1.CreateRow(m);
  66. }
  67. sheet1.GetRow(m).GetCell(n).SetCellValue(data);//创建行并设单元格的值
  68. }
  69.  
  70. }
  71. }
  72. }
  73. }
  74. return result;
  75. }

复制单元格

下面是效果图:

    

【开发者笔记】解析具有合并单元格的Excel的更多相关文章

  1. 【记录】解析具有合并单元格的Excel

    最近公司让做各种数据表格的导入导出,就涉及到电子表格的解析,做了这么多天总结一下心得. 工具:NOPI 语言:C# 目的:因为涉及到导入到数据库,具有合并单元格的多行必然要拆分,而NPOI自动解析的时 ...

  2. Java Controller下兼容xls和xlsx且可识别合并单元格的excel导入功能

    1.工具类,读取单元格数据的时候,如果当前单元格是合并单元格,会自动读取合并单元格的值 package com.shjh.core.util; import java.io.IOException; ...

  3. java导出标题多行且合并单元格的EXCEL

    场景:项目中遇到有需要导出Excel的需求,并且是多行标题且有合并单元格的,参考网上的文章,加上自己的理解,封装成了可自由扩展的导出工具 先上效果,再贴代码: 调用工具类进行导出: public st ...

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

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

  5. (二)数据源处理3-python处理包含合并单元格的excel

    分析:

  6. NPOI操作EXCEL(五)——含合并单元格复杂表头的EXCEL解析

    我们在第三篇文章中谈到了那些非常反人类的excel模板,博主为了养家糊口,也玩命做出了相应的解析方法... 我们先来看看第一类复杂表头: ...... 博主称这类excel模板为略复杂表头模板(蓝色部 ...

  7. POI导入具有合并了单元格的Excel

    POI进行单行单行地导入的数据在网上有许多的文章,但是要导入一个具有合并单元格的excel貌似比较难找.刚好最近完成了这样的一个需求,要求导入具有合并单元格的excel: /** * 读取excel数 ...

  8. 让我头疼一下午的Excel合并单元格

    Excel导出常见问题 excel导出其实不算什么难事 在网上copy下模板代码,填充自己的业务数据,提供一个http接口基本就可以得到你要导出的数据了. 但是,凡事都有例外,截止今天,excel导出 ...

  9. vue-element-table-js去重合并单元格解析【实战需求】

    有数据如下: { '2019-01-23': [ { 'channel': 'zp', 'listScanListNum': 24, 'listParseOkNum': 0, 'listPersonM ...

随机推荐

  1. EMC、Pure和NetApp推新品,NAS闪存场景在哪里

    Hardy 架构师技术联盟 All Flash/SSD存储的趋势势不可挡,未来在NAS服务上也是如此,眼下已经有非常多家初创厂商支持全SSD的NAS存储服务,包含EMC Isilion也推出了全闪存节 ...

  2. datagrid.celltips.js

    /** * Created with JetBrains WebStorm. * User: cao.guanghui * Date: 13-6-26 * Time: 下午11:27 * To cha ...

  3. 如何实现Asp与Asp.Net共享Session

    <iframe align="top" marginwidth="0" marginheight="0" src="http ...

  4. C++ 指针引用

    //指针引用 #include<iostream> using namespace std; struct Teacher{ ]; int age; }; int InitA(Teache ...

  5. php -- 魔术方法 之 获取属性:__get()

    属性重载:当访问一个不存在或者权限不够的属性的时候,能够触发一系列的魔术方法,就叫做属性重载 __get():获取不存在或者权限不够的属性的时候会自动触发 <?php header('Conte ...

  6. gitolite 服务器搭建

    网上大牛都说的是安装gitolite要建git用户,我看完全没必要,毕竟用户拿到私钥也未必能登录服务器吧...下面我们就用root用户来安装gitolite,并且配置版本库文件保存路径.. 1. gi ...

  7. hdu 2528:Area(计算几何,求线段与直线交点 + 求多边形面积)

    Area Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. 在ASP.NET MVC 3 中自定义AuthorizeAttribute时需要注意的页面缓存问题

    一.ASP.NET MVC中使用OutputCache实现服务器端页面级缓存 在ASP.NET MVC中,假如我们想要将某个页面(即某个Action)缓存在服务器端,可以在Action上标上以下特性: ...

  9. 在Hyper-V Linux VM如何选择LIS Linux集成服务

    导读 很多工程师都知道,如果你选择在 Hyper-V 中运行 Linux guest VM,要获得最好的使用体验,必需针对你所使用的 Linux 发行版和使用场景选择 Linux Integratio ...

  10. 匿名(无账号密码)从ftp服务器下载文件

    public static String downFile(String ip,String ftpFileName,String savePath,String fileName) { FTPCli ...