NPOI导出多表头Execl(通过html表格遍历表头)

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

先来看要实现的多表头格式:

第一步:画html表格(备注有一定的格式要求)

//td需要4个属性,rowspan(跨行数)、colspan(跨列数)、row(所在行)、col(所在列);备注:其实除了跨行和跨列数外,后面只需要所在列都可以了;
<tr>
                <td rowspan="2" colspan="1" row="0" col="0">名称1</td>
                <td rowspan="2" colspan="1" row="0" col="1">名称2</td>
                <td rowspan="2" colspan="1" row="0" col="2">名称3</td>
                <td rowspan="1" colspan="4" row="0" col="3">名称4</td>
                <td rowspan="1" colspan="4" row="0" col="7">名称5</td>
                <td rowspan="1" colspan="4" row="0" col="11">名称6</td>
                <td rowspan="1" colspan="4" row="0" col="15">名称7</td>
                <td rowspan="2" colspan="1" row="0" col="19">名称8</td>
                <td rowspan="2" colspan="1" row="0" col="20">名称9</td>
                <td rowspan="2" colspan="1" row="0" col="21">备注</td>
            </tr>
            <tr>
                <td rowspan="1" colspan="1" row="1" col="3">效果1</td>
                <td rowspan="1" colspan="1" row="1" col="4">效果2</td>
                <td rowspan="1" colspan="1" row="1" col="5">效果3</td>
                <td rowspan="1" colspan="1" row="1" col="6">效果4</td>
                <td rowspan="1" colspan="1" row="1" col="7">效果5</td>
                <td rowspan="1" colspan="1" row="1" col="8">效果6</td>
                <td rowspan="1" colspan="1" row="1" col="9">效果7</td>
                <td rowspan="1" colspan="1" row="1" col="10">效果8</td>
                <td rowspan="1" colspan="1" row="1" col="11">效果9</td>
                <td rowspan="1" colspan="1" row="1" col="12">效果10</td>
                <td rowspan="1" colspan="1" row="1" col="13">效果11</td>
                <td rowspan="1" colspan="1" row="1" col="14">效果12</td>
                <td rowspan="1" colspan="1" row="1" col="15">效果13</td>
                <td rowspan="1" colspan="1" row="1" col="16">效果14</td>
                <td rowspan="1" colspan="1" row="1" col="17">效果15</td>
                <td rowspan="1" colspan="1" row="1" col="18">效果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循环中创建列(关键)

 //遍历tdfor (int j = 0; 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 == 1)//判断是否跨列
                            {
                                var cell = row.CreateCell(col);//创建列
                                cell.SetCellValue(value);//设置列的值
                                if (value.Length > 0)
                                {
                                    int width = value.Length * 25 / 6;
                                    if (width > 255)
                                        width = 250;
                                    sheet1.SetColumnWidth(col, width * 256);
                                }
                            }
                //判断是否跨行、跨列
                            if (rowspan > 1 || colspan > 1)
                            {
                                int firstRow = 0, lastRow = 0, firstCol = 0, lastCol = 0;
                                if (rowspan > 1)//跨行
                                {
                                    firstRow = rowcount;
                                    lastRow = firstRow + rowspan - 1;
                                }
                                else
                                {
                                    firstRow = lastRow = i;
                                }
                                if (colspan > 1)//跨列
                                {
                                    firstCol = col;
                                    int cols = col + colspan;
                                    for (; col < cols; col++)
                                    {
                                        var cell = row.CreateCell(col);
                                        cell.SetCellValue(value);
                                    }
                                    lastCol = col - 1;
                                }
                                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();

这样都保存在服务器上了,可以通过下载自行下载下来;这里不复制代码了;

如果有什么问题,请指教,谢谢!

时间: 2024-10-27 06:42:51

NPOI导出多表头Execl(通过html表格遍历表头)的相关文章

利用NPOI导出数据到Execl

相信很多童鞋都开发过Execl的导入导出功能,最近产品中无论是后台数据分析的需要,还是前端满足用户管理的方便,都有Execl导入导出的维护需求产生. 以前做这个功能,如果是web,利用HttpContext.Current.Response.ContentType ="application/ms-excel";就可以导出html数据表格到execl中,这种方法的问题就是编码格式的兼容性太差,用Mac OS之类的 office打开直接乱码给你看.或者是调用office的COM组件,或宏

分享使用NPOI导出Excel树状结构的数据,如部门用户菜单权限

大家都知道使用NPOI导出Excel格式数据 很简单,网上一搜,到处都有示例代码. 因为工作的关系,经常会有处理各种数据库数据的场景,其中处理Excel 数据导出,以备客户人员确认数据,场景很常见. 一个系统开发出来,系统要运行起来,很多数据要初始化,这个时候也是需要客户提供各种业务的基础数据.客户提供的数据中,其中除了word.pdf,最常见的就是Excel. 废话不多说,直接上图上代码: 如图, 左侧三列,作为 一个系统 所有菜单的树状结构. 其他列 以用户的信息(如用户名.登录名) 作为表

.NET NPOI导出Excel详解

NPOI,顾名思义,就是POI的.NET版本.那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件. 支持的文件格式包括xls, doc, ppt等. 官方网站:http://npoi.codeplex.com/ nuget直接获取使用 一.NPOI生成Excel //创建工作薄 var workbook = new HSSFWorkbook(); //创建表 var table = workbook.CreateSheet(

.NET Core使用NPOI导出复杂Word详解

前言: 最近使用NPOI做了个导出Word文档的功能,关于使用.NET Core 导出Word文档的方式有很多.最终我为什么选择了NPOI来实现了这个功能,首先是NPOI是一个开源,免费且容易上手的第三方框架(并且现在已支持.NET Core,GitHub源码地址:https://github.com/tonyqus/npoi).因为之前使用NPOI导出Execl比较多,这次第一次使用NPOI 来导出Word文档还真没有什么头绪.首先看了下GItHub中的源码有一个简单Word导出的示例,然后在

poi 动态生成多表头execl

如果所示,我要导出的数据界面是下面这样的,前面样品编号.样品名称.炉次为主表数据,而检验结果是子表数据,这里子表的数据作为了主表的数据的一个字段(集合属性),下面代码会给大家看vo结构 下图为要导出的execl效果 开发思路: 1.该表头表体是根据主表样品名称不同而子表元素个数就会不同,所以第一步就是将前端传来的数据按样品名称分组 2.由于导出的数据顺序会乱,所以还是需要map排序下,这里我们可以按key排序 3.由于我要导出的数据是主子表结构,所以要将表体数据利用反射映射到表头去,以方便导出使

Npoi导出Word

Npoi导出Word 参考网上大神们笔记,完成Word导出. //创建文档 XWPFDocument doc = new XWPFDocument(); //标题 XWPFParagraph p1 = doc.CreateParagraph(); XWPFRun r1 = p1.CreateRun(); r1.SetBold(true); r1.FontSize = 23; r1.SetText("先进个人基本信息"); r1.SetTextPosition(30); CT_P doc

NPOI导出多张图片到Excel

常用NPOI导出数据到excel,但没有试过如何导出图片.NPOI最大的特点就是不依赖于Excel组件,服务端不需要安装Excel.在单元格中插入图片主要是用HSSFClientAnchor对象.他有8个参数. HSSFClientAnchor anchor = new HSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2); 前面四个表示在单元格中两个点的位置,后面四个表示是哪个单元格.先看代码. public FileResu

通过NPOI导出Word文档

1 XWPFDocument doc = new XWPFDocument(); 2 XWPFParagraph p0 = doc.CreateParagraph(); 3 p0.Alignment = ParagraphAlignment.LEFT; 4 5 XWPFRun r0 = p0.CreateRun(); 6 r0.FontFamily = "宋体"; 7 r0.FontSize = 18; 8 r0.IsBold = true; 9 r0.SetText("未登

NPOI导出模板样式

/// <summary> /// 导出多种车辆统计表格 /// </summary> /// <returns></returns> [ActionName("MoreAllImport")] public void MoreAllImport() { List<CarMoreStatistics> list = TempData["MoreAllExcel"] as List<CarMoreSta