1 using System;
2 using System.Collections.Generic;
3 using System.Data;
4 using System.IO;
5 using System.Text;
6 using System.Web;
7 using NPOI;
8 using NPOI.HPSF;
9 using NPOI.HSSF;
10 using NPOI.HSSF.Record;
11 using NPOI.HSSF.UserModel;
12 using NPOI.HSSF.Util;
13 using NPOI.XSSF;
14 using NPOI.XSSF.UserModel;
15 using NPOI.XSSF.Util;
16 using NPOI.POIFS;
17 using NPOI.SS.UserModel;
18 using NPOI.Util;
19 using NPOI.SS;
20 using NPOI.DDF;
21 using NPOI.SS.Util;
22 using System.Collections;
23 using System.Text.RegularExpressions;
24
25 public class ExcelHelper
26 {
27 #region 从datatable中将数据导出到excel
28 public static HSSFWorkbook ExportWorkbook(DataTable dtSource, string SheetName, string ColumnProperty)
29 {
30 HSSFWorkbook workbook = new HSSFWorkbook();
31 if (SheetName == null || SheetName == "") SheetName = "Sheet1";
32 HSSFSheet sheet = workbook.CreateSheet(SheetName) as HSSFSheet;
33
34 // 标题样式
35 HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;
36 headStyle.Alignment = HorizontalAlignment.Center;
37 headStyle.VerticalAlignment = VerticalAlignment.Center;
38 headStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
39 headStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
40 headStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
41 headStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
42 headStyle.WrapText = true;
43 HSSFFont font = workbook.CreateFont() as HSSFFont;
44 font.Boldweight = (short)FontBoldWeight.Bold;
45 headStyle.SetFont(font);
46
47 //内容样式
48 HSSFCellStyle cellStyle = workbook.CreateCellStyle() as HSSFCellStyle;
49 cellStyle.CloneStyleFrom(headStyle);
50 cellStyle.Alignment = HorizontalAlignment.Center;
51 font = workbook.CreateFont() as HSSFFont;
52 font.Boldweight = (short)FontBoldWeight.Normal;
53 cellStyle.SetFont(font);
54 HSSFCellStyle cellStyleLeft = workbook.CreateCellStyle() as HSSFCellStyle;
55 cellStyleLeft.CloneStyleFrom(cellStyle);
56 cellStyleLeft.Alignment = HorizontalAlignment.Left;
57 HSSFCellStyle cellStyleRight = workbook.CreateCellStyle() as HSSFCellStyle;
58 cellStyleRight.CloneStyleFrom(cellStyle);
59 cellStyleRight.Alignment = HorizontalAlignment.Right;
60
61 int rowIndex = 0;
62 #region 列头及样式
63 HSSFRow headerRow = sheet.CreateRow(rowIndex) as HSSFRow;
64 foreach (DataColumn column in dtSource.Columns)
65 {
66 headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
67 headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
68 }
69 #endregion
70 rowIndex++;
71 foreach (DataRow row in dtSource.Rows)
72 {
73 #region 填充内容
74 HSSFRow dataRow = sheet.CreateRow(rowIndex) as HSSFRow;
75 foreach (DataColumn column in dtSource.Columns)
76 {
77 HSSFCell newCell = dataRow.CreateCell(column.Ordinal) as HSSFCell;
78 newCell.CellStyle = cellStyle;
79 AutoSetType(newCell, column, row);
80 }
81
82 #endregion
83 rowIndex++;
84 }
85 AutoSizeColumns(sheet);
86
87 if (ColumnProperty != null)
88 {
89 string[] ColumnArray = ColumnProperty.Split('|');
90 foreach (string Column in ColumnArray)
91 {
92 string[] ValueArray = Column.Split(',');
93 if (ValueArray.Length > 2)
94 {
95 int cols = int.Parse(ValueArray[1]);
96 switch (ValueArray[0].ToString())
97 {
98 case "Merge":
99 int precols = 0;
100 int.TryParse(ValueArray[2], out precols);
101 GroupCol(sheet, 1, cols, precols);
102 break;
103 case "Width":
104 int columnWidth = 0;
105 int.TryParse(ValueArray[2], out columnWidth);
106 sheet.SetColumnWidth(cols, columnWidth * 256);
107 break;
108 case "Align":
109 string Value = ValueArray[2].ToString();
110 for (int j = 1; j <= sheet.LastRowNum; j++)
111 {
112 ICell currentCell = sheet.GetRow(j).GetCell(cols);
113 switch (Value)
114 {
115 case "center":
116 currentCell.CellStyle = cellStyle;
117 break;
118 case "left":
119 currentCell.CellStyle = cellStyleLeft;
120 break;
121 case "right":
122 currentCell.CellStyle = cellStyleRight;
123 break;
124 }
125 }
126 break;
127 case "DataType":
128 string Value2 = ValueArray[2].ToString();
129 for (int j = 1; j <= sheet.LastRowNum; j++)
130 {
131 ICell currentCell = sheet.GetRow(j).GetCell(cols);
132 string drValue = currentCell.ToString();
133 switch (Value2)
134 {
135 case "double":
136 double result;
137 if (double.TryParse(drValue, out result))
138 currentCell.SetCellValue(result);
139 break;
140 case "string":
141 currentCell.SetCellValue(drValue.ToString());
142 break;
143 }
144 }
145 break;
146 }
147 }
148 }
149 }
150 return workbook;
151 }
152
153 /// <summary>
154 /// DataTable导出到Excel的MemoryStream
155 /// </summary>
156 /// <param name="dtSource">源DataTable</param>
157 public static MemoryStream ExportDT(DataTable dtSource, string SheetName, string ColumnProperty)
158 {
159 using (MemoryStream ms = new MemoryStream())
160 {
161 HSSFWorkbook workbook = ExportWorkbook(dtSource, SheetName, ColumnProperty);
162 workbook.Write(ms);
163 ms.Flush();
164 ms.Position = 0;
165 return ms;
166 }
167 }
168
169 public static void ExportDTtoExcel(DataTable dtSource, string strFileName, bool SaveFile)
170 {
171 ExportDTtoExcel(dtSource, strFileName, SaveFile, null, null);
172 }
173
174 /// <summary>
175 /// DataTable导出到Excel文件
176 /// </summary>
177 /// <param name="dtSource">源DataTable</param>
178 /// <param name="sFileName">文件名</param>
179 /// <param name="SaveFile">是否需保存</param>
180 /// <param name="SheetName">Sheet名</param>
181 /// <param name="ColumnProperty">列属性集,多个属性集以"|"分隔,值以","分隔,范例:"Merge,0,0|Align,2,right|Width,4,100|DataType,5,double"</param>
182 public static void ExportDTtoExcel(DataTable dtSource, string sFileName, bool SaveFile, string SheetName, string ColumnProperty)
183 {
184 using (MemoryStream ms = ExportDT(dtSource, SheetName, ColumnProperty))
185 {
186 if (SaveFile)
187 {
188 using (FileStream fs = new FileStream(sFileName, FileMode.Create, FileAccess.Write))
189 {
190 byte[] data = ms.ToArray();
191 fs.Write(data, 0, data.Length);
192 fs.Flush();
193 }
194 System.IO.FileInfo fileInfo = new System.IO.FileInfo(sFileName);
195 sFileName = fileInfo.Name;
196 }
197 System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename=" + HttpUtility.UrlEncode(sFileName)));
198 System.Web.HttpContext.Current.Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
199 System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray());
200 System.Web.HttpContext.Current.Response.Flush();
201 ms.Close();
202 ms.Dispose();
203 System.Web.HttpContext.Current.Response.End();
204 }
205 }
206
207 /// <summary>
208 /// 导出EXCEL,可以导出多个sheet(不设置列宽)
209 /// </summary>
210 /// <param name="dtSources">原始数据表</param>
211 /// <param name="strFileName">文件名</param>
212 /// <param name="SaveFile">是否需要保存此文件</param>
213 /// <param name="NeedMargeColumns">需要合并的列,如:3,5</param>
214 public static void ExportDTtoExcelNoWidth(DataTable[] dtSources, string strFileName, bool SaveFile, string NeedMargeColumns)
215 {
216 HSSFWorkbook workbook = new HSSFWorkbook();
217 if (NeedMargeColumns.Length > 0)
218 {
219 NeedMargeColumns = "," + NeedMargeColumns + ",";
220 }
221 HSSFCellStyle dateStyle = workbook.CreateCellStyle() as HSSFCellStyle;
222 HSSFDataFormat format = workbook.CreateDataFormat() as HSSFDataFormat;
223 dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
224 for (int k = 0; k < dtSources.Length; k++)
225 {
226 int[] margeColIndex = new int[dtSources[k].Columns.Count];//保存合并列的起始行
227 string[] margeColValue = new string[dtSources[k].Columns.Count];//保存合并列对应的上一个值
228 HSSFSheet sheet = workbook.CreateSheet(dtSources[k].TableName.ToString()) as HSSFSheet;
229 //填充表头
230 HSSFRow dataRow = sheet.CreateRow(0) as HSSFRow;
231 ICellStyle Headstyle = workbook.CreateCellStyle();
232 //设置单元格的样式:水平对齐居中
233 Headstyle.Alignment = HorizontalAlignment.Center;
234 //新建一个字体样式对象
235 IFont font = workbook.CreateFont();
236 //设置字体加粗样式
237 font.Boldweight = short.MaxValue;
238 //使用SetFont方法将字体样式添加到单元格样式中
239 Headstyle.SetFont(font);
240 foreach (DataColumn column in dtSources[k].Columns)
241 {
242 margeColIndex[column.Ordinal] = 1;
243 margeColValue[column.Ordinal] = "";
244 ICell cell = dataRow.CreateCell(column.Ordinal);//创建单元格
245 cell.SetCellValue(column.ColumnName);//设置单元格的值
246 dataRow.GetCell(column.Ordinal).CellStyle = Headstyle; //将新的样式赋给单元格
247 }
248 //填充内容
249 for (int i = 0; i < dtSources[k].Rows.Count; i++)
250 {
251 dataRow = sheet.CreateRow(i + 1) as HSSFRow;
252 for (int j = 0; j < dtSources[k].Columns.Count; j++)
253 {
254 ICell newCell = dataRow.CreateCell(j);
255 bool canSetValue = false;
256 if (NeedMargeColumns.Length > 0 && (NeedMargeColumns.IndexOf("," + j.ToString() + ",") != -1)) //有需要合并的列,并且当前列需要合并
257 {
258 if (margeColValue[j] == "")
259 {
260 canSetValue = true;
261 margeColIndex[j] = i + 1;
262 margeColValue[j] = dtSources[k].Rows[i][j].ToString();
263 }
264 else if (margeColValue[j] != dtSources[k].Rows[i][j].ToString())//不同的时候需要更新原来储存的值,并重新设置合并
265 {
266 canSetValue = true;
267 //CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
268 sheet.AddMergedRegion(new CellRangeAddress(margeColIndex[j], i, j, j));
269 margeColIndex[j] = i + 1;
270 margeColValue[j] = dtSources[k].Rows[i][j].ToString();
271 }
272 }
273 else
274 {
275 canSetValue = true;
276 }
277 if (canSetValue)
278 {
279 //需要合并的列,1.第一行/最后一行,2.上一行值不同,下一行值相同,则给当前单元格赋值
280 switch (dtSources[k].Columns[j].DataType.ToString())
281 {
282 case "System.String"://字符串类型
283 newCell.SetCellValue(dtSources[k].Rows[i][j].ToString());
284 break;
285 case "System.DateTime"://日期类型
286 DateTime dateV;
287 DateTime.TryParse(dtSources[k].Rows[i][j].ToString(), out dateV);
288 newCell.SetCellValue(dateV);
289 newCell.CellStyle = dateStyle;//格式化显示
290 break;
291 case "System.Boolean"://布尔型
292 bool boolV = false;
293 bool.TryParse(dtSources[k].Rows[i][j].ToString(), out boolV);
294 newCell.SetCellValue(boolV);
295 break;
296 case "System.Int16"://整型
297 case "System.Int32":
298 case "System.Int64":
299 case "System.Byte":
300 int intV = 0;
301 int.TryParse(dtSources[k].Rows[i][j].ToString(), out intV);
302 newCell.SetCellValue(intV);
303 break;
304 case "System.Decimal"://浮点型
305 case "System.Double":
306 double doubV = 0;
307 double.TryParse(dtSources[k].Rows[i][j].ToString(), out doubV);
308 newCell.SetCellValue(doubV);
309 break;
310 case "System.DBNull"://空值处理
311 newCell.SetCellValue("");
312 break;
313 default:
314 newCell.SetCellValue("");
315 break;
316 }
317 }
318 }
319 }
320 }
321 //保存
322 using (MemoryStream ms = new MemoryStream())
323 {
324 workbook.Write(ms);
325 ms.Flush();
326 ms.Position = 0;
327 if (SaveFile)
328 {
329 using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
330 {
331 byte[] data = ms.ToArray();
332 fs.Write(data, 0, data.Length);
333 fs.Flush();
334 }
335 System.IO.FileInfo fileInfo = new System.IO.FileInfo(strFileName);
336 strFileName = fileInfo.Name;
337 }
338 else
339 {
340 System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename=" + HttpUtility.UrlEncode(strFileName)));
341 System.Web.HttpContext.Current.Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
342 System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray());
343 System.Web.HttpContext.Current.Response.Flush();
344 ms.Close();
345 ms.Dispose();
346 System.Web.HttpContext.Current.Response.End();
347 }
348 }
349 }
350 /// <summary>
351 /// 导出EXCEL,可以导出多个sheet
352 /// </summary>
353 /// <param name="dtSources">原始数据表</param>
354 /// <param name="strFileName">文件名</param>
355 /// <param name="SaveFile">是否需要保存此文件</param>
356 /// <param name="NeedMargeColumns">需要合并的列,如:3,5(表示第三列和第五列各自合并单元格)</param>
357 public static void ExportDTtoExcel(DataTable[] dtSources, string strFileName, bool SaveFile, string NeedMargeColumns)
358 {
359 HSSFWorkbook workbook = new HSSFWorkbook();
360 if (NeedMargeColumns.Length > 0)
361 {
362 NeedMargeColumns = "," + NeedMargeColumns + ",";
363 }
364 HSSFCellStyle dateStyle = workbook.CreateCellStyle() as HSSFCellStyle;
365 HSSFDataFormat format = workbook.CreateDataFormat() as HSSFDataFormat;
366 dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
367 for (int k = 0; k < dtSources.Length; k++)
368 {
369 int[] margeColIndex = new int[dtSources[k].Columns.Count];//保存合并列的起始行
370 string[] margeColValue = new string[dtSources[k].Columns.Count];//保存合并列对应的上一个值
371 HSSFSheet sheet = workbook.CreateSheet(dtSources[k].TableName.ToString()) as HSSFSheet;
372 //填充表头
373 HSSFRow dataRow = sheet.CreateRow(0) as HSSFRow;
374 ICellStyle Headstyle = workbook.CreateCellStyle();
375 //设置单元格的样式:水平对齐居中
376 Headstyle.Alignment = HorizontalAlignment.Center;
377 //新建一个字体样式对象
378 IFont font = workbook.CreateFont();
379 //设置字体加粗样式
380 font.Boldweight = short.MaxValue;
381 //使用SetFont方法将字体样式添加到单元格样式中
382 Headstyle.SetFont(font);
383
384 ICellStyle Rowstyle = workbook.CreateCellStyle();
385 //设置单元格的样式:垂直对齐居中
386 Rowstyle.VerticalAlignment = VerticalAlignment.Justify;
387
388 //取得列宽
389 int[] arrColWidth = new int[dtSources[k].Columns.Count];
390 foreach (DataColumn item in dtSources[k].Columns)
391 {
392 arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
393 margeColIndex[item.Ordinal] = 1;
394 margeColValue[item.Ordinal] = "";
395 }
396 for (int i = 0; i < dtSources[k].Rows.Count; i++)
397 {
398 for (int j = 0; j < dtSources[k].Columns.Count; j++)
399 {
400 int intTemp = Encoding.GetEncoding(936).GetBytes(dtSources[k].Rows[i][j].ToString()).Length;
401 if (intTemp > arrColWidth[j])
402 {
403 arrColWidth[j] = intTemp;
404 }
405 }
406 }
407 foreach (DataColumn column in dtSources[k].Columns)
408 {
409 ICell cell = dataRow.CreateCell(column.Ordinal);//创建单元格
410 cell.SetCellValue(column.ColumnName);//设置单元格的值
411 dataRow.GetCell(column.Ordinal).CellStyle = Headstyle; //将新的样式赋给单元格
412 //设置列宽
413 //sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
414 if (arrColWidth[column.Ordinal] > 255)
415 {
416 arrColWidth[column.Ordinal] = 254;
417 }
418 else
419 {
420 sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
421 }
422 }
423 //填充内容
424 for (int i = 0; i < dtSources[k].Rows.Count; i++)
425 {
426 dataRow = sheet.CreateRow(i + 1) as HSSFRow;
427 for (int j = 0; j < dtSources[k].Columns.Count; j++)
428 {
429 ICell newCell = dataRow.CreateCell(j);
430 bool canSetValue = false;
431 if (NeedMargeColumns.Length > 0 && (NeedMargeColumns.IndexOf("," + j.ToString() + ",") != -1)) //有需要合并的列,并且当前列需要合并
432 {
433 if (margeColValue[j] == "")
434 {
435 canSetValue = true;
436 margeColIndex[j] = i + 1;
437 margeColValue[j] = dtSources[k].Rows[i][j].ToString();
438 }
439 else if (margeColValue[j] != dtSources[k].Rows[i][j].ToString())//不同的时候需要更新原来储存的值,并重新设置合并
440 {
441 canSetValue = true;
442 //CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
443 sheet.AddMergedRegion(new CellRangeAddress(margeColIndex[j], i, j, j));
444 margeColIndex[j] = i + 1;
445 margeColValue[j] = dtSources[k].Rows[i][j].ToString();
446 newCell.CellStyle = Rowstyle;
447 }
448 else if (i == dtSources[k].Rows.Count - 1 && i != 0)//最后一行强制合并
449 {
450 //值相同本来是不用做任何事,但是最后一行,则需要合并
451 sheet.AddMergedRegion(new CellRangeAddress(margeColIndex[j], i + 1, j, j));
452 newCell.CellStyle = Rowstyle;
453 }
454 }
455 else
456 {
457 canSetValue = true;
458 }
459 if (canSetValue)
460 {
461 //需要合并的列,1.第一行/最后一行,2.上一行值不同,下一行值相同,则给当前单元格赋值
462 switch (dtSources[k].Columns[j].DataType.ToString())
463 {
464 case "System.String"://字符串类型
465 newCell.SetCellValue(dtSources[k].Rows[i][j].ToString());
466 break;
467 case "System.DateTime"://日期类型
468 DateTime dateV;
469 DateTime.TryParse(dtSources[k].Rows[i][j].ToString(), out dateV);
470 newCell.SetCellValue(dateV);
471 newCell.CellStyle = dateStyle;//格式化显示
472 break;
473 case "System.Boolean"://布尔型
474 bool boolV = false;
475 bool.TryParse(dtSources[k].Rows[i][j].ToString(), out boolV);
476 newCell.SetCellValue(boolV);
477 break;
478 case "System.Int16"://整型
479 case "System.Int32":
480 case "System.Int64":
481 case "System.Byte":
482 int intV = 0;
483 int.TryParse(dtSources[k].Rows[i][j].ToString(), out intV);
484 newCell.SetCellValue(intV);
485 break;
486 case "System.Decimal"://浮点型
487 case "System.Double":
488 double doubV = 0;
489 double.TryParse(dtSources[k].Rows[i][j].ToString(), out doubV);
490 newCell.SetCellValue(doubV);
491 break;
492 case "System.DBNull"://空值处理
493 newCell.SetCellValue("");
494 break;
495 default:
496 newCell.SetCellValue("");
497 break;
498 }
499 }
500 }
501 }
502 }
503 //保存
504 using (MemoryStream ms = new MemoryStream())
505 {
506 workbook.Write(ms);
507 ms.Flush();
508 ms.Position = 0;
509 if (SaveFile)
510 {
511 using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
512 {
513 byte[] data = ms.ToArray();
514 fs.Write(data, 0, data.Length);
515 fs.Flush();
516 }
517 System.IO.FileInfo fileInfo = new System.IO.FileInfo(strFileName);
518 strFileName = fileInfo.Name;
519 }
520 System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename=" + HttpUtility.UrlEncode(strFileName)));
521 System.Web.HttpContext.Current.Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
522 System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray());
523 System.Web.HttpContext.Current.Response.Flush();
524 ms.Close();
525 ms.Dispose();
526 System.Web.HttpContext.Current.Response.End();
527 }
528 }
529 /// <summary>
530 /// 导出EXCEL,可以导出多个sheet
531 /// </summary>
532 /// <param name="dtSources">原始数据表</param>
533 /// <param name="strFileName">文件名</param>
534 /// <param name="SaveFile">是否需要保存此文件</param>
535 /// <param name="NeedMargeColumns">需要合并的列,如:3,5(表示第三列和第五列各自合并单元格)或者3,3:5(表示第三列合并,然后第五列合并时参考第三列再合并)</param>
536 public static void ExportDTtoExcelExt(DataTable[] dtSources, string strFileName, bool SaveFile, string NeedMargeColumns)
537 {
538 HSSFWorkbook workbook = new HSSFWorkbook();
539 if (NeedMargeColumns.Length > 0)
540 {
541 NeedMargeColumns = "," + NeedMargeColumns + ",";
542 }
543 HSSFCellStyle dateStyle = workbook.CreateCellStyle() as HSSFCellStyle;
544 HSSFDataFormat format = workbook.CreateDataFormat() as HSSFDataFormat;
545 dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
546 for (int k = 0; k < dtSources.Length; k++)
547 {
548 int[] margeColIndex = new int[dtSources[k].Columns.Count];//保存合并列的起始行
549 string[] margeColValue = new string[dtSources[k].Columns.Count];//保存合并列对应的上一个值
550 HSSFSheet sheet = workbook.CreateSheet(dtSources[k].TableName.ToString()) as HSSFSheet;
551 //填充表头
552 HSSFRow dataRow = sheet.CreateRow(0) as HSSFRow;
553 ICellStyle Headstyle = workbook.CreateCellStyle();
554 //设置单元格的样式:水平对齐居中
555 Headstyle.Alignment = HorizontalAlignment.Center;
556 //新建一个字体样式对象
557 IFont font = workbook.CreateFont();
558 //设置字体加粗样式
559 font.Boldweight = short.MaxValue;
560 //使用SetFont方法将字体样式添加到单元格样式中
561 Headstyle.SetFont(font);
562
563 ICellStyle Rowstyle = workbook.CreateCellStyle();
564 //设置单元格的样式:垂直对齐居中
565 Rowstyle.VerticalAlignment = VerticalAlignment.Justify;
566
567 //取得列宽
568 int[] arrColWidth = new int[dtSources[k].Columns.Count];
569 foreach (DataColumn item in dtSources[k].Columns)
570 {
571 arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
572 margeColIndex[item.Ordinal] = 1;
573 margeColValue[item.Ordinal] = "";
574 }
575 for (int i = 0; i < dtSources[k].Rows.Count; i++)
576 {
577 for (int j = 0; j < dtSources[k].Columns.Count; j++)
578 {
579 int intTemp = Encoding.GetEncoding(936).GetBytes(dtSources[k].Rows[i][j].ToString()).Length;
580 if (intTemp > arrColWidth[j])
581 {
582 arrColWidth[j] = intTemp;
583 }
584 }
585 }
586 foreach (DataColumn column in dtSources[k].Columns)
587 {
588 ICell cell = dataRow.CreateCell(column.Ordinal);//创建单元格
589 cell.SetCellValue(column.ColumnName);//设置单元格的值
590 dataRow.GetCell(column.Ordinal).CellStyle = Headstyle; //将新的样式赋给单元格
591 //设置列宽
592 //sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
593
594 if (arrColWidth[column.Ordinal] >= 255)
595 {
596 arrColWidth[column.Ordinal] = 254;
597 }
598 else
599 {
600 sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
601 }
602 }
603 //填充内容
604 for (int i = 0; i < dtSources[k].Rows.Count; i++)
605 {
606 dataRow = sheet.CreateRow(i + 1) as HSSFRow;
607 for (int j = 0; j < dtSources[k].Columns.Count; j++)
608 {
609 ICell newCell = dataRow.CreateCell(j);
610 bool canSetValue = false;
611 if (NeedMargeColumns.Length > 0 && (NeedMargeColumns.IndexOf("," + j.ToString() + ",") != -1 || NeedMargeColumns.IndexOf(":" + j.ToString() + ",") != -1)) //有需要合并的列,并且当前列需要合并
612 {
613 if (margeColValue[j] == "")
614 {
615 canSetValue = true;
616 margeColIndex[j] = i + 1;
617 margeColValue[j] = dtSources[k].Rows[i][j].ToString();
618 }
619 else if (NeedMargeColumns.IndexOf("," + j.ToString() + ",") != -1)//单独列合并
620 {
621 if (margeColValue[j] != dtSources[k].Rows[i][j].ToString())//不同的时候需要更新原来储存的值,并重新设置合并
622 {
623 canSetValue = true;
624 //CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
625 sheet.AddMergedRegion(new CellRangeAddress(margeColIndex[j], i, j, j));
626 margeColIndex[j] = i + 1;
627 margeColValue[j] = dtSources[k].Rows[i][j].ToString();
628 newCell.CellStyle = Rowstyle;
629 }
630 else if (i == dtSources[k].Rows.Count - 1 && i != 0)//最后一行强制合并
631 {
632 //值相同本来是不用做任何事,但是最后一行,则需要合并
633 sheet.AddMergedRegion(new CellRangeAddress(margeColIndex[j], i + 1, j, j));
634 newCell.CellStyle = Rowstyle;
635 }
636 }
637 else//参考前列合并
638 {
639 //获取前列
640 int refercol = 0;
641 string[] MargeCols = NeedMargeColumns.Split(',');
642 for (int dd = 0; dd < MargeCols.Length; dd++)
643 {
644 if (MargeCols[dd].Length > 0 && ("," + MargeCols[dd] + ",").IndexOf(":" + j.ToString() + ",") != -1)
645 {
646 refercol = Convert.ToInt32(MargeCols[dd].Substring(0, MargeCols[dd].IndexOf(":")));
647 break;
648 }
649 }
650 if (dtSources[k].Rows[i - 1][refercol].ToString() != dtSources[k].Rows[i][refercol].ToString())
651 {
652 canSetValue = true;
653 //CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
654 sheet.AddMergedRegion(new CellRangeAddress(margeColIndex[j], i, j, j));
655 margeColIndex[j] = i + 1;
656 margeColValue[j] = dtSources[k].Rows[i][j].ToString();
657 newCell.CellStyle = Rowstyle;
658 }
659 else if (margeColValue[j] != dtSources[k].Rows[i][j].ToString())//不同的时候需要更新原来储存的值,并重新设置合并
660 {
661 canSetValue = true;
662 //CellRangeAddress四个参数为:起始行,结束行,起始列,结束列
663 sheet.AddMergedRegion(new CellRangeAddress(margeColIndex[j], i, j, j));
664 margeColIndex[j] = i + 1;
665 margeColValue[j] = dtSources[k].Rows[i][j].ToString();
666 newCell.CellStyle = Rowstyle;
667 }
668 else if (i == dtSources[k].Rows.Count - 1 && i != 0)//最后一行强制合并
669 {
670 //值相同本来是不用做任何事,但是最后一行,则需要合并
671 sheet.AddMergedRegion(new CellRangeAddress(margeColIndex[j], i + 1, j, j));
672 newCell.CellStyle = Rowstyle;
673 }
674 }
675 }
676 else
677 {
678 canSetValue = true;
679 }
680 if (canSetValue)
681 {
682 #region 需要合并的列,1.第一行/最后一行,2.上一行值不同,下一行值相同,则给当前单元格赋值
683 switch (dtSources[k].Columns[j].DataType.ToString())
684 {
685 case "System.String"://字符串类型
686 newCell.SetCellValue(dtSources[k].Rows[i][j].ToString());
687 break;
688 case "System.DateTime"://日期类型
689 DateTime dateV;
690 DateTime.TryParse(dtSources[k].Rows[i][j].ToString(), out dateV);
691 newCell.SetCellValue(dateV);
692 newCell.CellStyle = dateStyle;//格式化显示
693 break;
694 case "System.Boolean"://布尔型
695 bool boolV = false;
696 bool.TryParse(dtSources[k].Rows[i][j].ToString(), out boolV);
697 newCell.SetCellValue(boolV);
698 break;
699 case "System.Int16"://整型
700 case "System.Int32":
701 case "System.Int64":
702 case "System.Byte":
703 int intV = 0;
704 int.TryParse(dtSources[k].Rows[i][j].ToString(), out intV);
705 newCell.SetCellValue(intV);
706 break;
707 case "System.Decimal"://浮点型
708 case "System.Double":
709 double doubV = 0;
710 double.TryParse(dtSources[k].Rows[i][j].ToString(), out doubV);
711 newCell.SetCellValue(doubV);
712 break;
713 case "System.DBNull"://空值处理
714 newCell.SetCellValue("");
715 break;
716 default:
717 newCell.SetCellValue("");
718 break;
719 }
720 #endregion
721 }
722 }
723 }
724 }
725 //保存
726 using (MemoryStream ms = new MemoryStream())
727 {
728 workbook.Write(ms);
729 ms.Flush();
730 ms.Position = 0;
731 if (SaveFile)
732 {
733 using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
734 {
735 byte[] data = ms.ToArray();
736 fs.Write(data, 0, data.Length);
737 fs.Flush();
738 }
739 System.IO.FileInfo fileInfo = new System.IO.FileInfo(strFileName);
740 strFileName = fileInfo.Name;
741 }
742 System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename=" + HttpUtility.UrlEncode(strFileName)));
743 System.Web.HttpContext.Current.Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
744 System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray());
745 System.Web.HttpContext.Current.Response.Flush();
746 ms.Close();
747 ms.Dispose();
748 System.Web.HttpContext.Current.Response.End();
749 }
750 }
751 #endregion
752
753 #region 从excel中将数据导出到datatable
754 /// <summary>读取excel
755 /// 默认第一行为标头
756 /// </summary>
757 /// <param name="strFileName">excel文档路径</param>
758 /// <returns></returns>
759 public static DataTable ImportExceltoDt(string strFileName)
760 {
761 DataTable dt = new DataTable();
762 IWorkbook wk = null;
763 using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
764 {
765 if (strFileName.EndsWith(".xlsx"))
766 wk = new XSSFWorkbook(file);
767 else
768 wk = new HSSFWorkbook(file);
769 }
770 ISheet sheet = wk.GetSheetAt(0) as ISheet;
771 dt = ImportDt(sheet, 0, true);
772 return dt;
773 }
774
775 /// <summary>
776 /// 读取excel
777 /// </summary>
778 /// <param name="strFileName">excel文件路径</param>
779 /// <param name="sheet">需要导出的sheet</param>
780 /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
781 /// <returns></returns>
782 public static DataTable ImportExceltoDt(string strFileName, string SheetName, int HeaderRowIndex)
783 {
784 DataTable dt = new DataTable();
785 IWorkbook wk = null;
786 using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
787 {
788 if (strFileName.EndsWith(".xlsx"))
789 wk = new XSSFWorkbook(file);
790 else
791 wk = new HSSFWorkbook(file);
792 }
793 ISheet sheet = wk.GetSheet(SheetName) as ISheet;
794 dt = ImportDt(sheet, HeaderRowIndex, true);
795 //ExcelFileStream.Close();
796 wk = null;
797 sheet = null;
798 return dt;
799 }
800
801 /// <summary>
802 /// 读取excel
803 /// </summary>
804 /// <param name="strFileName">excel文件路径</param>
805 /// <param name="sheet">需要导出的sheet序号</param>
806 /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
807 /// <returns></returns>
808 public static DataTable ImportExceltoDt(string strFileName, int SheetIndex, int HeaderRowIndex)
809 {
810 DataTable dt = new DataTable();
811 IWorkbook wk = null;
812 using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
813 {
814 if (strFileName.EndsWith(".xlsx"))
815 wk = new XSSFWorkbook(file);
816 else
817 wk = new HSSFWorkbook(file);
818 }
819 ISheet sheet = wk.GetSheetAt(SheetIndex) as ISheet;
820 dt = ImportDt(sheet, HeaderRowIndex, true);
821 //ExcelFileStream.Close();
822 wk = null;
823 sheet = null;
824 return dt;
825 }
826
827 /// <summary>
828 /// 读取excel
829 /// </summary>
830 /// <param name="strFileName">excel文件路径</param>
831 /// <param name="sheet">需要导出的sheet</param>
832 /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
833 /// <returns></returns>
834 public static DataTable ImportExceltoDt(string strFileName, string SheetName, int HeaderRowIndex, bool needHeader)
835 {
836 DataTable dt = new DataTable();
837 IWorkbook wk = null;
838 using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
839 {
840 if (strFileName.EndsWith(".xlsx"))
841 wk = new XSSFWorkbook(file);
842 else
843 wk = new HSSFWorkbook(file);
844 }
845 ISheet sheet = wk.GetSheet(SheetName) as ISheet;
846 dt = ImportDt(sheet, HeaderRowIndex, needHeader);
847 wk = null;
848 sheet = null;
849 return dt;
850 }
851
852 /// <summary>
853 /// 读取excel
854 /// </summary>
855 /// <param name="strFileName">excel文件路径</param>
856 /// <param name="sheet">需要导出的sheet序号</param>
857 /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
858 /// <returns></returns>
859 public static DataTable ImportExceltoDt(string strFileName, int SheetIndex, int HeaderRowIndex, bool needHeader)
860 {
861 DataTable dt = new DataTable();
862 IWorkbook wk = null;
863 using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
864 {
865 if (strFileName.EndsWith(".xlsx"))
866 wk = new XSSFWorkbook(file);
867 else
868 wk = new HSSFWorkbook(file);
869 }
870 ISheet sheet = wk.GetSheetAt(SheetIndex) as ISheet;
871 dt = ImportDt(sheet, HeaderRowIndex, needHeader);
872 wk = null;
873 sheet = null;
874 return dt;
875 }
876
877 /// <summary>
878 /// 将制定sheet中的数据导出到datatable中
879 /// </summary>
880 /// <param name="sheet">需要导出的sheet</param>
881 /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
882 /// <returns></returns>
883 static DataTable ImportDt(ISheet sheet, int HeaderRowIndex, bool needHeader)
884 {
885 DataTable table = new DataTable();
886 IRow headerRow;
887 int cellCount;
888 try
889 {
890 if (HeaderRowIndex < 0 || !needHeader)
891 {
892 headerRow = sheet.GetRow(0) as IRow;
893 cellCount = headerRow.LastCellNum;
894
895 for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
896 {
897 DataColumn column = new DataColumn(Convert.ToString("F" + (i + 1).ToString()));
898 table.Columns.Add(column);
899 }
900 }
901 else
902 {
903 headerRow = sheet.GetRow(HeaderRowIndex) as IRow;
904 cellCount = headerRow.LastCellNum;
905
906 for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
907 {
908 if (headerRow.GetCell(i) == null)
909 {
910 if (table.Columns.IndexOf(Convert.ToString(i)) > 0)
911 {
912 DataColumn column = new DataColumn(Convert.ToString("重复列名" + i));
913 table.Columns.Add(column);
914 }
915 else
916 {
917 DataColumn column = new DataColumn(Convert.ToString(i));
918 table.Columns.Add(column);
919 }
920
921 }
922 else if (table.Columns.IndexOf(headerRow.GetCell(i).ToString()) > 0)
923 {
924 DataColumn column = new DataColumn(Convert.ToString("重复列名" + i));
925 table.Columns.Add(column);
926 }
927 else
928 {
929 DataColumn column = new DataColumn(headerRow.GetCell(i).ToString());
930 table.Columns.Add(column);
931 }
932 }
933 }
934 int rowCount = sheet.LastRowNum;
935 for (int i = (HeaderRowIndex + 1); i <= sheet.LastRowNum; i++)
936 {
937 try
938 {
939 IRow row;
940 if (sheet.GetRow(i) == null)
941 {
942 row = sheet.CreateRow(i) as IRow;
943 }
944 else
945 {
946 row = sheet.GetRow(i) as IRow;
947 }
948
949 DataRow dataRow = table.NewRow();
950
951 for (int j = row.FirstCellNum; j <= cellCount; j++)
952 {
953 try
954 {
955 if (row.GetCell(j) != null)
956 {
957 switch (row.GetCell(j).CellType)
958 {
959 case CellType.String:
960 string str = row.GetCell(j).StringCellValue;
961 if (str != null && str.Length > 0)
962 {
963 dataRow[j] = str.ToString();
964 }
965 else
966 {
967 dataRow[j] = null;
968 }
969 break;
970 case CellType.Numeric:
971 if (DateUtil.IsCellDateFormatted(row.GetCell(j)))
972 {
973 dataRow[j] = DateTime.FromOADate(row.GetCell(j).NumericCellValue);
974 }
975 else
976 {
977 dataRow[j] = Convert.ToDouble(row.GetCell(j).NumericCellValue);
978 }
979 break;
980 case CellType.Boolean:
981 dataRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
982 break;
983 case CellType.Error:
984 dataRow[j] = row.GetCell(j).ErrorCellValue;
985 break;
986 case CellType.Formula:
987 switch (row.GetCell(j).CachedFormulaResultType)
988 {
989 case CellType.String:
990 string strFORMULA = row.GetCell(j).StringCellValue;
991 if (strFORMULA != null && strFORMULA.Length > 0)
992 {
993 dataRow[j] = strFORMULA.ToString();
994 }
995 else
996 {
997 dataRow[j] = null;
998 }
999 break;
1000 case CellType.Numeric:
1001 dataRow[j] = Convert.ToString(row.GetCell(j).NumericCellValue);
1002 break;
1003 case CellType.Boolean:
1004 dataRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
1005 break;
1006 case CellType.Error:
1007 dataRow[j] = row.GetCell(j).ErrorCellValue;
1008 break;
1009 default:
1010 dataRow[j] = "";
1011 break;
1012 }
1013 break;
1014 default:
1015 dataRow[j] = "";
1016 break;
1017 }
1018 }
1019 }
1020 catch (Exception)
1021 {
1022 //wl.WriteLogs(exception.ToString());
1023 }
1024 }
1025 table.Rows.Add(dataRow);
1026 }
1027 catch (Exception)
1028 {
1029 //wl.WriteLogs(exception.ToString());
1030 }
1031 }
1032 }
1033 catch (Exception)
1034 {
1035 //wl.WriteLogs(exception.ToString());
1036 }
1037 return table;
1038 }
1039 #endregion
1040
1041 #region 更新excel中的数据
1042 /// <summary>
1043 /// 更新Excel表格
1044 /// </summary>
1045 /// <param name="outputFile">需更新的excel表格路径</param>
1046 /// <param name="sheetname">sheet名</param>
1047 /// <param name="updateData">需更新的数据</param>
1048 /// <param name="coluid">需更新的列号</param>
1049 /// <param name="rowid">需更新的开始行号</param>
1050 public static void UpdateExcel(string outputFile, int sheetIndex, string[] updateData, int coluid, int rowid)
1051 {
1052 FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1053
1054 HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
1055 ISheet sheet1 = hssfworkbook.GetSheetAt(sheetIndex);
1056 for (int i = 0; i < updateData.Length; i++)
1057 {
1058 try
1059 {
1060 if (sheet1.GetRow(i + rowid) == null)
1061 {
1062 sheet1.CreateRow(i + rowid);
1063 }
1064 if (sheet1.GetRow(i + rowid).GetCell(coluid) == null)
1065 {
1066 sheet1.GetRow(i + rowid).CreateCell(coluid);
1067 }
1068
1069 sheet1.GetRow(i + rowid).GetCell(coluid).SetCellValue(updateData[i]);
1070 }
1071 catch (Exception ex)
1072 {
1073 // wl.WriteLogs(ex.ToString());
1074 throw;
1075 }
1076 }
1077 try
1078 {
1079 readfile.Close();
1080 FileStream writefile = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
1081 hssfworkbook.Write(writefile);
1082 writefile.Close();
1083 }
1084 catch (Exception ex)
1085 {
1086 // wl.WriteLogs(ex.ToString());
1087 }
1088
1089 }
1090
1091 /// <summary>
1092 /// 更新Excel表格
1093 /// </summary>
1094 /// <param name="outputFile">需更新的excel表格路径</param>
1095 /// <param name="sheetname">sheet名</param>
1096 /// <param name="updateData">需更新的数据</param>
1097 /// <param name="coluids">需更新的列号</param>
1098 /// <param name="rowid">需更新的开始行号</param>
1099 public static void UpdateExcel(string outputFile, int sheetIndex, string[][] updateData, int[] coluids, int rowid)
1100 {
1101 FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1102
1103 HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
1104 readfile.Close();
1105 ISheet sheet1 = hssfworkbook.GetSheetAt(sheetIndex);
1106 for (int j = 0; j < coluids.Length; j++)
1107 {
1108 for (int i = 0; i < updateData[j].Length; i++)
1109 {
1110 try
1111 {
1112 if (sheet1.GetRow(i + rowid) == null)
1113 {
1114 sheet1.CreateRow(i + rowid);
1115 }
1116 if (sheet1.GetRow(i + rowid).GetCell(coluids[j]) == null)
1117 {
1118 sheet1.GetRow(i + rowid).CreateCell(coluids[j]);
1119 }
1120 sheet1.GetRow(i + rowid).GetCell(coluids[j]).SetCellValue(updateData[j][i]);
1121 }
1122 catch (Exception ex)
1123 {
1124 // wl.WriteLogs(ex.ToString());
1125 }
1126 }
1127 }
1128 try
1129 {
1130 FileStream writefile = new FileStream(outputFile, FileMode.Create);
1131 hssfworkbook.Write(writefile);
1132 writefile.Close();
1133 }
1134 catch (Exception ex)
1135 {
1136 //wl.WriteLogs(ex.ToString());
1137 }
1138 }
1139
1140 /// <summary>
1141 /// 更新Excel表格
1142 /// </summary>
1143 /// <param name="outputFile">需更新的excel表格路径</param>
1144 /// <param name="sheetname">sheet名</param>
1145 /// <param name="updateData">需更新的数据</param>
1146 /// <param name="coluid">需更新的列号</param>
1147 /// <param name="rowid">需更新的开始行号</param>
1148 public static void UpdateExcel(string outputFile, int sheetIndex, double[] updateData, int coluid, int rowid)
1149 {
1150 FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1151
1152 HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
1153 ISheet sheet1 = hssfworkbook.GetSheetAt(sheetIndex);
1154 for (int i = 0; i < updateData.Length; i++)
1155 {
1156 try
1157 {
1158 if (sheet1.GetRow(i + rowid) == null)
1159 {
1160 sheet1.CreateRow(i + rowid);
1161 }
1162 if (sheet1.GetRow(i + rowid).GetCell(coluid) == null)
1163 {
1164 sheet1.GetRow(i + rowid).CreateCell(coluid);
1165 }
1166
1167 sheet1.GetRow(i + rowid).GetCell(coluid).SetCellValue(updateData[i]);
1168 }
1169 catch (Exception ex)
1170 {
1171 //wl.WriteLogs(ex.ToString());
1172 throw;
1173 }
1174 }
1175 try
1176 {
1177 readfile.Close();
1178 FileStream writefile = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
1179 hssfworkbook.Write(writefile);
1180 writefile.Close();
1181 }
1182 catch (Exception ex)
1183 {
1184 //wl.WriteLogs(ex.ToString());
1185 }
1186
1187 }
1188
1189 /// <summary>
1190 /// 更新Excel表格
1191 /// </summary>
1192 /// <param name="outputFile">需更新的excel表格路径</param>
1193 /// <param name="sheetname">sheet名</param>
1194 /// <param name="updateData">需更新的数据</param>
1195 /// <param name="coluids">需更新的列号</param>
1196 /// <param name="rowid">需更新的开始行号</param>
1197 public static void UpdateExcel(string outputFile, int sheetIndex, double[][] updateData, int[] coluids, int rowid)
1198 {
1199 FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1200
1201 HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
1202 readfile.Close();
1203 ISheet sheet1 = hssfworkbook.GetSheetAt(sheetIndex);
1204 for (int j = 0; j < coluids.Length; j++)
1205 {
1206 for (int i = 0; i < updateData[j].Length; i++)
1207 {
1208 try
1209 {
1210 if (sheet1.GetRow(i + rowid) == null)
1211 {
1212 sheet1.CreateRow(i + rowid);
1213 }
1214 if (sheet1.GetRow(i + rowid).GetCell(coluids[j]) == null)
1215 {
1216 sheet1.GetRow(i + rowid).CreateCell(coluids[j]);
1217 }
1218 sheet1.GetRow(i + rowid).GetCell(coluids[j]).SetCellValue(updateData[j][i]);
1219 }
1220 catch (Exception ex)
1221 {
1222 //wl.WriteLogs(ex.ToString());
1223 }
1224 }
1225 }
1226 try
1227 {
1228 FileStream writefile = new FileStream(outputFile, FileMode.Create);
1229 hssfworkbook.Write(writefile);
1230 writefile.Close();
1231 }
1232 catch (Exception ex)
1233 {
1234 //wl.WriteLogs(ex.ToString());
1235 }
1236 }
1237
1238 #endregion
1239
1240 public static int GetSheetNumber(string outputFile)
1241 {
1242 int number = 0;
1243 try
1244 {
1245 IWorkbook wk = null;
1246 FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1247 if (outputFile.EndsWith(".xlsx"))
1248 wk = new XSSFWorkbook(readfile);
1249 else
1250 wk = new HSSFWorkbook(readfile);
1251 number = wk.NumberOfSheets;
1252 }
1253 catch (Exception)
1254 {
1255 //wl.WriteLogs(exception.ToString());
1256 }
1257 return number;
1258 }
1259
1260 public static ArrayList GetSheetName(string outputFile)
1261 {
1262 ArrayList arrayList = new ArrayList();
1263 try
1264 {
1265 IWorkbook wk = null;
1266 FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1267 if (outputFile.EndsWith(".xlsx"))
1268 wk = new XSSFWorkbook(readfile);
1269 else
1270 wk = new HSSFWorkbook(readfile);
1271
1272 for (int i = 0; i < wk.NumberOfSheets; i++)
1273 {
1274 arrayList.Add(wk.GetSheetName(i));
1275 }
1276
1277 //var newFile2 = @"newbook.core.docx";
1278 //using (var fs = new FileStream(newFile2, FileMode.Create, FileAccess.Write))
1279 //{
1280 // XWPFDocument doc = new XWPFDocument();
1281 // var p0 = doc.CreateParagraph();
1282 // p0.Alignment = ParagraphAlignment.CENTER;
1283 // XWPFRun r0 = p0.CreateRun();
1284 // r0.FontFamily = "microsoft yahei";
1285 // r0.FontSize = 18;
1286 // r0.IsBold = true;
1287 // r0.SetText("This is title");
1288
1289 // var p1 = doc.CreateParagraph();
1290 // p1.Alignment = ParagraphAlignment.LEFT;
1291 // p1.IndentationFirstLine = 500;
1292 // XWPFRun r1 = p1.CreateRun();
1293 // r1.FontFamily = "·ÂËÎ";
1294 // r1.FontSize = 12;
1295 // r1.IsBold = true;
1296 // r1.SetText("This is content, content content content content content content content content content");
1297
1298 // doc.Write(fs);
1299 //}
1300 }
1301 catch (Exception ex)
1302 {
1303 throw ex;
1304 }
1305 return arrayList;
1306 }
1307
1308 public static bool isNumeric(String message, out double result)
1309 {
1310 Regex rex = new Regex(@"^[-]?\d+[.]?\d*$");
1311 result = -1;
1312 if (rex.IsMatch(message))
1313 {
1314 result = double.Parse(message);
1315 return true;
1316 }
1317 else
1318 return false;
1319 }
1320
1321 /// <summary>
1322 /// 根据其他行的内容合并ISheet中某列相同信息的行(单元格),2列相等
1323 /// </summary>
1324 /// <param name="sheet"></param>
1325 /// <param name="StartRow">合并的开始行</param>
1326 /// <param name="cols">合并列</param>
1327 /// <param name="precols">参考列</param>
1328 public static void GroupCol(ISheet sheet, int StartRow, int cols, int precols)
1329 {
1330 if (sheet.PhysicalNumberOfRows < StartRow + 1 || cols > sheet.GetRow(0).PhysicalNumberOfCells - 1)
1331 {
1332 return;
1333 }
1334 int RowNum = 0;
1335 ICell oldPreCell = sheet.GetRow(StartRow).GetCell(precols);
1336 ICell oldCell = sheet.GetRow(StartRow).GetCell(cols);
1337 int i = StartRow + 1;
1338 while (i < sheet.PhysicalNumberOfRows)
1339 {
1340
1341 ICell PreCell = sheet.GetRow(i).GetCell(precols);
1342 ICell Cell = sheet.GetRow(i).GetCell(cols);
1343 if (oldCell.ToString() == Cell.ToString() && oldPreCell.ToString() == PreCell.ToString())
1344 {
1345 //Cell.SetCellValue("");
1346 RowNum++;
1347 }
1348 else
1349 {
1350 if (RowNum > 0)
1351 {
1352 CellRangeAddress region = new CellRangeAddress(StartRow, StartRow + RowNum, cols, cols);
1353 sheet.AddMergedRegion(region);
1354 StartRow += RowNum;
1355 }
1356 oldPreCell = PreCell;
1357 oldCell = Cell;
1358 StartRow += 1;
1359 RowNum = 0;
1360 }
1361 i++;
1362 }
1363 if (RowNum > 0 && i == sheet.PhysicalNumberOfRows)
1364 {
1365 CellRangeAddress region = new CellRangeAddress(StartRow, StartRow + RowNum, cols, cols);
1366 sheet.AddMergedRegion(region);
1367 StartRow += RowNum;
1368 }
1369 }
1370
1371 /// <summary>
1372 /// 自动设置Excel列宽,行高
1373 /// </summary>
1374 /// <param name="sheet">Excel表</param>
1375 public static void AutoSizeColumns(ISheet sheet)
1376 {
1377 int RowNum = sheet.LastRowNum;
1378 int ColumnNum = sheet.GetRow(0).LastCellNum;
1379 int HeightValue = 0;
1380 for (int i = 0; i < ColumnNum; i++)
1381 {
1382 int columnWidth = sheet.GetColumnWidth(i) / 256;//获取当前列宽度
1383 for (int j = 1; j <= RowNum; j++)//在这一列上循环行
1384 {
1385 IRow currentRow = sheet.GetRow(j);
1386 ICell currentCell = currentRow.GetCell(i);
1387 int length = Encoding.UTF8.GetBytes(currentCell.ToString()).Length;//获取当前单元格的内容宽度
1388 if (columnWidth < length + 1)
1389 columnWidth = length + 1;
1390 if (columnWidth > 40)
1391 columnWidth = 40;
1392
1393 if (length > HeightValue) HeightValue = length;
1394 currentRow.HeightInPoints = 20 * (HeightValue / 60 + 1);//高度自适应
1395 }
1396 sheet.SetColumnWidth(i, columnWidth * 256);
1397 }
1398 }
1399
1400 public static void AutoSetType(ICell newCell, DataColumn column, DataRow row)
1401 {
1402 string drValue = row[column].ToString();
1403 switch (column.DataType.ToString())
1404 {
1405 case "System.String"://字符串类型
1406 //double result;
1407 //if (double.TryParse(drValue, out result) && result.ToString().Length != 15)
1408 // newCell.SetCellValue(result);
1409 //else
1410 newCell.SetCellValue(drValue);
1411 break;
1412 case "System.DateTime"://日期类型
1413 DateTime dateV;
1414 DateTime.TryParse(drValue, out dateV);
1415 newCell.SetCellValue(dateV);
1416 break;
1417 case "System.Boolean"://布尔型
1418 bool boolV = false;
1419 bool.TryParse(drValue, out boolV);
1420 newCell.SetCellValue(boolV);
1421 break;
1422 case "System.Int16"://整型
1423 case "System.Int32":
1424 case "System.Int64":
1425 case "System.Byte":
1426 int intV = 0;
1427 int.TryParse(drValue, out intV);
1428 if (intV != 0)
1429 newCell.SetCellValue(intV);
1430 break;
1431 case "System.Decimal"://浮点型
1432 case "System.Double":
1433 double doubV = 0;
1434 double.TryParse(drValue, out doubV);
1435 if (doubV != 0)
1436 newCell.SetCellValue(doubV);
1437 break;
1438 case "System.DBNull"://空值处理
1439 newCell.SetCellValue("");
1440 break;
1441 default:
1442 newCell.SetCellValue("");
1443 break;
1444 }
1445 }
1446
1447
1448
1449 /// <summary>
1450 /// DataTable导出到Excel文件 两行表头
1451 /// </summary>
1452 /// <param name="dt_Title">表头表格</param>
1453 /// <param name="dtSource">源DataTable</param>
1454 /// <param name="sFileName">文件名</param>
1455 /// <param name="SaveFile">是否需保存</param>
1456 /// <param name="SheetName">Sheet名</param>
1457 /// <param name="ColumnProperty">列属性集,多个属性集以"|"分隔,值以","分隔,范例:"Merge,0,0|Align,2,right|Width,4,100|DataType,5,double"</param>
1458
1459 public static void ExportDTtoExcel_2Title(DataTable dt_Title, DataTable dtSource, string sFileName, bool SaveFile, string SheetName, string ColumnProperty)
1460 {
1461 using (MemoryStream ms = ExportDT_2Title(dt_Title, dtSource, SheetName, ColumnProperty))
1462 {
1463 if (SaveFile)
1464 {
1465 using (FileStream fs = new FileStream(sFileName, FileMode.Create, FileAccess.Write))
1466 {
1467 byte[] data = ms.ToArray();
1468 fs.Write(data, 0, data.Length);
1469 fs.Flush();
1470 }
1471 System.IO.FileInfo fileInfo = new System.IO.FileInfo(sFileName);
1472 sFileName = fileInfo.Name;
1473 }
1474 System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename=" + HttpUtility.UrlEncode(sFileName)));
1475 System.Web.HttpContext.Current.Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
1476 System.Web.HttpContext.Current.Response.BinaryWrite(ms.ToArray());
1477 System.Web.HttpContext.Current.Response.Flush();
1478 ms.Close();
1479 ms.Dispose();
1480 System.Web.HttpContext.Current.Response.End();
1481 }
1482 }
1483 /// <summary>
1484 /// DataTable导出到Excel的MemoryStream
1485 /// </summary>
1486 /// <param name="dtSource">源DataTable</param>
1487 public static MemoryStream ExportDT_2Title(DataTable dt_Title, DataTable dtSource, string SheetName, string ColumnProperty)
1488 {
1489 using (MemoryStream ms = new MemoryStream())
1490 {
1491 HSSFWorkbook workbook = ExportWorkbook_2Title(dt_Title, dtSource, SheetName, ColumnProperty);
1492 workbook.Write(ms);
1493 ms.Flush();
1494 ms.Position = 0;
1495 return ms;
1496 }
1497 }
1498 public static HSSFWorkbook ExportWorkbook_2Title(DataTable dt_Title, DataTable dtSource, string SheetName, string ColumnProperty)
1499 {
1500 HSSFWorkbook workbook = new HSSFWorkbook();
1501 if (SheetName == null || SheetName == "") SheetName = "Sheet1";
1502 HSSFSheet sheet = workbook.CreateSheet(SheetName) as HSSFSheet;
1503
1504 // 标题样式
1505 HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;
1506 headStyle.Alignment = HorizontalAlignment.Center;
1507 headStyle.VerticalAlignment = VerticalAlignment.Center;
1508 headStyle.BorderBottom = NPOI.SS.UserModel.BorderStyle.Thin;
1509 headStyle.BorderLeft = NPOI.SS.UserModel.BorderStyle.Thin;
1510 headStyle.BorderRight = NPOI.SS.UserModel.BorderStyle.Thin;
1511 headStyle.BorderTop = NPOI.SS.UserModel.BorderStyle.Thin;
1512 headStyle.WrapText = true;
1513 HSSFFont font = workbook.CreateFont() as HSSFFont;
1514 font.Boldweight = (short)FontBoldWeight.Bold;
1515 headStyle.SetFont(font);
1516
1517 //内容样式
1518 HSSFCellStyle cellStyle = workbook.CreateCellStyle() as HSSFCellStyle;
1519 cellStyle.CloneStyleFrom(headStyle);
1520 cellStyle.Alignment = HorizontalAlignment.Center;
1521 font = workbook.CreateFont() as HSSFFont;
1522 font.Boldweight = (short)FontBoldWeight.Normal;
1523 cellStyle.SetFont(font);
1524 HSSFCellStyle cellStyleLeft = workbook.CreateCellStyle() as HSSFCellStyle;
1525 cellStyleLeft.CloneStyleFrom(cellStyle);
1526 cellStyleLeft.Alignment = HorizontalAlignment.Left;
1527 HSSFCellStyle cellStyleRight = workbook.CreateCellStyle() as HSSFCellStyle;
1528 cellStyleRight.CloneStyleFrom(cellStyle);
1529 cellStyleRight.Alignment = HorizontalAlignment.Right;
1530
1531 int rowIndex = 0;
1532 #region 列头及样式
1533
1534 for (int i = 0; i < dt_Title.Rows.Count; i++)
1535 {
1536 HSSFRow headerRow = sheet.CreateRow(rowIndex) as HSSFRow;
1537 for (int j = 0; j < dt_Title.Columns.Count; j++)
1538 {
1539 headerRow.CreateCell(dt_Title.Columns[j].Ordinal).SetCellValue(dt_Title.Rows[i][j].ToString());
1540 headerRow.GetCell(dt_Title.Columns[j].Ordinal).CellStyle = headStyle;
1541
1542 }
1543 rowIndex++;
1544 }
1545 for (int i = 0; i < dt_Title.Rows.Count; i++)
1546 {
1547 for (int m = 0; m < dt_Title.Columns.Count; m++)
1548 {
1549 int n = m + 1;
1550 while (n < dt_Title.Columns.Count)
1551 {
1552 if (dt_Title.Rows[i][m].ToString() == dt_Title.Rows[i][n].ToString())
1553 {
1554 n++;
1555 }
1556 else if (n == dt_Title.Columns.Count)
1557 {
1558 break;
1559 }
1560 else
1561 {
1562 //合并同一行相同的列表头
1563 sheet.AddMergedRegion(new CellRangeAddress(i, i, m, n - 1));
1564 m = n - 1;
1565 break;
1566 }
1567 }
1568 if (n == dt_Title.Columns.Count)
1569 {
1570 sheet.AddMergedRegion(new CellRangeAddress(i, i, m, n - 1));
1571
1572 }
1573 }
1574
1575 }
1576 for (int i = 0; i < dt_Title.Columns.Count; i++)
1577 {
1578 for (int m = 0; m < dt_Title.Rows.Count; m++)
1579 {
1580 int n = m + 1;
1581 while (n < dt_Title.Rows.Count)
1582 {
1583 if (dt_Title.Rows[m][i].ToString() == dt_Title.Rows[n][i].ToString())
1584 {
1585 n++;
1586 }
1587 else if (n == dt_Title.Rows.Count)
1588 {
1589 break;
1590 }
1591 else
1592 {
1593 //合并同一列相同的行表头
1594 sheet.AddMergedRegion(new CellRangeAddress(m, n - 1, i, i));
1595 m = n - 1;
1596 break;
1597 }
1598 }
1599 if (n == dt_Title.Rows.Count)
1600 {
1601 sheet.AddMergedRegion(new CellRangeAddress(m, n - 1, i, i));
1602
1603 }
1604 }
1605 }
1606
1607
1608
1609
1610 //sheet.AddMergedRegion(new CellRangeAddress(0, 1, 1, 1));
1611 //sheet.AddMergedRegion(new CellRangeAddress(0, 1, 2, 2));
1612 #endregion
1613
1614 foreach (DataRow row in dtSource.Rows)
1615 {
1616 #region 填充内容
1617 HSSFRow dataRow = sheet.CreateRow(rowIndex) as HSSFRow;
1618 foreach (DataColumn column in dtSource.Columns)
1619 {
1620 HSSFCell newCell = dataRow.CreateCell(column.Ordinal) as HSSFCell;
1621 newCell.CellStyle = cellStyle;
1622 AutoSetType(newCell, column, row);
1623 }
1624
1625 #endregion
1626 rowIndex++;
1627 }
1628 AutoSizeColumns(sheet);
1629
1630 if (ColumnProperty != null)
1631 {
1632 string[] ColumnArray = ColumnProperty.Split('|');
1633 foreach (string Column in ColumnArray)
1634 {
1635 string[] ValueArray = Column.Split(',');
1636 if (ValueArray.Length > 2)
1637 {
1638 int cols = int.Parse(ValueArray[1]);
1639 switch (ValueArray[0].ToString())
1640 {
1641 case "Merge":
1642 int precols = 0;
1643 int.TryParse(ValueArray[2], out precols);
1644 GroupCol(sheet, 1, cols, precols);
1645 break;
1646 case "Width":
1647 int columnWidth = 0;
1648 int.TryParse(ValueArray[2], out columnWidth);
1649 sheet.SetColumnWidth(cols, columnWidth * 256);
1650 break;
1651 case "Align":
1652 string Value = ValueArray[2].ToString();
1653 for (int j = 1; j <= sheet.LastRowNum; j++)
1654 {
1655 ICell currentCell = sheet.GetRow(j).GetCell(cols);
1656 switch (Value)
1657 {
1658 case "center":
1659 currentCell.CellStyle = cellStyle;
1660 break;
1661 case "left":
1662 currentCell.CellStyle = cellStyleLeft;
1663 break;
1664 case "right":
1665 currentCell.CellStyle = cellStyleRight;
1666 break;
1667 }
1668 }
1669 break;
1670 case "DataType":
1671 string Value2 = ValueArray[2].ToString();
1672 for (int j = 1; j <= sheet.LastRowNum; j++)
1673 {
1674 ICell currentCell = sheet.GetRow(j).GetCell(cols);
1675 string drValue = currentCell.ToString();
1676 switch (Value2)
1677 {
1678 case "double":
1679 double result;
1680 if (double.TryParse(drValue, out result))
1681 currentCell.SetCellValue(result);
1682 break;
1683 case "string":
1684 currentCell.SetCellValue(drValue.ToString());
1685 break;
1686 }
1687 }
1688 break;
1689 }
1690 }
1691 }
1692 }
1693 return workbook;
1694 }
1695
1696 }