当前位置: 代码网 > it编程>编程语言>Asp.net > .Net Core NPOI 导出多级表头的实现代码

.Net Core NPOI 导出多级表头的实现代码

2024年11月25日 Asp.net 我要评论
想要导出这样的表格数据准备格式附上源码using npoi.hssf.usermodel;using npoi.ss.usermodel;using npoi.ss.util;using system

想要导出这样的表格

数据准备格式

附上源码

using npoi.hssf.usermodel;
using npoi.ss.usermodel;
using npoi.ss.util;
using system.data;
using system.text.regularexpressions;
namespace testconsoleapp
{
    /// <summary>
    /// 导出excel
    /// </summary>
    public static class exporthelper
    {
        public static void export()
        {
            var dt = cretetable();
            var titles = getexceltitles(dt.columns, out int maxtitlelevel);
            hssfworkbook workbook = new hssfworkbook();
            isheet sheet = workbook.createsheet("sheet1");
            var allrowcount = dt.rows.count + maxtitlelevel;
            //创建所有单元格
            for (int i = 0; i < allrowcount; i++)
            {
                var row = sheet.createrow(i);
                for (int j = 0; j < dt.columns.count; j++)
                {
                    row.createcell(j);
                }
            }
            //合并创建表头
            foreach (var tit in titles)
            {
                sheet.getrow(tit.startrow).getcell(tit.startcolumn).setcellvalue(tit.title);
                if (tit.mergecolumncount + tit.mergerowcount > 0)
                {
                    sheet.addmergedregion(new cellrangeaddress(tit.startrow, tit.startrow + tit.mergerowcount, tit.startcolumn, tit.startcolumn + tit.mergecolumncount));
                }
            }
            //生成数据行
            for (int i = 0; i < dt.rows.count; i++)
            {
                for (int j = 0; j < dt.columns.count; j++)
                {
                    string cellvalue = dt.rows[i][j].tostring();
                   sheet.getrow(maxtitlelevel + i).cells[j].setcellvalue(cellvalue);
                }
            }
            using filestream stm = file.openwrite(@"d:\drivers\merge.xls");
            workbook.write(stm);
        }
        private static datatable cretetable()
        {
            datatable dt = new datatable();
            dt.columns.add("编号");
            dt.columns.add("收入-线上采购-数量");
            dt.columns.add("收入-线上采购-金额");
            dt.columns.add("收入-线下采购-数量");
            dt.columns.add("收入-线下采购-金额");
            dt.columns.add("回收-数量");
            dt.columns.add("回收-金额");
            dt.columns.add("支出-测试01-数量");
            dt.columns.add("支出-测试01-金额");
            dt.columns.add("支出-测试02-数量");
            dt.columns.add("支出-测试02-金额");
            dt.columns.add("其它-数量");
            dt.columns.add("其它-金额");
            dt.columns.add("备注");
            for (int i = 1; i <= 100; i++)
            {
                var row = dt.newrow();
                row["编号"] = "编号" + i;
                row["收入-线上采购-数量"] = i;
                row["收入-线上采购-金额"] = i;
                row["收入-线下采购-数量"] = i;
                row["收入-线下采购-金额"] = i;
                row["回收-数量"] = i;
                row["回收-金额"] = i;
                row["支出-测试01-数量"] = i;
                row["支出-测试01-金额"] = i;
                row["支出-测试02-数量"] = i;
                row["支出-测试02-金额"] = i;
                row["其它-数量"] = i;
                row["其它-金额"] = i;
                row["备注"] = i;
                dt.rows.add(row);
            }
            return dt;
        }
        private static list<exceltitle> getexceltitles(datacolumncollection columns, out int maxtitlelevel)
        {
            maxtitlelevel = 0;
            list<levelexceltitle> levelexceltitles = new list<levelexceltitle>();
            for (var index = 0; index < columns.count; index++)
            {
                var column = columns[index].tostring();
                var arr = column.split("-");
                if (maxtitlelevel < arr.length)
                {
                    maxtitlelevel = arr.length;
                }
                for (int i = 0; i < arr.length; i++)
                {
                    levelexceltitles.add(new levelexceltitle()
                    {
                        title = arr[i],
                        levelcode = string.join("-", arr[..(i + 1)]),
                        rowindex = i,
                        columnindex = index,
                        totallevel = arr.length
                    });
                }
            }
            var titlelevel = maxtitlelevel;
            var exceltitles = levelexceltitles
                .groupby(b => new
                {
                    b.levelcode,
                    b.title
                })
               .select(b => new exceltitle()
               {
                   title = b.key.title,
                   startrow = b.min(c => c.rowindex),
                   mergerowcount = b.min(c => c.rowindex) + 1 == b.max(c => c.totallevel) ? titlelevel - b.max(c => c.totallevel) : 0,
                   startcolumn = b.min(c => c.columnindex),
                   mergecolumncount = b.count() - 1,//排除自身
               }).tolist();
            return exceltitles;
        }
    }
    public class exceltitle
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string title { get; set; }
        /// <summary>
        /// 开始行
        /// </summary>
        public int startrow { get; set; }
        /// <summary>
        /// 合并行
        /// </summary>
        public int mergerowcount { get; set; }
        /// <summary>
        /// 开始列
        /// </summary>
        public int startcolumn { get; set; }
        /// <summary>
        /// 合并列
        /// </summary>
        public int mergecolumncount { get; set; }
    }
    public class levelexceltitle
    {
        /// <summary>
        /// 标题
        /// </summary>
        public string title { get; set; }
        public string levelcode { get; set; }
        /// <summary>
        /// 第几行
        /// </summary>
        public int rowindex { get; set; }
        /// <summary>
        /// 第几列
        /// </summary>
        public int columnindex { get; set; }
        /// <summary>
        /// 总层
        /// </summary>
        public int totallevel { get; set; }
    }
}

到此这篇关于.net core npoi 导出多级表头的文章就介绍到这了,更多相关.net core npoi 导出多级表头内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com