.Net Core NPOI 导出多级表头的实现代码
时间:2024-11-11 09:19:51|栏目:ASP.NET|点击: 次
想要导出这样的表格
数据准备格式
附上源码
using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.SS.Util; using System.Data; using System.Text.RegularExpressions; namespace TestConsoleApp { ////// 导出Excel /// 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:DriversMerge.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 ListGetExcelTitles(DataColumnCollection columns, out int maxTitleLevel) { maxTitleLevel = 0; List levelExcelTitles = new List (); 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 { /// /// 标题 /// public string Title { get; set; } ////// 开始行 /// public int StartRow { get; set; } ////// 合并行 /// public int MergeRowCount { get; set; } ////// 开始列 /// public int StartColumn { get; set; } ////// 合并列 /// public int MergeColumnCount { get; set; } } public class LevelExcelTitle { ////// 标题 /// public string Title { get; set; } public string LevelCode { get; set; } ////// 第几行 /// public int RowIndex { get; set; } ////// 第几列 /// public int ColumnIndex { get; set; } ////// 总层 /// public int TotalLevel { get; set; } } }
到此这篇关于.Net Core NPOI 导出多级表头的文章就介绍到这了,更多相关.Net Core NPOI 导出多级表头内容请搜索科站长以前的文章或继续浏览下面的相关文章希望大家以后多多支持科站长!
您可能感兴趣的文章
- 03-31详解如何在.NET代码中使用本地部署的Deepseek语言模型
- 02-06.net core如何使用Nacos注册中心
- 01-28使用.NET8构建一个高效的时间日期帮助类
- 01-26.NET Core GC压缩(compact_phase)底层原理解析
- 01-24在ASP.NET中读写TXT文本文件的多种方法
- 01-24在ASP.NET中读写XML数据的多种方法
- 01-24.NET轻松实现Excel转PDF的三种方法详解
- 01-23.NET9 AOT部署方案详解
- 01-23.NET NativeAOT 用法指南
- 01-23iis部署前后端分离项目全过程(Vuet前端和.NET6后端)


阅读排行
推荐教程
- 03-31详解如何在.NET代码中使用本地部署的Deepseek语言模型
- 11-23移动互联网广告有哪些模式?
- 11-22.net 应对网站访问压力的方案总结
- 11-22详解ASP.NET提取多层嵌套json数据的方法
- 11-23网站投放广告如何达到最好的效果
- 11-22.net 应对网站访问压力的方案总结
- 11-23网站打开速度慢解决办法
- 11-23草根站长为什么喜欢做门户站
- 11-22ASP.NET MVC分页问题解决
- 11-22ASP.NET编程简单实现生成静态页面的方法