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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 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         }
复制单元格

下面是效果图:

 

 

 

    

黑夜给了我黑色的眼睛,我却用它寻找光明
目录
相关文章
|
29天前
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
|
3月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
444 37
|
2月前
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
215 16
|
2月前
|
前端开发 JavaScript
💥【exceljs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。
337 5
|
3月前
|
弹性计算 自然语言处理 数据可视化
http数据包抓包解析课程笔记
http数据包抓包解析课程笔记
|
3月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
3月前
|
监控 算法 数据可视化
深入解析Android应用开发中的高效内存管理策略在移动应用开发领域,Android平台因其开放性和灵活性备受开发者青睐。然而,随之而来的是内存管理的复杂性,这对开发者提出了更高的要求。高效的内存管理不仅能够提升应用的性能,还能有效避免因内存泄漏导致的应用崩溃。本文将探讨Android应用开发中的内存管理问题,并提供一系列实用的优化策略,帮助开发者打造更稳定、更高效的应用。
在Android开发中,内存管理是一个绕不开的话题。良好的内存管理机制不仅可以提高应用的运行效率,还能有效预防内存泄漏和过度消耗,从而延长电池寿命并提升用户体验。本文从Android内存管理的基本原理出发,详细讨论了几种常见的内存管理技巧,包括内存泄漏的检测与修复、内存分配与回收的优化方法,以及如何通过合理的编程习惯减少内存开销。通过对这些内容的阐述,旨在为Android开发者提供一套系统化的内存优化指南,助力开发出更加流畅稳定的应用。
76 0
|
4月前
|
C# 开发者 UED
WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
91 0
|
4月前
|
C# 数据可视化 开发者
WPF开发者福音:深度解析OxyPlot与LiveCharts图表库,轻松实现数据可视化不再是难题!
【8月更文挑战第31天】在WPF应用中,数据可视化对提升用户体验至关重要。本文介绍并演示了两种流行图表库OxyPlot和LiveCharts的集成与使用方法。OxyPlot是一款适用于.NET应用的开源图表库,提供多种图表类型,易于集成。LiveCharts则以其丰富的图表类型和动画效果,特别适合实时数据展示。通过具体代码示例,本文展示了如何利用这两种图表库创建折线图和柱状图,并详细说明了安装和配置步骤。希望本文能帮助开发者在WPF应用中轻松实现高效、美观的数据可视化。
212 0

推荐镜像

更多