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 }