npoi根据html字符串动态生成excel模板

npoi多表头数据导出目前有两种方法:

其一是根据excel模板来导出数据

其二是npoi动态创建多表头

上面的两种方法我都用过今天我介绍的是根据html字符串来创建excel,但是要设置响应的属性,

其实也就是对应 npoi CellRangeAddress 方法所需要的四个参数(firstrow,lastrow,firstcol,lastcol),这四个参数代表的意思是 单元格的开始行索引,结束行索引,开始列索引,结束列索引。

先要有table表头的字符串然后用HtmlAgilityPack去解析。

table字符串如下

string [email protected]"<table cords=‘3,7‘>
        <tr>
            <td cords=‘0,2,0,0‘ rowspan=‘3‘>111</td>
            <td cords=‘0,0,1,2‘ colspan=‘2‘>222</td>
            <td cords=‘0,0,3,5‘ colspan=‘3‘>5555</td>
            <td cords=‘0,2,6,6‘ rowspan=‘3‘>888</td>
        </tr>
        <tr>
            <td cords=‘1,2,1,1‘ rowspan=‘2‘>333</td>
            <td cords=‘1,2,2,2‘ rowspan=‘2‘>444</td>
            <td cords=‘1,1,3,4‘ colspan=‘2‘>666</td>
            <td cords=‘1,1,5,5‘>777</td>
        </tr>
        <tr>
            <td cords=‘2,2,3,3‘>6661</td>
            <td cords=‘2,2,4,4‘>6662</td>
            <td cords=‘2,2,5,5‘>771</td>
        </tr>
    </table>";

table上cords属性值的3,7,代表创建的table有几行几列

td上的cords属性值表示但是单元格合并所需要的四个值。

然后用npoi根据table的cords的值动态创建行和列然后根据td的cords来动态的合并单元格

完成代码如下:

    

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
    HtmlNode node = doc.DocumentNode;
    HtmlNode div = node.SelectNodes("//table")[0];

    string[] strrowcol = div.Attributes["cords"].Value.Split(‘,‘);
    HtmlNodeCollection hnc = node.SelectNodes("//table//tr");

    HSSFWorkbook wk = new HSSFWorkbook();
              ISheet tb = wk.CreateSheet("mySheet");

ICellStyle cellstyle = wk.CreateCellStyle();
              cellstyle.Alignment = HorizontalAlignment.CENTER;
              cellstyle.VerticalAlignment = VerticalAlignment.CENTER;
              cellstyle.BorderBottom = CellBorderType.THIN;
              cellstyle.BorderLeft = CellBorderType.THIN;
              cellstyle.BorderRight = CellBorderType.THIN;
              cellstyle.BorderTop = CellBorderType.THIN;

for (int m = 0; m < int.Parse(strrowcol[0]); m++)
             {
                 IRow rowb = tb.CreateRow(m);
                 for (int n = 0; n < int.Parse(strrowcol[1]); n++)
                 {
                     ICell cell = rowb.CreateCell(n);
                     cell.CellStyle = cellstyle;
                 }
             }

    for (int i = 0; i < hnc.Count; i++)
              {
                  HtmlNodeCollection tdcount = hnc[i].SelectNodes("td");
                  for (int y = 0; y < tdcount.Count; y++)
                  {

          string[] strs = tdcount[y].Attributes["cords"].Value.Split(‘,‘);
                    tb.GetRow(int.Parse(strs[0])).GetCell(int.Parse(strs[2])).SetCellValue(tdcount[y].InnerText.Replace("\r\n", "").Trim());
                         tb.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(int.Parse(strs[0]), int.Parse(strs[1]), int.Parse(strs[2]), int.Parse(strs[3])));

        }

    }

//这里可以添加数据也就是动态创建行和列然后填充数据

//生成模板到excel

   FileStream file = new FileStream(@"D:\CreateExcel.xls", FileMode.Create);
            wk.Write(file);
            file.Close();

//不想生成的话可以直接下载

MemoryStream mstream = new MemoryStream();
             wk.Write(mstream);

string fileName = "动态创建excel.xls";
            byte[] bytes = mstream.ToArray();
             mstream.Read(bytes, 0, bytes.Length);
             mstream.Close();
             System.Web.HttpContext.Current.Response.Clear();
             System.Web.HttpContext.Current.Response.ClearContent();
             System.Web.HttpContext.Current.Response.ClearHeaders();
             HttpContext.Current.Response.Charset = "UTF-8";
             System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";
             System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
             System.Web.HttpContext.Current.Response.AddHeader("Content-Transfer-Encoding", "binary"); System.Web.HttpContext.Current.Response.BinaryWrite(bytes);
             System.Web.HttpContext.Current.Response.Flush();
             System.Web.HttpContext.Current.Response.End();

原想直接根据td的rowspan 或者colspan来直接创建excel但是做了一下没实现,就只有加个自定义的属性来实现了,如有更好的方法请留言讨论。

如需转载请保存原文连接

原文地址:https://www.cnblogs.com/alasai/p/9928987.html

时间: 2024-10-07 21:38:58

npoi根据html字符串动态生成excel模板的相关文章

python-根据字符串动态生成对象eval

# -*- coding: utf-8 -*- stock1={ 'stockName':"沈阳机床", 'stockCode':"000410", 'averagePrice_yesterday':34.08, 'averagePrice_today':35.49, 'position_old':0.0941350558312, } stock2={ 'stockName':"暴风科技", 'stockCode':"300431&qu

NPOI 动态生成Excel 转成HTML table显示

直入主题: 需求:从数据集中出去检索的数据,生成Excel ,转成HTML table 显示在页面上.还可以导出Excel . 我实现的效果图: 页面----> Excel----> now  ,说下具体的代码: 1.添加组件:   NPOI 相关组件,Excel转HTML组件. 2.使用了bootstrap 样式,所有要记得引用 <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="s

求教:c#根据模板生成excel模板,模板可编辑,且可以根据模板上的索引添加相应的值

大家好!我大概是这样,用c#写了一个界面,主要是仪器通信和打印报表,我负责打印报表的那块,我在网上找了一些资料,大概有几种生成方式,比如nopi epplus〈这都很简单〉也有一些参考程序,我的需求:1.找到一种生成报表的方式,能够根据Excel模板,读取模板后在其中对应的地方导入相应的程序,我现在能够实现行列坐标对应〈如图所示的一种方式〉2.实现报表的可编辑功能,1中的方式需要一个固定的映射关系,行列坐标对应,报表可编辑是指用户可以在自定义的Excel模板中插入一个标志,同时与c#建立链接,比

数据库与Excel报表的动态生成

一.数据库与Excel报表的动态生成 (1)读取数据库的数据动态生成Excel报表,这是JSP应用中常遇到的问题,本节采用的基本方法是: 在Excel工作薄中,将报表模板制作在第一张工作表中,从数据库中读取数据,利用POI组件复制模板工作表 而得到一张新的工作表,将查询数据填写到新的工作表中. (2) 实例分析 写一个Servlet程序,查询pubs数据库的titles表和sales表,把查询结果集数据填写到图6-14的报表中, 操作步骤如下: 第1步:新建一个名类为"DBExcelServle

MVC +NPOI+AJAX 查询并生成excel 下载

Controller 代码: public class SubArea2STIReportController : BaseController { [ActionDescription("分区2STI查询")] public ActionResult Index() { var vm = CreateVM<SubArea2STIReportVM>(); return PartialView(vm); } [HttpPost] [ActionDescription(&quo

使用NPOI生成Excel级联列表

目录 1    概要    1 2    磨刀不误砍柴工——先学会Excel中的操作    2 3    利用NPOI生成导入模板    7 3.1    设置workbook&sheet    8 3.2    生成数据Sheet,并按规则列好    8 3.3    添加名称,并指定数据范围(绑定数据源)    9 3.4    写入大类和小类的数据验证    11 概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.另外Word发博代码格式显示凌乱,因此相关代码均使用图片替代

java读取WORD/EXCEL模板转换生成新WORD/EXCEL文档

原文:java读取WORD/EXCEL模板转换生成新WORD/EXCEL文档 代码下载地址:http://www.zuidaima.com/share/1550463239670784.htm 可以通过预先设置指定的excel和word模板,通过替换文档里面指定的标志来生成新的excel和word文档.excel的部分只是实现了简单的方法.word部分可以支持word2003和word2007格式.建议word使用07及其以上. 其实excel部分标签和jstl很像,而且支持循环等.word就支

ExtJS4 动态生成的grid导出为excel(纯前台)

搜索了蛮久,找到一些例子,因为我是初学者的缘故大多不知道怎么使用.. 研究了一下那个源码,搞到现在终于实现了基本的下载..解决了一个表格不能重复下载的小BUG,一个使用grid初始化发生的BUG 下面记录一下步骤..说不定下次还有用 1.下载需要用到js代码,我已经上传 http://download.csdn.net/detail/hu8471479/7281703 2.在你的html文件中加入引用,路径问题自己 注意下,下面是我的路径 <script type="text/javasc

ios开发笔记根据传入字符串的长度动态生成label,并按照屏幕宽度排列

在开发工作中遇到了一个对我来说非常难得问题,搞了两天呀,都虚脱了,终于骗到大神给的demo做了出来效果是这样 首先后台的同事传一个字符串..拒绝传数组,那么我们就要学会分割! NSString *tagStr = [dictionary valueForKey:@"tags"]; NSArray *statusArray = [tagStr componentsSeparatedByString:@","]; 这个就是把字符串按照符号分割数组的方法,接下来我们就可以