NPOI版本:2.2.1.0
最近公司有這樣的需求:
統計每個部門下面,多個費用使用情況。部門存在多級,但統計時,只需統計到2級,2級以下的,歸到第2級的部門下。并且要求,第2級部門有個小計,第1級部門需要有個合計。最后,還需提供總計。
本來對NPOI研究的還不夠深入的,以前都是直接通過別人提供的代碼來實現對DataTable中的數據進行全部導出,但里面不帶合并,及合計功能,不滿足當前需求。不得已,只有好好地研究一下了。還好,最終實現了要求。
在此,也感謝其他提供相關資料的人員,讓我實現了此功能。
簡要說明一下使用:
1、Export2Template2方法直接使用。DataTable原始數據,必須是已經按要求排好序的數據。全部是逐行向下處理。
2、要導出的列名,取自cellKeys中。列名必須為source中存在的。
3、相同值合并的第1列,為cellKeys[0],合并的第2列,為cellKeys[1],如需要其它列的合并,可以此基礎上,按自己的需求進行調整。(合并時,只會比較上下行的數據內容)
4、要導出的數據中,數值類型,自動居右。其它類型,自動居中。
5、小計,合計,總計的字體,全部加黑
6、小計,合計,總計,自動對數值類型進行匯總。其它類型數據全部置空。
7、合并的列數:mergeColumns。如果>2,自動只處理前2列。如果<1,則不做合并處理。
直接上可用的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
|
/// < summary > /// 根據模版導出Excel -- 特別處理,每個分組帶合計 /// </ summary > /// < param name = "source" >源DataTable</ param > /// < param name = "cellKeys" >需要導出的對應的列字段 例:string[] cellKeys = { "Date","Remarks" };</ param > /// < param name = "strFileName" >要保存的文件名稱(包含后綴) 例:"要保存的文件名.xls"</ param > /// < param name = "templateFile" >模版文件名(包含路徑后綴) 例:"模板文件名.xls"</ param > /// < param name = "rowIndex" >從第幾行開始創建數據行,第一行為0</ param > /// < param name = "mergeColumns" >值相同時,可合并的前幾列 最多支持2列 1=只合并第一列,2=判斷前2列</ param > /// < param name = "isConver" >是否覆蓋數據,=false,將把原數據下移。=true,將覆蓋插入行后面的數據</ param > /// < param name = "isTotal" >是否帶小計/合計項</ param > /// < param name = "addAllTotal" >是否添加總計項</ param > /// < returns >是否導出成功</ returns > public static bool Export2Template2(DataTable source, string[] cellKeys, string strFileName, string templateFile, int rowIndex, int mergeColumns, bool isConver, bool isTotal, bool addAllTotal) { bool bn = false; int cellCount = cellKeys.Length; //總列數,第一列為0 // IWorkbook workbook = null; HSSFWorkbook workbook = null; string temp0 = "", temp1 = ""; int start0 = 0, start1 = 0; // 記錄1,2列值相同的開始序號 int end0 = 0, end1 = 0;// 記錄1,2列值相同的結束序號 try { using (FileStream file = new FileStream(templateFile, FileMode.Open, FileAccess.Read)) { workbook = new HSSFWorkbook(file); } #region 定義四類數據的單元格樣式 // 內容數據格式 -- 數值 ICellStyle styleNum = workbook.CreateCellStyle(); styleNum.BorderBottom = BorderStyle.Thin; styleNum.BorderLeft = BorderStyle.Thin; styleNum.BorderRight = BorderStyle.Thin; styleNum.BorderTop = BorderStyle.Thin; // styleNum.VerticalAlignment = VerticalAlignment.Center; // styleNum.Alignment = HorizontalAlignment.Center; // 內容數據格式 -- 字符串(做居中處理) ICellStyle styleStr = workbook.CreateCellStyle(); styleStr.BorderBottom = BorderStyle.Thin; styleStr.BorderLeft = BorderStyle.Thin; styleStr.BorderRight = BorderStyle.Thin; styleStr.BorderTop = BorderStyle.Thin; styleStr.VerticalAlignment = VerticalAlignment.Center; styleStr.Alignment = HorizontalAlignment.Center; // 匯總數據格式 -- 數值 ICellStyle styleTotalNum = workbook.CreateCellStyle(); styleTotalNum.BorderBottom = BorderStyle.Thin; styleTotalNum.BorderLeft = BorderStyle.Thin; styleTotalNum.BorderRight = BorderStyle.Thin; styleTotalNum.BorderTop = BorderStyle.Thin; styleTotalNum.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index; styleTotalNum.FillPattern = FillPattern.SolidForeground; styleTotalNum.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.Red.Index; // 設置字體顏色 HSSFFont ffont0 = (HSSFFont)workbook.CreateFont(); // ffont0.FontHeight = 14 * 14; // ffont0.FontName = "宋體"; ffont0.IsBold = true; //ffont0.Color = HSSFColor.Red.Index; styleTotalNum.SetFont(ffont0); // 匯總數據格式 -- 字符串(做居中處理) ICellStyle styleTotalStr = workbook.CreateCellStyle(); styleTotalStr.BorderBottom = BorderStyle.Thin; styleTotalStr.BorderLeft = BorderStyle.Thin; styleTotalStr.BorderRight = BorderStyle.Thin; styleTotalStr.BorderTop = BorderStyle.Thin; styleTotalStr.VerticalAlignment = VerticalAlignment.Center; styleTotalStr.Alignment = HorizontalAlignment.Center; styleTotalStr.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index; styleTotalStr.FillPattern = FillPattern.SolidForeground; // 設置字體顏色 HSSFFont ffont1 = (HSSFFont)workbook.CreateFont(); // ffont1.FontHeight = 14 * 14; // ffont1.FontName = "宋體"; ffont1.IsBold = true; //ffont.Color = HSSFColor.Red.Index; styleTotalStr.SetFont(ffont1); #endregion ISheet sheet = workbook.GetSheetAt(0); // 打開第一個sheet頁 if (sheet != null && source != null && source.Rows.Count > 0) // 模板內容為空,不做處理 { IRow row; for (int i = 0, len = source.Rows.Count; i < len ; i++) { if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false); // 不覆蓋,數據向下移 #region 第一行,寫入數據后,對變量賦初值 if (i == 0) // 第一行,賦初值 { row = sheet .CreateRow(rowIndex); #region 創建列并插入數據 //創建列并插入數據 for (int index = 0 ; index < cellCount; index++) { ICell cell = row .CreateCell(index); string strValue = !(source.Rows[i][cellKeys[index]] is DBNull) ? source.Rows[i][cellKeys[index]].ToString() : string.Empty; // 其它列數據,數值進行匯總 switch (source.Columns[cellKeys[index]].DataType.ToString()) { case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": int intV = 0 ; int.TryParse(strValue, out intV); cell.CellStyle = styleNum ; // 設置格式 cell.SetCellValue(intV); break; case "System.Decimal": //浮點型 case "System.Double": case "System.Single": double doubV = 0 ; double.TryParse(strValue, out doubV); cell.CellStyle = styleNum ; // 設置格式 cell.SetCellValue(doubV); break; default: cell.CellStyle = styleStr ; // 設置格式 cell.SetCellValue(strValue); break; } } #endregion if (mergeColumns > 0) { temp0 = source.Rows[i][cellKeys[0]].ToString(); // 保存第1列值 start0 = rowIndex; end0 = rowIndex; } if (mergeColumns > 1) { temp1 = source.Rows[i][cellKeys[1]].ToString(); // 保存第2列值 start1 = rowIndex; end1 = rowIndex; } rowIndex++; continue; } #endregion // 不是第一行數據的處理 // 判斷1列值變化沒 string cellText0 = source.Rows[i][cellKeys[0]].ToString(); if (temp0 != cellText0) // 第1列值有變化 { #region 第2列要合并 if (mergeColumns > 1) // 第2列要合并 { if (start1 != end1) // 開始行和結束行不相同,才進行合并 { CellRangeAddress region1 = new CellRangeAddress(start1, end1, 1, 1); // 合并第二列 sheet.AddMergedRegion(region1); } #region 第2列加小計 if (isTotal) // 加小計 { if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false); // 不覆蓋,數據向下移 IRow rowTotal1 = sheet.CreateRow(rowIndex); //創建列并插入數據 #region 插入小計數據 for (int index = 0; index < cellCount ; index++) { object obj1; ICell newcell = rowTotal1 .CreateCell(index); if (index == 0) //第1列 { newcell.CellStyle = styleTotalStr ; newcell.SetCellValue(temp0); continue; } if (index == 1) // 第2列 { newcell.CellStyle = styleTotalStr ; newcell.SetCellValue("小計"); continue; } // 其它列數據,數值進行匯總 switch (source.Columns[cellKeys[index]].DataType.ToString()) { case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": obj1 = source .Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' and {2} = '{3}' ", cellKeys[0], temp0, cellKeys[1], temp1)); int intV = 0 ; int.TryParse(obj1.ToString(), out intV); newcell.CellStyle = styleTotalNum ; newcell.SetCellValue(intV); break; case "System.Decimal": //浮點型 case "System.Double": case "System.Single": obj1 = source .Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' and {2} = '{3}' ", cellKeys[0], temp0, cellKeys[1], temp1)); double doubV = 0 ; double.TryParse(obj1.ToString(), out doubV); newcell.CellStyle = styleTotalNum ; newcell.SetCellValue(doubV); break; default: newcell.CellStyle = styleTotalStr ; newcell.SetCellValue(""); break; } } #endregion // 合并小計 CellRangeAddress region0 = new CellRangeAddress(rowIndex, rowIndex, 1, 2); // 合并小計 sheet.AddMergedRegion(region0); } #endregion temp1 = source .Rows[i][cellKeys[1]].ToString(); end0++; rowIndex++; } #endregion #region 第1列要合并 if (mergeColumns > 0) // 第1列要合并 { if (start0 != end0) // 開始行和結束行不相同,才進行合并 { CellRangeAddress region0 = new CellRangeAddress(start0, end0, 0, 0); // 合并第二列 sheet.AddMergedRegion(region0); } #region 第1列加合計 if (isTotal) // 加合計 { if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false); // 不覆蓋,數據向下移 IRow rowTotal0 = sheet.CreateRow(rowIndex); //創建列并插入數據 #region 加合計列 for (int index = 0; index < cellCount ; index++) { object obj1; ICell newcell = rowTotal0 .CreateCell(index); if (index == 0) { newcell.CellStyle = styleTotalStr ; newcell.SetCellValue("合計"); //第1列 continue; } if (index == 1) { newcell.CellStyle = styleTotalStr ; newcell.SetCellValue(""); // 第2列 continue; } switch (source.Columns[cellKeys[index]].DataType.ToString()) { case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": obj1 = source .Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' ", cellKeys[0], temp0)); int intV = 0 ; int.TryParse(obj1.ToString(), out intV); newcell.CellStyle = styleTotalNum ; newcell.SetCellValue(intV); break; case "System.Decimal": //浮點型 case "System.Double": case "System.Single": obj1 = source .Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' ", cellKeys[0], temp0)); double doubV = 0 ; double.TryParse(obj1.ToString(), out doubV); newcell.CellStyle = styleTotalNum ; newcell.SetCellValue(doubV); break; default: newcell.CellStyle = styleTotalStr ; newcell.SetCellValue(""); break; } } #endregion // 合并合計 CellRangeAddress region0 = new CellRangeAddress(rowIndex, rowIndex, 0, 2); // 合并合計 sheet.AddMergedRegion(region0); end0++; rowIndex++; } #endregion temp0 = cellText0 ; } #endregion // 重新賦值 start0 = rowIndex ; end0 = rowIndex ; start1 = rowIndex ; end1 = rowIndex ; } else // 第1列值沒有變化 { end0++; // 判斷第2列是否有變化 string cellText1 = source .Rows[i][cellKeys[1]].ToString(); if (cellText1 != temp1) // 第1列沒變,第2列變化 { #region 第2列要合并 if (mergeColumns > 1) // 第2列要合并 { if (start1 != end1) // 開始行和結束行不相同,才進行合并 { CellRangeAddress region1 = new CellRangeAddress(start1, end1, 1, 1); // 合并第二列 sheet.AddMergedRegion(region1); } #region 第2列加小計 if (isTotal) // 加小計 { if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false); // 不覆蓋,數據向下移 IRow rowTotal1 = sheet.CreateRow(rowIndex); //創建列并插入數據 #region 插入小計數據 for (int index = 0; index < cellCount ; index++) { object obj1; ICell newcell = rowTotal1 .CreateCell(index); if (index == 0) //第1列 { newcell.CellStyle = styleTotalStr ; newcell.SetCellValue(temp0); continue; } if (index == 1) // 第2列 { newcell.CellStyle = styleTotalStr ; newcell.SetCellValue("小計"); continue; } // 其它列數據,數值進行匯總 switch (source.Columns[cellKeys[index]].DataType.ToString()) { case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": obj1 = source .Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' and {2} = '{3}' ", cellKeys[0], temp0, cellKeys[1], temp1)); int intV = 0 ; int.TryParse(obj1.ToString(), out intV); newcell.CellStyle = styleTotalNum ; newcell.SetCellValue(intV); break; case "System.Decimal": //浮點型 case "System.Double": case "System.Single": obj1 = source .Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' and {2} = '{3}' ", cellKeys[0], temp0, cellKeys[1], temp1)); double doubV = 0 ; double.TryParse(obj1.ToString(), out doubV); newcell.CellStyle = styleTotalNum ; newcell.SetCellValue(doubV); break; default: newcell.CellStyle = styleTotalStr ; newcell.SetCellValue(""); break; } } #endregion // 合并小計 CellRangeAddress region0 = new CellRangeAddress(rowIndex, rowIndex, 1, 2); // 合并小計 sheet.AddMergedRegion(region0); end0++; rowIndex++; } temp1 = cellText1 ; // 要合并,才進行重新賦值 start1 = rowIndex ; end1 = rowIndex ; #endregion } #endregion } else // 第1列值沒變,第2列也沒變 end1++; } // 插入當前數據 row = sheet .CreateRow(rowIndex); #region 創建行并插入當前記錄的數據 //創建行并插入當前記錄的數據 for (int index = 0 ; index < cellCount; index++) { ICell cell = row .CreateCell(index);<br> string strValue = !(source.Rows[i][cellKeys[index]] is DBNull) ? source.Rows[i][cellKeys[index]].ToString() : string.Empty; // 取值 switch (source.Columns[cellKeys[index]].DataType.ToString()) { case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": int intV = 0; int.TryParse(strValue, out intV); cell.CellStyle = styleNum; cell.SetCellValue(intV); break; case "System.Decimal": //浮點型 case "System.Double": case "System.Single": double doubV = 0; double.TryParse(strValue, out doubV); cell.CellStyle = styleNum; cell.SetCellValue(doubV); break; default: cell.CellStyle = styleStr; cell.SetCellValue(strValue); break; } } #endregion // 下移一行 rowIndex++; } // 最后一條記錄的合計 #region 對第2列進行合并 if (mergeColumns > 1) // 對第2列合并 { if (start1 != end1) // 開始行和結束行不等,進行合并 { CellRangeAddress region1 = new CellRangeAddress(start1, end1, 1, 1); // 合并第二列 sheet.AddMergedRegion(region1); } #region 第2列加小計 if (isTotal) // 加小計 { if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false); // 不覆蓋,數據向下移 IRow rowTotal1 = sheet.CreateRow(rowIndex); //創建列并插入數據 #region 插入小計數據 for (int index = 0; index < cellCount ; index++) { object obj1; ICell newcell = rowTotal1 .CreateCell(index); #region 列值處理 if (index == 0) //第1列 { newcell.CellStyle = styleTotalStr ; newcell.SetCellValue(temp0); continue; } if (index == 1) // 第2列 { newcell.CellStyle = styleTotalStr ; newcell.SetCellValue("小計"); continue; } // 其它列數據,數值進行匯總 switch (source.Columns[cellKeys[index]].DataType.ToString()) { case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": obj1 = source .Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' and {2} = '{3}' ", cellKeys[0], temp0, cellKeys[1], temp1)); int intV = 0 ; int.TryParse(obj1.ToString(), out intV); newcell.CellStyle = styleTotalNum ; newcell.SetCellValue(intV); break; case "System.Decimal": //浮點型 case "System.Double": case "System.Single": obj1 = source .Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' and {2} = '{3}' ", cellKeys[0], temp0, cellKeys[1], temp1)); double doubV = 0 ; double.TryParse(obj1.ToString(), out doubV); newcell.CellStyle = styleTotalNum ; newcell.SetCellValue(doubV); break; default: newcell.CellStyle = styleTotalStr ; newcell.SetCellValue(""); break; } #endregion } #endregion // 合并小計 CellRangeAddress region0 = new CellRangeAddress(rowIndex, rowIndex, 1, 2); // 合并小計 sheet.AddMergedRegion(region0); rowIndex++; end0++; } #endregion } #endregion #region 對第1列合并 if (mergeColumns > 0) // 對第1列合并 { if (start0 != end0) // 開始行和結束行不等,進行合并 { CellRangeAddress region1 = new CellRangeAddress(start0, end0, 0, 0); // 合并第二列 sheet.AddMergedRegion(region1); } #region 第1列加合計 if (isTotal) // 加合計 { if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false); // 不覆蓋,數據向下移 IRow rowTotal0 = sheet.CreateRow(rowIndex); //創建列并插入數據 #region 插入合計數據 for (int index = 0; index < cellCount; index++) { object obj1; ICell newcell = rowTotal0.CreateCell(index); #region 列值處理 if (index == 0) //第1列 { newcell.CellStyle = styleTotalStr; newcell.SetCellValue("合計"); continue; } if (index == 1) // 第2列 { newcell.CellStyle = styleTotalStr; newcell.SetCellValue(""); continue; } // 其它列數據,數值進行匯總 switch (source.Columns[cellKeys[index]].DataType.ToString()) { case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' ", cellKeys[0], temp0)); int intV = 0; newcell.CellStyle = styleTotalNum; int.TryParse(obj1.ToString(), out intV); newcell.SetCellValue(intV); break; case "System.Decimal": //浮點型 case "System.Double": case "System.Single": obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), string.Format("{0} = '{1}' ", cellKeys[0], temp0)); double doubV = 0; double.TryParse(obj1.ToString(), out doubV); newcell.CellStyle = styleTotalNum; newcell.SetCellValue(doubV); break; default: newcell.CellStyle = styleTotalStr; newcell.SetCellValue(""); break; } #endregion } #endregion // 合并合計 CellRangeAddress region0 = new CellRangeAddress(rowIndex, rowIndex, 0, 2); // 合并合計 sheet.AddMergedRegion(region0); } rowIndex++; #endregion } #endregion #region 進行匯總 - 加總計 if (addAllTotal) // 加總計 { if (!isConver) sheet.ShiftRows(rowIndex, sheet.LastRowNum, 1, true, false); // 不覆蓋,數據向下移 IRow rowTotal0 = sheet.CreateRow(rowIndex); //創建列并插入數據 #region 插入總計數據 for (int index = 0; index < cellCount; index++) { object obj1; ICell newcell = rowTotal0.CreateCell(index); #region 列值處理 if (index == 0) //第1列 { newcell.CellStyle = styleTotalStr; newcell.SetCellValue("總計"); continue; } if (index == 1) // 第2列 { newcell.CellStyle = styleTotalStr; newcell.SetCellValue(""); continue; } // 其它列數據,數值進行匯總 switch (source.Columns[cellKeys[index]].DataType.ToString()) { case "System.Int16": //整型 case "System.Int32": case "System.Int64": case "System.Byte": obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), ""); int intV = 0; int.TryParse(obj1.ToString(), out intV); newcell.CellStyle = styleTotalNum; newcell.SetCellValue(intV); break; case "System.Decimal": //浮點型 case "System.Double": case "System.Single": obj1 = source.Compute(string.Format("sum({0})", cellKeys[index]), ""); double doubV = 0; double.TryParse(obj1.ToString(), out doubV); newcell.CellStyle = styleTotalNum; newcell.SetCellValue(doubV); break; default: newcell.CellStyle = styleTotalStr; newcell.SetCellValue(""); break; } #endregion } #endregion // 合并總計 CellRangeAddress region0 = new CellRangeAddress(rowIndex, rowIndex, 0, 2); // 合并總計 sheet.AddMergedRegion(region0); } #endregion } return Save2Xls(strFileName, workbook); // 保存為xls文件 } catch (Exception ex) { // FileHelper.WriteLine(logfile, "處理數據異常:" + ex.Message); // msg = ex.Message; } return bn; } |
保存文件的代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public static bool Save2Xls(string fileName, IWorkbook workbook) { bool bn = false; try { FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate); MemoryStream ms = new MemoryStream(); workbook.Write(ms); BinaryWriter w = new BinaryWriter(fs); w.Write(ms.ToArray()); fs.Close(); ms.Close(); bn = true; } catch(Exception ex) { //FileHelper.WriteLine(logfile, "保存文件異常:" + ex.Message); } return bn; } |
以上這篇NPOI實現兩級分組合并功能(示例講解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/zyxlsh/archive/2017/12/07/8000166.html