翼度科技»论坛 编程开发 .net 查看内容

.Net Core NPOI 导出多级表头

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
 想要导出这样的表格

 
数据准备格式
 

 
 
附上源码

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具