.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 List GetExcelTitles(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 导出多级表头内容请搜索科站长以前的文章或继续浏览下面的相关文章希望大家以后多多支持科站长!
您可能感兴趣的文章


阅读排行
推荐教程
- 07-25在 .NET 中 使用 ANTLR4构建语法分析器的方法
- 07-25ASP.NET中Onclick与OnClientClick遇到的问题
- 07-25ASP.NET Core 模型验证消息的本地化新姿势详解
- 07-25Asp.NET Core WebApi 配置文件详细说明
- 07-25Math.NET Numerics 开源数学库安装使用详解
- 07-25.NET Core 实现缓存的预热的方式
- 03-31详解如何在.NET代码中使用本地部署的Deepseek语言模型
- 07-25.NET根据文件的哈希值筛选重复文件的实现思路
- 07-25.NET 中的深拷贝实现方法详解
- 07-25.NET WPF 可视化树(Visual Tree)详解




