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

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

  工具: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 = 0; 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 = 0; 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 = 0; k < cells.Count; k++)
38                     {
39                         row1.CreateCell(k).SetCellValue(cells[k].ToString());
40                     }
41                 }
42
43                 /*拆分已合并单元格,并给余下单元格赋值*/
44                 for (int j = 0; 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         }

复制单元格

下面是效果图:

    

时间: 2024-10-26 09:04:23

【记录】解析具有合并单元格的Excel的相关文章

Java poi导入excel(合并单元格的excel)(转)

poi导入excel代码示例 原文地址:https://mbd.baidu.com/newspage/data/landingshare?pageType=1&isBdboxFrom=1&context=%7B%22nid%22%3A%22news_9588929214493290157%22%2C%22sourceFrom%22%3A%22bjh%22%7D 原文地址:https://www.cnblogs.com/zbq6/p/12501683.html

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

我们在第三篇文章中谈到了那些非常反人类的excel模板,博主为了养家糊口,也玩命做出了相应的解析方法... 我们先来看看第一类复杂表头: ...... 博主称这类excel模板为略复杂表头模板(蓝色部分为表头部分,蓝色前面几行是博主项目的基础样式,称为元数据),这类excel的表头多为2-3行,甚至于5/6行 ,具有合并层级关系,看似复杂,但只需要在我们以前的基础上稍微做一下重构就可以完美实现解析. 我们以各地区户籍人口城乡构成表头为例: 其实,只要我们能准确解析这类表头所表达的意思,就能复用以

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

Excel导出常见问题 excel导出其实不算什么难事 在网上copy下模板代码,填充自己的业务数据,提供一个http接口基本就可以得到你要导出的数据了. 但是,凡事都有例外,截止今天,excel导出我遇到的主要是两大类问题 1.大数据量的excel数据,比如几十万条甚至更多的数据导出 2.因为excel中内容的问题,导致导出后的excel不能直接打开,报错"由于一些内容不可取,Excel无法打开xxx.xlsx.是否要打开并修复此工作簿?" 针对第一种大数据量问题,我遇到的主要问题是

NPOI之Excel——合并单元格、设置样式、输入公式

首先建立一个空白的工作簿用作测试,并在其中建立空白工作表,在表中建立空白行,在行中建立单元格,并填入内容: //建立空白工作簿 IWorkbook workbook = new HSSFWorkbook(); //在工作簿中:建立空白工作表 ISheet sheet = workbook.CreateSheet(); //在工作表中:建立行,参数为行号,从0计 IRow row = sheet.CreateRow(0); //在行中:建立单元格,参数为列号,从0计 ICell cell = ro

poi导出Excel报表多表头双层表头、合并单元格

效果图: controller层方法: /**     *      * 导出Excel报表     * @param request     * @return     *      */    @RequestMapping("/export")    @ResponseBody    public void export(HttpServletRequest request,            HttpServletResponse response, String year

excel 合并 单元格内容

刚刚有人问怎么合并单元格内容,正好excel 我也不会,顺便查查记录一下 1.假设有两个单元格如下:           单元格1 单元格2           2. 在一个空白单元格输入 =( 这代表一个公式的开头. 如下:           =(             3. 在第二步输入完成后用鼠标点击单元格1, 这时候 = ( 后面会出现第一个单元格的坐标. 紧接着你输入 &" "& , 注意双引号中间有空格. 然后再点击单元格2, 这时候单元格2的坐标也输入

[办公应用]如何将excel合并单元格分拆后每个单元格上仍保留数据?

合并单元格虽然美观,但是无法进行排序.筛选等操作. 只有合并单元格拆分后才可以按常规进行统计.但是普通拆分后,excel仅保留合并单元格数据到区域左上角的单元格. 解决方案:选定多个合并单元格,应用本宏即可每个单元格均保留数据:Sub 拆分() Dim c As Range For Each c In ActiveSheet.UsedRange.Cells If c.MergeCells Then c.Select c.UnMerge Selection.Value = c.Value End

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

步骤: 一.前台JS取HtmlTable数据,根据设定的分隔符把数据拼接起来 <!--导出Excel--> <script type="text/javascript"> //导出Excel function exportExcel() { var data = ""; $("#divRptTable").find("table").find("tr").each(function

【转】C# DataTable 导出 Excel 进阶 多行表头、合并单元格、中文文件名乱码

本文原创地址:http://blog.csdn.net/ranbolwb/article/details/8083983 ,转载请保留本行. 本例子是上一篇 DataTable 导出 Excel 的进阶,除了上一篇提到的处理乱码问题,本例还添加了处理多行表头.合并单元格的功能及处理中文文件名乱码问题,应该可以满足日常开发的需要了. 废话不多说了,直接上代码: [C#] 可以写单独类 1 using System; 2 using System.Collections.Generic; 3 usi