NPOI导出多表头Execl(通过html表格遍历表头)
关于NPOI的相关信息,我想博客园已经有很多了,而且NPOI导出Execl的文章和例子也很多,但导出多表头缺蛮少的;今天要讲的通过自己画html表格;通过html表格来导出自定义的多表头;
先来看要实现的多表头格式:

第一步:画html表格(备注有一定的格式要求)
//td需要4个属性,rowspan(跨行数)、colspan(跨列数)、row(所在行)、col(所在列);备注:其实除了跨行和跨列数外,后面只需要所在列都可以了;
<tr>
<td rowspan="" colspan="" row="" col="">名称1</td>
<td rowspan="" colspan="" row="" col="">名称2</td>
<td rowspan="" colspan="" row="" col="">名称3</td>
<td rowspan="" colspan="" row="" col="">名称4</td>
<td rowspan="" colspan="" row="" col="">名称5</td>
<td rowspan="" colspan="" row="" col="">名称6</td>
<td rowspan="" colspan="" row="" col="">名称7</td>
<td rowspan="" colspan="" row="" col="">名称8</td>
<td rowspan="" colspan="" row="" col="">名称9</td>
<td rowspan="" colspan="" row="" col="">备注</td>
</tr>
<tr>
<td rowspan="" colspan="" row="" col="">效果1</td>
<td rowspan="" colspan="" row="" col="">效果2</td>
<td rowspan="" colspan="" row="" col="">效果3</td>
<td rowspan="" colspan="" row="" col="">效果4</td>
<td rowspan="" colspan="" row="" col="">效果5</td>
<td rowspan="" colspan="" row="" col="">效果6</td>
<td rowspan="" colspan="" row="" col="">效果7</td>
<td rowspan="" colspan="" row="" col="">效果8</td>
<td rowspan="" colspan="" row="" col="">效果9</td>
<td rowspan="" colspan="" row="" col="">效果10</td>
<td rowspan="" colspan="" row="" col="">效果11</td>
<td rowspan="" colspan="" row="" col="">效果12</td>
<td rowspan="" colspan="" row="" col="">效果13</td>
<td rowspan="" colspan="" row="" col="">效果14</td>
<td rowspan="" colspan="" row="" col="">效果15</td>
<td rowspan="" colspan="" row="" col="">效果16</td>
</tr>
第二步,解析html表格
1、正则遍历tr
string rowContent = string.Empty;
MatchCollection rowCollection = Regex.Matches(html, @"<tr[^>]*>[\s\S]*?<\/tr>",
RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); //对tr进行筛选
2、循环tr正则遍历td
MatchCollection columnCollection = Regex.Matches(rowContent, @"<td[^>]*>[\s\S]*?<\/td>",
RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); //对td进行筛选
3、解析td原属
var match = Regex.Match(columnCollection[j].Value, "<td.*?rowspan=\"(?<row>.*?)\".*?colspan=\"(?<col>.*?)\".*?row=\"(?<row1>.*?)\".*?col=\"(?<col1>.*?)\">(?<value>.*?)<\\/td>", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
if (match.Success)
{
int rowspan = Convert.ToInt32(match.Groups["row"].Value);//表格跨行
int colspan = Convert.ToInt32(match.Groups["col"].Value);//表格跨列
int rowcount = Convert.ToInt32(match.Groups["row1"].Value);//所在行
int col = Convert.ToInt32(match.Groups["col1"].Value);//所在列
string value = match.Groups["value"].Value;//值
}
通过上面几步,都可以解析出对应的表格原属
使用NPOI
1、创建HSSFWorkbook
HSSFWorkbook hssfworkbook = new HSSFWorkbook();;//创建Workbook对象
HSSFSheet sheet1 = (HSSFSheet)hssfworkbook.CreateSheet("测试多表头");//创建工作表
2、在tr循环中创建行
//写在tr循环中
for (int i = 0; i < rowCollection.Count; i++){
HSSFRow row = (HSSFRow)sheet1.CreateRow(i);
rowContent = rowCollection[i].Value;
}
3、在td循环中创建列(关键)
//遍历td
for (int j = ; j < columnCollection.Count; j++)
{
var match = Regex.Match(columnCollection[j].Value, "<td.*?rowspan=\"(?<row>.*?)\".*?colspan=\"(?<col>.*?)\".*?row=\"(?<row1>.*?)\".*?col=\"(?<col1>.*?)\">(?<value>.*?)<\\/td>", RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
if (match.Success)
{
int rowspan = Convert.ToInt32(match.Groups["row"].Value);//表格跨行
int colspan = Convert.ToInt32(match.Groups["col"].Value);//表格跨列
int rowcount = Convert.ToInt32(match.Groups["row1"].Value);//所在行
int col = Convert.ToInt32(match.Groups["col1"].Value);//所在列
string value = match.Groups["value"].Value; if (colspan == )//判断是否跨列
{
var cell = row.CreateCell(col);//创建列
cell.SetCellValue(value);//设置列的值
if (value.Length > )
{
int width = value.Length * / ;
if (width > )
width = ;
sheet1.SetColumnWidth(col, width * );
}
}
//判断是否跨行、跨列
if (rowspan > || colspan > )
{
int firstRow = , lastRow = , firstCol = , lastCol = ;
if (rowspan > )//跨行
{
firstRow = rowcount;
lastRow = firstRow + rowspan - ;
}
else
{
firstRow = lastRow = i;
}
if (colspan > )//跨列
{
firstCol = col;
int cols = col + colspan;
for (; col < cols; col++)
{
var cell = row.CreateCell(col);
cell.SetCellValue(value);
}
lastCol = col - ;
}
else
{
firstCol = lastCol = col;
}
//关键是这里,设置起始行数,结束行数;起始列数,结束列数
sheet1.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(firstRow, lastRow, firstCol, lastCol));
} }
}
保存execl
string year = DateTime.Now.Year.ToString();
string ppath = HttpContext.Current.Server.MapPath(DateTime.Now.ToString("yyyyMMddmmss") + ".xls");
FileStream file = new FileStream(ppath, FileMode.Create);
hssfworkbook.Write(file);
file.Close();
这样都保存在服务器上了,可以通过下载自行下载下来;这里不复制代码了;
如果有什么问题,请指教,谢谢!
NPOI导出多表头Execl(通过html表格遍历表头)的更多相关文章
- 利用NPOI导出数据到Execl
相信很多童鞋都开发过Execl的导入导出功能,最近产品中无论是后台数据分析的需要,还是前端满足用户管理的方便,都有Execl导入导出的维护需求产生. 以前做这个功能,如果是web,利用HttpCont ...
- C# NPOI 导出Execl 工具类
NPOI 导出Execl 自己单独工具类 详见代码 using System; using System.Collections.Generic; using System.Linq; using S ...
- NPOI,导出Execl,压缩文件zip,发送Email
private void SendEmail(string emailAddress, string companyName,string proxy, string officer, DataTab ...
- NPOI导出Excel (C#) 踩坑 之--The maximum column width for an individual cell is 255 charaters
/******************************************************************* * 版权所有: * 类 名 称:ExcelHelper * 作 ...
- .NET NPOI导出Excel详解
NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件. 支持的文件格式包括xls, ...
- 分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限
大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. ...
- .NET Core使用NPOI导出复杂Word详解
前言: 最近使用NPOI做了个导出Word文档的功能,关于使用.NET Core 导出Word文档的方式有很多.最终我为什么选择了NPOI来实现了这个功能,首先是NPOI是一个开源,免费且容易上手的第 ...
- 使用NPOI导出Excel文件
使用NPOI导出Excel文件,本实例使用了ASP.NET MVC. 1.使用NPOI导出Excel文件 实例:导出商品列表. 要求:1.通过NPOI导出导出商品列表信息: 2.使用Excel函数计算 ...
- .NET Core使用NPOI导出复杂,美观的Excel详解
前言: 这段时间一直专注于数据报表的开发,当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦.客户要求要导出优雅,美观的Excel文档格式的来展示数据,当时的第一想法就是使用NPOI开源库来做 ...
随机推荐
- JAVA方法和本地方法(转载)
转载自:http://blog.sina.com.cn/s/blog_5b9b4abe01016zw0.html JAVA中有两种方法:JAVA方法和本地方法 JAVA方法是由JAVA编写的,编译 ...
- jquery滚动条
查看demo: 下载Demo
- ubuntu终端提示符@name修改
需要修改两个文件: 1.在终端输入 vim /etc/hosts 将当前的name改为ubuntu: 2.在终端输入 vim /etc/hostsname 将当前的name改为ubuntu: 3.重 ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类) - Part.1
这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...
- 用slf4j+logback实现多功能日志解决方案 --- 转
大家都知道,slf4j是原来log4j的作者写的一个新的日志组件,意思是简单日志门面接口,可以跟其他日志组件配合使用,常用的配合是slf4j+logback,无论从功能上还是从性能上都较之log4j有 ...
- java 注解(转)
第一部分:了解一下java1.5起默认的三个annotation类型: 一个是@Override:只能用在方法之上的,用来告诉别人这一个方法是改写父类的. 一个是@Deprecated:建 ...
- bzoj 2588 Spoj 10628. Count on a tree(主席树)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
- DLLImport
namespace Wintellect.Interop.Sound { using System; using System.Runtime.InteropServices; using Syste ...
- Linux 中/etc/profile、~/.bash_profile 等几个环境配置文件的执行过程
环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell.对于Linux来说一般是bash,但也可以重新设定或切换到其它的 Shell.对于UNIX,可能是CShelll.环境变量是通过 ...
- poj1743--Musical Theme(后缀数组)
题意:求一列数字中走向相同的两个字序列,长度要求大于5 题解:相邻数字求差,原题就变成求相同的长度大于4的子串. [存疑:在保证两个子串不相交时觉得限定条件应该是大于x,但是wa了= = 不是很理解] ...