【开发者笔记】解析具有合并单元格的Excel

简介:   最近公司让做各种数据表格的导入导出,就涉及到电子表格的解析,做了这么多天总结一下心得。   工具:NOPI   语言:C#   目的:因为涉及到导入到数据库,具有合并单元格的多行必然要拆分,而NPOI自动解析的时候拆分单元格除第一个单元格外其余值都是空,对于列头有合并项目的,数据库设计一般才有合并单元格下面的最小列单元作为数据库字段。

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

  工具: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         }
复制单元格

下面是效果图:

 

 

 

    

黑夜给了我黑色的眼睛,我却用它寻找光明
目录
相关文章
|
1月前
|
安全 Java 数据库连接
jdbc解析excel文件,批量插入数据至库中
jdbc解析excel文件,批量插入数据至库中
21 0
|
1月前
|
前端开发 UED
前端解析Excel文件
前端解析Excel文件
33 0
|
2月前
|
小程序 开发者
4月开发者日回顾丨小程序开发常见问题解析
4月开发者日回顾丨小程序开发常见问题解析
66 0
|
3月前
|
Dart 数据安全/隐私保护
Dart笔记:Dart 语言中的存取器及其用法解析
Dart笔记:Dart 语言中的存取器及其用法解析
51 0
|
2月前
|
缓存 网络协议 算法
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析
《跟闪电侠学Netty》阅读笔记 - Netty入门程序解析
134 0
|
1月前
|
安全 Java 数据库连接
jdbc实现批量给多个表中更新数据(解析Excel表数据插入到数据库中)
jdbc实现批量给多个表中更新数据(解析Excel表数据插入到数据库中)
154 0
|
1月前
|
存储 数据处理 数据格式
Python中导入Excel数据:全面解析与实践
Python中导入Excel数据:全面解析与实践
41 0
|
2月前
|
数据采集 安全 API
如何实时获取小红书笔记详情的API使用与解析
小红书是一个以分享消费经验、生活方式为主的社交平台,拥有大量的用户和内容。为了更好地了解用户在小红书上的行为和内容,许多开发者选择使用小红书开放平台提供的API接口。本文将介绍如何通过小红书笔记详情API实现实时数据获取,并给出相应的代码示例。
|
6天前
yolo-world 源码解析(六)(2)
yolo-world 源码解析(六)
16 0
|
6天前
yolo-world 源码解析(六)(1)
yolo-world 源码解析(六)
8 0

推荐镜像

更多