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

  工具:NOPI

  语言:C#

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

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

  /// <summary>
/// 复制电子表格,达到拆分单元格的目的
/// </summary>
/// <returns></returns>
public IWorkbook AnalyseExcel(IWorkbook book)
{
/*用于存复制之后的电子表格*/
IWorkbook result = null;
/*判断传入的格式,返回同类的格式*/
if (book == null)
{
return null;
}
else if (book is HSSFWorkbook)
{
result = new HSSFWorkbook();//.xls
}
else if (book is XSSFWorkbook)
{
result = new XSSFWorkbook();//.xlsx
}
else//其他文件类型,不支持
{
return null;
}
for (int index = ; index < book.NumberOfSheets;index++ )//遍历所有sheet
{
ISheet sheet = book.GetSheetAt(index);
ISheet sheet1 = result.CreateSheet(sheet.SheetName);
int rows = sheet.PhysicalNumberOfRows;
/*先复制所有数据*/
for (int j = ; j < rows; j++)
{
IRow row = sheet.GetRow(j);
IRow row1 = sheet1.CreateRow(j);
List<ICell> cells = row.Cells;
for (int k = ; k < cells.Count; k++)
{
row1.CreateCell(k).SetCellValue(cells[k].ToString());
}
} /*拆分已合并单元格,并给余下单元格赋值*/
for (int j = ; j < sheet.NumMergedRegions; j++)
{
var cellRange = sheet.GetMergedRegion(j);//获取第i个合并单元格
int rowStart = cellRange.FirstRow;//获取该合并单元格起始行
int colStart = cellRange.FirstColumn;//获取该合并单元格起始列
int rowEnd = cellRange.LastRow;//获取该合并单元格终止行
int colEnd = cellRange.LastColumn;//获取该合并单元格终止列
string data = sheet.GetRow(rowStart).GetCell(colStart).ToString();//获取该合并单元格值
for (int m = rowStart; m <= rowEnd; m++)//遍历该合并单元格所包含的所有单元格
{
IRow row = null;
for (int n = colStart; n <= colEnd; n++)
{
try
{
sheet1.GetRow(m).GetCell(n).SetCellValue(data);//中间部分可能存在空行,如果是空行则捕获异常,创建该行即可
}
catch (Exception e)
{
if (row == null)
{
row = sheet1.CreateRow(m);
}
sheet1.GetRow(m).GetCell(n).SetCellValue(data);//创建行并设单元格的值
} }
}
}
}
return result;
}

复制单元格

下面是效果图:

    

【记录】解析具有合并单元格的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. 让我头疼一下午的Excel合并单元格

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

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

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

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

    效果图: controller层方法: /**     *      * 导出Excel报表     * @param request     * @return     *      */    @ ...

随机推荐

  1. 第七届蓝桥杯javaB组真题解析-凑算式(第三题)

    题目 /* 凑算式 B DEF A + --- + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中A~I代表1~9的数字,不同的字母代表不同的数字. 比 ...

  2. Function.caller、arguments.caller、argument.callee

    caller.callee是与javascript函数相关的两个属性,今天来总结下. Function.caller caller是javascript函数的一个属性,它指向调用当前函数的函数,如果函 ...

  3. iOS ReactiveCocoa(RAC)学习详解

    概述: ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的一个框架,有时间,自己也了解学习了一下这个框架的一些基本的应用,其实你要学的话网上是有很多很多的博 ...

  4. MATLAB 单变量函数一阶及N阶求导

    1 对一维函数的求导及求特定函数处的变量值 %%最简单的一阶单变量函数进行求导 function usemyfunArray() %主函数必须位于最上方 clc clear syms x %syms ...

  5. 开放才能进步!Angular和Wijmo一起走过的日子

    Angular 已成为广受欢迎的前端框架.去年9月份,期待已久的 Angular2 的正式版发布之后,Angular 又迎来了新一轮热潮.伴随着 Angular 这一路走来,Wijmo 一直都是第一个 ...

  6. django源码简析——后台程序入口

    这一年一直在用云笔记,平时记录一些tips或者问题很方便,所以也就不再用博客进行记录,还是想把最近学习到的一些东西和大家作以分享,也能够对自己做一个总结.工作中主要基于django框架,进行项目的开发 ...

  7. hibernate 为什么持久化类时必须提供一个不带参数的默认构造函数

    因为hibernate框架会调用这个默认构造方法来构造实例对象..即Class类的newInstance方法 这个方法就是通过调用默认构造方法来创建实例对象的 ,另外再提醒一点,如果你没有提供任何构造 ...

  8. JavaScript实现按键精灵

    最近有个需求,需要在页面上面自动点击.输入.提交. 用以模拟真实用户的操作行为,可以通过直接执行某个元素绑定的事件,来执行操作. 也可以创建事件,再派发事件,执行操作.关于事件的更多细节,可以参考&l ...

  9. Smarty3配置及入门语法

    一.Smarty3配置 下载Smarty文件 在Smarty的官方网站下载Smarty文件,解压下载到的Smarty文件,Smarty的库文件就在libs文件夹中. 我使用的PHP调试环境的程序集成包 ...

  10. 3D Touch开发全面教程之Peek and Pop - 预览和弹出

    ## 3D Touch开发全面教程之Peek and Pop - 预览和弹出 --- ### 了解3D Touch 在iPhone 6s和iPhone 6s Plus中Apple引入了3D Touch ...