NPOI常用功能工具类

  1     public class NPOIHelper
  2     {
  3         /// <summary>
  4         /// DataTable导出到Excel文件
  5         /// </summary>
  6         /// <param name="dtSource">源DataTable</param>
  7         /// <param name="strHeaderText">表头文本</param>
  8         /// <param name="strFileName">保存位置</param>
  9         public static void ExportByServer(DataTable dtSource, string strHeaderText, string strFileName)
 10         {
 11             using (MemoryStream ms = Export(dtSource, strHeaderText))
 12             {
 13                 using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
 14                 {
 15                     byte[] data = ms.ToArray();
 16                     fs.Write(data, 0, data.Length);
 17                     fs.Flush();
 18                 }
 19             }
 20         }
 21 
 22 
 23         /// <summary>
 24         /// 用于Web导出
 25         /// </summary>
 26         /// <param name="dtSource">源DataTable</param>
 27         /// <param name="strHeaderText">表头文本</param>
 28         /// <param name="strFileName">文件名</param>
 29         public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName)
 30         {
 31             HttpContext curContext = HttpContext.Current;
 32 
 33             // 设置编码和附件格式
 34             curContext.Response.ContentType = "application/vnd.ms-excel";
 35             curContext.Response.ContentEncoding = Encoding.UTF8;
 36             curContext.Response.Charset = "";
 37             curContext.Response.AppendHeader("Content-Disposition",
 38                 "attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));
 39 
 40             curContext.Response.BinaryWrite(Export(dtSource, strHeaderText).GetBuffer());
 41             curContext.Response.End();
 42         }
 43 
 44         /// <summary>读取excel
 45         /// 默认第一行为标头
 46         /// </summary>
 47         /// <param name="strFileName">excel文档路径</param>
 48         /// <returns></returns>
 49         public static DataTable Import(string strFileName)
 50         {
 51             DataTable dt = new DataTable();
 52 
 53             HSSFWorkbook hssfworkbook;
 54             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 55             {
 56                 hssfworkbook = new HSSFWorkbook(file);
 57             }
 58             ISheet sheet = hssfworkbook.GetSheetAt(0);
 59             System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
 60 
 61             IRow headerRow = sheet.GetRow(0);
 62             int cellCount = headerRow.LastCellNum;
 63 
 64             for (int j = 0; j < cellCount; j++)
 65             {
 66                 ICell cell = headerRow.GetCell(j);
 67                 dt.Columns.Add(cell.ToString());
 68             }
 69 
 70             for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
 71             {
 72                 IRow row = sheet.GetRow(i);
 73                 DataRow dataRow = dt.NewRow();
 74 
 75                 for (int j = row.FirstCellNum; j < cellCount; j++)
 76                 {
 77                     if (row.GetCell(j) != null)
 78                         dataRow[j] = row.GetCell(j).ToString();
 79                 }
 80 
 81                 dt.Rows.Add(dataRow);
 82             }
 83             return dt;
 84         }
 85 
 86         
 87         /// <summary>
 88         /// DataTable导出到Excel的MemoryStream
 89         /// </summary>
 90         /// <param name="dtSource">源DataTable</param>
 91         /// <param name="strHeaderText">表头文本</param>
 92         public static MemoryStream Export(DataTable dtSource, string strHeaderText)
 93         {
 94             HSSFWorkbook workbook = new HSSFWorkbook();
 95             ISheet sheet = workbook.CreateSheet();
 96 
 97             #region 右击文件 属性信息
 98             {
 99                 DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
100                 dsi.Company = "Sohu";
101                 workbook.DocumentSummaryInformation = dsi;
102 
103                 SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
104                 si.Author = "文件作者信息"; //填加xls文件作者信息
105                 si.ApplicationName = "创建程序信息"; //填加xls文件创建程序信息
106                 si.LastAuthor = "最后保存者信息"; //填加xls文件最后保存者信息
107                 si.Comments = "作者信息"; //填加xls文件作者信息
108                 si.Title = "标题信息"; //填加xls文件标题信息
109                 si.Subject = "主题信息";//填加文件主题信息
110                 si.CreateDateTime = DateTime.Now;
111                 workbook.SummaryInformation = si;
112             }
113             #endregion
114 
115             ICellStyle dateStyle = workbook.CreateCellStyle();
116             IDataFormat format = workbook.CreateDataFormat();
117             dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
118 
119             //取得列宽
120             int[] arrColWidth = new int[dtSource.Columns.Count];
121             foreach (DataColumn item in dtSource.Columns)
122             {
123                 arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
124             }
125             for (int i = 0; i < dtSource.Rows.Count; i++)
126             {
127                 for (int j = 0; j < dtSource.Columns.Count; j++)
128                 {
129                     int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
130                     if (intTemp > arrColWidth[j])
131                     {
132                         arrColWidth[j] = intTemp;
133                     }
134                 }
135             }
136             int rowIndex = 0;
137             foreach (DataRow row in dtSource.Rows)
138             {
139                 #region 新建表,填充表头,填充列头,样式
140                 if (rowIndex == 65535 || rowIndex == 0)
141                 {
142                     if (rowIndex != 0)
143                     {
144                         sheet = workbook.CreateSheet();
145                     }
146 
147                     #region 表头及样式
148                     {
149                         IRow headerRow = sheet.CreateRow(0);
150                         headerRow.HeightInPoints = 25;
151                         headerRow.CreateCell(0).SetCellValue(strHeaderText);
152 
153                         ICellStyle headStyle = workbook.CreateCellStyle();
154                         headStyle.Alignment = HorizontalAlignment.Center;
155                         IFont font = workbook.CreateFont();
156                         font.FontHeightInPoints = 20;
157                         font.Boldweight = 700;
158                         headStyle.SetFont(font);
159                         headerRow.GetCell(0).CellStyle = headStyle;
160                         sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));
161 
162                     }
163                     #endregion
164 
165 
166                     #region 列头及样式
167                     {
168                         IRow headerRow = sheet.CreateRow(1);
169 
170                         ICellStyle headStyle = workbook.CreateCellStyle();
171                         headStyle.Alignment = HorizontalAlignment.Center;
172 
173 
174                         IFont font = workbook.CreateFont();
175                         font.FontHeightInPoints = 10;
176                         font.Boldweight = 700;
177                         headStyle.SetFont(font);
178                         foreach (DataColumn column in dtSource.Columns)
179                         {
180                             headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
181                             headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
182 
183                             //设置列宽
184                             sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
185                         }
186 
187                     }
188                     #endregion
189 
190                     rowIndex = 2;
191                 }
192                 #endregion
193 
194 
195                 #region 填充内容
196                 IRow dataRow = sheet.CreateRow(rowIndex);
197                 foreach (DataColumn column in dtSource.Columns)
198                 {
199                     ICell newCell = dataRow.CreateCell(column.Ordinal);
200 
201                     string drValue = row[column].ToString();
202 
203                     switch (column.DataType.ToString())
204                     {
205                         case "System.String"://字符串类型
206                             newCell.SetCellValue(drValue);
207                             break;
208                         case "System.DateTime"://日期类型
209                             DateTime dateV;
210                             DateTime.TryParse(drValue, out dateV);
211                             newCell.SetCellValue(dateV);
212 
213                             newCell.CellStyle = dateStyle;//格式化显示
214                             break;
215                         case "System.Boolean"://布尔型
216                             bool boolV = false;
217                             bool.TryParse(drValue, out boolV);
218                             newCell.SetCellValue(boolV);
219                             break;
220                         case "System.Int16"://整型
221                         case "System.Int32":
222                         case "System.Int64":
223                         case "System.Byte":
224                             int intV = 0;
225                             int.TryParse(drValue, out intV);
226                             newCell.SetCellValue(intV);
227                             break;
228                         case "System.Decimal"://浮点型
229                         case "System.Double":
230                             double doubV = 0;
231                             double.TryParse(drValue, out doubV);
232                             newCell.SetCellValue(doubV);
233                             break;
234                         case "System.DBNull"://空值处理
235                             newCell.SetCellValue("");
236                             break;
237                         default:
238                             newCell.SetCellValue("");
239                             break;
240                     }
241 
242                 }
243                 #endregion
244 
245                 rowIndex++;
246             }
247             using (MemoryStream ms = new MemoryStream())
248             {
249                 workbook.Write(ms);
250                 ms.Flush();
251                 ms.Position = 0;
252 
253                 //sheet.Dispose();
254                 //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
255                 return ms;
256             }
257         }
258 
259 
260         /// <summary>
261         /// DataTable按模板导出到Excel文件
262         /// </summary>
263         /// <param name="dtSource">源DataTable</param>
264         /// <param name="TempletFileName">模板文件</param>
265         /// <param name="strFileName">保存位置</param>
266         public static void ExportByTemplate(string TempletFileName, string strFileName, DataTable dt, string Type)
267         {
268             using (MemoryStream ms = ExportByTemp(TempletFileName, dt, Type))
269             {
270                 using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
271                 {
272                     byte[] data = ms.ToArray();
273                     fs.Write(data, 0, data.Length);
274                     fs.Flush();
275                 }
276             }
277         }
278         /// <summary>
279         /// DataTable导出到Excel的MemoryStream
280         /// </summary>
281         /// <param name="dt">数据源</param>
282         /// <param name="TempletFileName">Excel模板</param>
283         /// <returns></returns>
284         public static MemoryStream ExportByTemp(string TempletFileName, DataTable dt,string Type)
285         {
286             FileStream file = new FileStream(TempletFileName, FileMode.Open, FileAccess.Read);
287 
288             HSSFWorkbook workbook = new HSSFWorkbook(file);
289             ISheet sheet = workbook.GetSheetAt(1);
290 
291             //ICellStyle dateStyle = workbook.CreateCellStyle();
292             //dateStyle.BorderBottom = BorderStyle.Thin;
293             //dateStyle.BorderLeft = BorderStyle.Thin;
294             //dateStyle.BorderRight = BorderStyle.Thin;
295             //dateStyle.BorderTop = BorderStyle.Thin;
296 
297             int rowIndex = 0;
298 
299             foreach (DataRow entity in dt.Rows)
300             {
301                 IRow dataRow = sheet.CreateRow(rowIndex);
302 
303                 if (Type.Equals("SaleType"))
304                 {
305                     ICell newCell0 = dataRow.CreateCell(0);
306                     newCell0.SetCellValue(entity[2].ToString());
307                     //newCell0.CellStyle = dateStyle;
308                 }
309                 else {
310                     ICell newCell0 = dataRow.CreateCell(0);
311                     newCell0.SetCellValue(entity[1].ToString());
312                     //newCell0.CellStyle = dateStyle;
313                 }
314                 //ICell newCell7 = dataRow.CreateCell(7);
315                 //if (type.Equals("excel"))
316                 //{
317                 //    newCell7.SetCellValue(entity.Location == "" ? "" : "第" + entity.Location + "行");
318                 //}
319                 //else if (type.Equals("word"))
320                 //{
321                 //    newCell7.SetCellValue(entity.Location == "" ? "" : "第" + entity.Location + "页");
322                 //}
323                 //newCell7.CellStyle = dateStyle;
324 
325 
326 
327                 rowIndex++;
328             }
329             if (dt.Rows.Count == 1)
330             {
331                 IRow dataRow = sheet.CreateRow(rowIndex);
332                 ICell newCelllast = dataRow.CreateCell(0);
333                 newCelllast.SetCellValue(" ");
334             }
335 
336              
337 
338             using (MemoryStream ms = new MemoryStream())
339             {
340                 workbook.Write(ms);
341                 ms.Flush();
342                 ms.Position = 0;
343 
344                 //sheet.Dispose();
345                 //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
346                 return ms;
347             }
348         }
349 
350 
351         public static void ExportByNodeData(string TfileName, string StrfileName, DataTable dt, string Type,double Rate)
352         {
353             using (MemoryStream ms = ExportByNode(TfileName, dt, Type,Rate))
354             {
355                 using (FileStream fs = new FileStream(StrfileName, FileMode.Create, FileAccess.Write))
356                 {
357                     byte[] data = ms.ToArray();
358                     fs.Write(data, 0, data.Length);
359                     fs.Flush();
360                 }
361             }
362         }
363         public static MemoryStream ExportByNode(string TempletFileName, DataTable dt, string Type, double Rate)
364         {
365             FileStream file = new FileStream(TempletFileName, FileMode.Open, FileAccess.Read);
366 
367             HSSFWorkbook workbook = new HSSFWorkbook(file);
368             ISheet sheet = workbook.GetSheetAt(0);
369 
370             ICellStyle dateStyle = workbook.CreateCellStyle();
371             dateStyle.BorderBottom = BorderStyle.Thin;
372             dateStyle.BorderLeft = BorderStyle.Thin;
373             dateStyle.BorderRight = BorderStyle.Thin;
374             dateStyle.BorderTop = BorderStyle.Thin;
375 
376             int rowIndex = 1;
377 
378             foreach (DataRow entity in dt.Rows)
379             {
380                 IRow dataRow = sheet.CreateRow(rowIndex);
381 
382                 if (Type.Equals("SaleTypeExport"))
383                 {
384                     ICell newCell0 = dataRow.CreateCell(0);
385                     newCell0.SetCellValue(rowIndex);
386                     newCell0.CellStyle = dateStyle;
387 
388                     ICell newCell1 = dataRow.CreateCell(1);
389                     newCell1.SetCellValue(entity["new_nodename"].ToString());
390                     newCell1.CellStyle = dateStyle;
391 
392                     ICell newCell2 = dataRow.CreateCell(2);
393                     newCell2.SetCellValue(Convert.ToDouble(entity["new_lastyear_total"].ToString()));
394                     newCell2.CellStyle = dateStyle;
395 
396                     ICell newCell3 = dataRow.CreateCell(3);
397                     newCell3.SetCellValue(Convert.ToDouble(entity["new_total_assign2me"].ToString()));
398                     newCell3.CellStyle = dateStyle;
399 
400                     ICell newCell4 = dataRow.CreateCell(4);
401                     newCell4.SetCellValue(Convert.ToInt32(entity["new_accountadd"].ToString()));
402                     newCell4.CellStyle = dateStyle;
403 
404                     ICell newCell5 = dataRow.CreateCell(5);
405                     newCell5.SetCellValue(Convert.ToDouble(entity["new_total_assign2me"].ToString()) - (Convert.ToDouble(entity["new_total_assign2me"].ToString()) * Rate));
406                     newCell5.CellStyle = dateStyle;
407 
408                     ICell newCell6 = dataRow.CreateCell(6);
409                     newCell6.SetCellValue((Convert.ToDouble(entity["new_total_assign2me"].ToString()) * Rate));
410                     newCell6.CellStyle = dateStyle;
411 
412                     ICell newCell7 = dataRow.CreateCell(7);
413                     newCell7.SetCellValue(Convert.ToDouble(entity["RefeAmount"].ToString()));
414                     newCell7.CellStyle = dateStyle;
415 
416                     ICell newCell8 = dataRow.CreateCell(8);
417                     newCell8.SetCellValue(entity["new_description"].ToString());
418                     newCell8.CellStyle = dateStyle;
419                 }
420                 else if (Type.Equals("AccountTypeExport"))
421                 {
422                     ICell newCell0 = dataRow.CreateCell(0);
423                     newCell0.SetCellValue(rowIndex);
424                     newCell0.CellStyle = dateStyle;
425 
426                     ICell newCell1 = dataRow.CreateCell(1);
427                     newCell1.SetCellValue(entity["new_name"].ToString());
428                     newCell1.CellStyle = dateStyle;
429 
430                     ICell newCell2 = dataRow.CreateCell(2);
431                     newCell2.SetCellValue(Convert.ToDouble(entity["new_lastyear_total"].ToString()));
432                     newCell2.CellStyle = dateStyle;
433 
434                     ICell newCell3 = dataRow.CreateCell(3);
435                     newCell3.SetCellValue(Convert.ToDouble(entity["new_nodetemdesc_amount"].ToString()));
436                     newCell3.CellStyle = dateStyle;
437 
438                     ICell newCell4 = dataRow.CreateCell(4);
439                     newCell4.SetCellValue(Convert.ToDouble(entity["new_nodetemdesc_amount"].ToString()) - (Convert.ToDouble(entity["new_nodetemdesc_amount"].ToString()) * Rate));
440                     newCell4.CellStyle = dateStyle;
441 
442                     ICell newCell5 = dataRow.CreateCell(5);
443                     newCell5.SetCellValue((Convert.ToDouble(entity["new_nodetemdesc_amount"].ToString()) * Rate));
444                     newCell5.CellStyle = dateStyle;
445 
446                     ICell newCell6 = dataRow.CreateCell(6);
447                     newCell6.SetCellValue(Convert.ToDouble(entity["RefeAmount"].ToString()));
448                     newCell6.CellStyle = dateStyle;
449 
450                     ICell newCell7 = dataRow.CreateCell(7);
451                     newCell7.SetCellValue(entity["new_nodetemdesc_description"].ToString());
452                     newCell7.CellStyle = dateStyle;
453                 }
454                 else if (Type.Equals("NodeDescByAccountExport"))
455                 {
456                     ICell newCell0 = dataRow.CreateCell(0);
457                     newCell0.SetCellValue(rowIndex);
458                     newCell0.CellStyle = dateStyle;
459 
460                     ICell newCell1 = dataRow.CreateCell(1);
461                     newCell1.SetCellValue(entity["new_name"].ToString());
462                     newCell1.CellStyle = dateStyle;
463 
464                     ICell newCell2 = dataRow.CreateCell(2);
465                     newCell2.SetCellValue(Convert.ToDouble(entity["new_nodetemdesc_amount"].ToString()));
466                     newCell2.CellStyle = dateStyle;
467 
468                     ICell newCell3 = dataRow.CreateCell(3);
469                     newCell3.SetCellValue(Convert.ToDouble(entity["new_nodetemdesc_amount"].ToString()) - (Convert.ToDouble(entity["new_nodetemdesc_amount"].ToString()) * Rate));
470                     newCell3.CellStyle = dateStyle;
471 
472                     ICell newCell4 = dataRow.CreateCell(4);
473                     newCell4.SetCellValue((Convert.ToDouble(entity["new_nodetemdesc_amount"].ToString()) * Rate));
474                     newCell4.CellStyle = dateStyle;
475 
476                     ICell newCell5 = dataRow.CreateCell(5);
477                     newCell5.SetCellValue(Convert.ToDouble(entity["RefeAmount"].ToString()));
478                     newCell5.CellStyle = dateStyle;
479 
480                     ICell newCell6 = dataRow.CreateCell(6);
481                     newCell6.SetCellValue(entity["new_nodetemdesc_description"].ToString());
482                     newCell6.CellStyle = dateStyle;
483                 }
484                 else if (Type.Equals("NodeDescBySaleExport"))
485                 {
486                     ICell newCell0 = dataRow.CreateCell(0);
487                     newCell0.SetCellValue(rowIndex);
488                     newCell0.CellStyle = dateStyle;
489 
490                     ICell newCell1 = dataRow.CreateCell(1);
491                     newCell1.SetCellValue(entity["new_name"].ToString());
492                     newCell1.CellStyle = dateStyle;
493 
494                     ICell newCell2 = dataRow.CreateCell(2);
495                     newCell2.SetCellValue(Convert.ToDouble(entity["new_distributeamount"].ToString()));
496                     newCell2.CellStyle = dateStyle;
497 
498                     ICell newCell3 = dataRow.CreateCell(3);
499                     newCell3.SetCellValue(Convert.ToDouble(entity["new_distributeamount"].ToString()) - (Convert.ToDouble(entity["new_distributeamount"].ToString()) * Rate));
500                     newCell3.CellStyle = dateStyle;
501 
502                     ICell newCell4 = dataRow.CreateCell(4);
503                     newCell4.SetCellValue((Convert.ToDouble(entity["new_distributeamount"].ToString()) * Rate));
504                     newCell4.CellStyle = dateStyle;
505 
506                     ICell newCell5 = dataRow.CreateCell(5);
507                     newCell5.SetCellValue(Convert.ToDouble(entity["RefeAmount"].ToString()));
508                     newCell5.CellStyle = dateStyle;
509 
510                     ICell newCell6 = dataRow.CreateCell(6);
511                     newCell6.SetCellValue(entity["new_description"].ToString());
512                     newCell6.CellStyle = dateStyle;
513                 }
514                 rowIndex++;
515             }
516 
517             using (MemoryStream ms = new MemoryStream())
518             {
519                 workbook.Write(ms);
520                 ms.Flush();
521                 ms.Position = 0;
522 
523                 //sheet.Dispose();
524                 //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
525                 return ms;
526             }
527         }
528 
529     }
View Code

 

posted @ 2016-06-23 15:36  Servant  阅读(1032)  评论(0编辑  收藏  举报