首页 > 其他分享 >.Net Core NPOI 导出多级表头

.Net Core NPOI 导出多级表头

时间:2024-11-06 09:31:30浏览次数:1  
标签:Core int NPOI tit Add 表头 dt public Columns

  想要导出这样的表格

 

数据准备格式

 

 

 

附上源码

  1 using NPOI.HSSF.UserModel;
  2 using NPOI.SS.UserModel;
  3 using NPOI.SS.Util;
  4 using System.Data;
  5 using System.Text.RegularExpressions;
  6 
  7 namespace TestConsoleApp
  8 {
  9     /// <summary>
 10     /// 导出Excel
 11     /// </summary>
 12     public static class ExportHelper
 13     {
 14         public static void Export()
 15         {
 16             var dt = CreteTable();
 17             var titles = GetExcelTitles(dt.Columns, out int maxTitleLevel);
 18 
 19             HSSFWorkbook workbook = new HSSFWorkbook();
 20             ISheet sheet = workbook.CreateSheet("Sheet1");
 21 
 22             var allRowCount = dt.Rows.Count + maxTitleLevel;
 23             //创建所有单元格
 24             for (int i = 0; i < allRowCount; i++)
 25             {
 26                 var row = sheet.CreateRow(i);
 27                 for (int j = 0; j < dt.Columns.Count; j++)
 28                 {
 29                     row.CreateCell(j);
 30                 }
 31             }
 32 
 33             //合并创建表头
 34             foreach (var tit in titles)
 35             {
 36                 sheet.GetRow(tit.StartRow).GetCell(tit.StartColumn).SetCellValue(tit.Title);
 37                 if (tit.MergeColumnCount + tit.MergeRowCount > 0)
 38                 {
 39                     sheet.AddMergedRegion(new CellRangeAddress(tit.StartRow, tit.StartRow + tit.MergeRowCount, tit.StartColumn, tit.StartColumn + tit.MergeColumnCount));
 40                 }
 41             }
 42 
 43             //生成数据行 
 44             for (int i = 0; i < dt.Rows.Count; i++)
 45             {
 46                 for (int j = 0; j < dt.Columns.Count; j++)
 47                 {
 48                     string cellValue = dt.Rows[i][j].ToString();
 49                    sheet.GetRow(maxTitleLevel + i).Cells[j].SetCellValue(cellValue);
 50                 }
 51             }
 52 
 53             using FileStream stm = File.OpenWrite(@"D:\Drivers\Merge.xls");
 54             workbook.Write(stm);
 55         }
 56 
 57         private static DataTable CreteTable()
 58         {
 59             DataTable dt = new DataTable();
 60             dt.Columns.Add("编号");
 61             dt.Columns.Add("收入-线上采购-数量");
 62             dt.Columns.Add("收入-线上采购-金额");
 63 
 64             dt.Columns.Add("收入-线下采购-数量");
 65             dt.Columns.Add("收入-线下采购-金额");
 66 
 67             dt.Columns.Add("回收-数量");
 68             dt.Columns.Add("回收-金额");
 69 
 70             dt.Columns.Add("支出-测试01-数量");
 71             dt.Columns.Add("支出-测试01-金额");
 72 
 73             dt.Columns.Add("支出-测试02-数量");
 74             dt.Columns.Add("支出-测试02-金额");
 75 
 76             dt.Columns.Add("其它-数量");
 77             dt.Columns.Add("其它-金额");
 78 
 79             dt.Columns.Add("备注");
 80 
 81             for (int i = 1; i <= 100; i++)
 82             {
 83                 var row = dt.NewRow();
 84 
 85                 row["编号"] = "编号" + i;
 86                 row["收入-线上采购-数量"] = i;
 87                 row["收入-线上采购-金额"] = i;
 88                 row["收入-线下采购-数量"] = i;
 89                 row["收入-线下采购-金额"] = i;
 90                 row["回收-数量"] = i;
 91                 row["回收-金额"] = i;
 92                 row["支出-测试01-数量"] = i;
 93                 row["支出-测试01-金额"] = i;
 94                 row["支出-测试02-数量"] = i;
 95                 row["支出-测试02-金额"] = i;
 96                 row["其它-数量"] = i;
 97                 row["其它-金额"] = i;
 98                 row["备注"] = i;
 99                 dt.Rows.Add(row);
100             }
101 
102             return dt;
103         }
104 
105 
106         private static List<ExcelTitle> GetExcelTitles(DataColumnCollection columns, out int maxTitleLevel)
107         {
108             maxTitleLevel = 0;
109             List<LevelExcelTitle> levelExcelTitles = new List<LevelExcelTitle>();
110 
111             for (var index = 0; index < columns.Count; index++)
112             {
113                 var column = columns[index].ToString();
114 
115                 var arr = column.Split("-");
116 
117 
118                 if (maxTitleLevel < arr.Length)
119                 {
120                     maxTitleLevel = arr.Length;
121                 }
122 
123                 for (int i = 0; i < arr.Length; i++)
124                 {
125                     levelExcelTitles.Add(new LevelExcelTitle()
126                     {
127                         Title = arr[i],
128                         LevelCode = string.Join("-", arr[..(i + 1)]),
129                         RowIndex = i,
130                         ColumnIndex = index,
131                         TotalLevel = arr.Length
132                     });
133                 }
134             }
135 
136             var titleLevel = maxTitleLevel;
137             var excelTitles = levelExcelTitles
138                 .GroupBy(b => new
139                 {
140                     b.LevelCode,
141                     b.Title
142                 })
143                .Select(b => new ExcelTitle()
144                {
145                    Title = b.Key.Title,
146                    StartRow = b.Min(c => c.RowIndex),
147                    MergeRowCount = b.Min(c => c.RowIndex) + 1 == b.Max(c => c.TotalLevel) ? titleLevel - b.Max(c => c.TotalLevel) : 0,
148 
149                    StartColumn = b.Min(c => c.ColumnIndex),
150                    MergeColumnCount = b.Count() - 1,//排除自身
151                }).ToList();
152 
153             return excelTitles;
154         }
155     }
156 
157     public class ExcelTitle
158     {
159         /// <summary>
160         /// 标题
161         /// </summary>
162         public string Title { get; set; }
163 
164         /// <summary>
165         /// 开始行
166         /// </summary>
167         public int StartRow { get; set; }
168 
169         /// <summary>
170         /// 合并行
171         /// </summary>
172         public int MergeRowCount { get; set; }
173 
174 
175         /// <summary>
176         /// 开始列
177         /// </summary>
178         public int StartColumn { get; set; }
179 
180         /// <summary>
181         /// 合并列
182         /// </summary>
183         public int MergeColumnCount { get; set; }
184     }
185 
186     public class LevelExcelTitle
187     {
188         /// <summary>
189         /// 标题
190         /// </summary>
191         public string Title { get; set; }
192 
193         public string LevelCode { get; set; }
194 
195         /// <summary>
196         /// 第几行
197         /// </summary>
198         public int RowIndex { get; set; }
199 
200         /// <summary>
201         /// 第几列
202         /// </summary>
203         public int ColumnIndex { get; set; }
204 
205         /// <summary>
206         /// 总层
207         /// </summary>
208         public int TotalLevel { get; set; }
209     }
210 }

 

 

       

标签:Core,int,NPOI,tit,Add,表头,dt,public,Columns
From: https://www.cnblogs.com/Mrlvs5767/p/18529291/Mrlvs

相关文章

  • 如何使用nssm将asp.net core/.net6/.net8的webapi项目、mvc项目、控制台项目等注册为w
    nssm工具可以将asp.netFramework、asp.netcore、net6、.net8、.net10及后续本的的webapi项目、mvc项目、控制台项目、winform项、WPF项目等注册为windows服务。不仅限于上面这些,nssm可以将所有windows可执行文件注册为windows服务。下面,使用nssm将asp.net8的webapi项目注册为w......
  • CentOS 7 下安装部署.NET Core多版本环境
    文章目录一、前言1、什么时候需要配置多环境?2、环境信息二、部署过程1、SDK下载&安装基础依赖2、配置环境入口三、问题一、前言1、什么时候需要配置多环境?.NETCore作为.NET的开源版本,可以说是非常拥抱开源了,更新的力度也非常给力。却也从开源世界学了点坏东西,那......
  • .net core 项目使用log4net
    引入nuget包 1.增加一个log4Net.config的文件<?xmlversion="1.0"encoding="utf-8"?><log4net><appendername="DebugAppender"type="log4net.Appender.DebugAppender"><layouttype="log4n......
  • .net core 使用定时任务 quartz.net 实例
    项目是core3.1的 只用引用一个包就可以了引用配置Quartz首先创建一个任务工厂publicclassCronJobFactory:IJobFactory{privatereadonlyIServiceProvider_serviceProvider;publicCronJobFactory(IServiceProviderserviceProvider){_ser......
  • 在不受支持的 Mac 上安装 macOS Sequoia (OpenCore Legacy Patcher v2.1.0)
    在不受支持的Mac上安装macOSSequoia(OpenCoreLegacyPatcherv2.1.0)InstallmacOSonunsupportedMacs请访问原文链接:在不受支持的Mac上安装macOS(索引页面)查看最新版。原创作品,转载请保留出处。作者主页:sysin.org2024-11-01,OpenCoreLegacyPatcher2.1.0发......
  • ASP.Net Core使用Jenkins配合pm2自动化部署项目
    一. 新建一个自由风格的软件项目二.General配置(参数化构建)1.用来选择部署的服务器(我这里只添加了一个,如果需要添加多个,一行一个就可以了) 2.选择不同的环境变量三、源码管理1.填写Github项目地址,选择Credential(Credential需要自己新建,根据自己情况添加即可)。2.在......
  • Ubuntu24.04部署AspNetCore运行环境记录
    最近腾讯云轻量服务器centos7.9到期了,续费太贵,于是整了一个ubuntu24.04服务器,来继续折腾,主要是上面部署的前几年写的垃圾小程序,要不然也懒得折腾了。此篇文章就是记录运行环境安装的过程。安装mysql5.7.44本来想安装8.0的,直接使用apt安装方便快捷,但是想了想还是使用5.7吧,之前......
  • 如何使用Ida Pro和Core Dump文件定位崩溃位置(Linux下无调试符号的进程专享)
    我们在嵌入式Linux开发过程中经常会遇到一个问题,就是程序崩溃后不知道具体位置。因为我们发布到生产环境的一般是没有调试符号的(使用strip或编译时加-s参数,CMake生成的编译指令中的-O3也会造成调试符号丢失),毕竟嵌入式的存储都比较有限,肯定是需要剥离调试符号的。另外一个......
  • .NET 8 中 Entity Framework Core 的使用
    本文代码:https://download.csdn.net/download/hefeng_aspnet/89935738 概述        EntityFrameworkCore(EFCore)已成为.NET开发中数据访问的基石工具,为开发人员提供了强大而多功能的解决方案。随着.NET8和C#10中引入的改进,开发人员现在可以使用更丰......
  • Microsoft Entity Framework Core 8 示例
            微软于2023年11月发布了最新版本的EntityFrameworkCore,该版本与EntityFrameworkCore7相比有很大变化。        要查看新增内容,请查看Microsoft文档EFCore8中的新增功能以及EFCore8文档中的重大变更。        每次发布E......