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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介:   最近公司让做各种数据表格的导入导出,就涉及到电子表格的解析,做了这么多天总结一下心得。   工具: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         }
复制单元格

下面是效果图:

 

 

 

    

黑夜给了我黑色的眼睛,我却用它寻找光明
目录
相关文章
|
2月前
|
Python
使用OpenPyXL库实现Excel单元格其他对齐方式设置
本文介绍了如何使用Python的`openpyxl`库设置Excel单元格中的文本对齐方式,包括文本旋转、换行、自动调整大小和缩进等,通过具体示例代码展示了每种对齐方式的应用方法,适合需要频繁操作Excel文件的用户学习参考。
180 85
使用OpenPyXL库实现Excel单元格其他对齐方式设置
|
2月前
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
135 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
3月前
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
|
3月前
|
安全 Java Linux
深入解析Android系统架构及其对开发者的意义####
【10月更文挑战第21天】 本文旨在为读者揭开Android操作系统架构的神秘面纱,探讨其如何塑造现代移动应用开发格局。通过剖析Linux内核、硬件抽象层、运行时环境及应用程序框架等关键组件,揭示Android平台的强大功能与灵活性。文章强调了理解Android架构对于开发者优化应用性能、提升用户体验的重要性,并展望了未来技术趋势下Android的发展方向。 ####
72 0
|
5月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
521 37
|
4月前
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
297 16
|
4月前
|
前端开发 JavaScript
💥【exceljs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。
582 5
|
5月前
|
弹性计算 自然语言处理 数据可视化
http数据包抓包解析课程笔记
http数据包抓包解析课程笔记
|
5月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。

推荐镜像

更多