C#利用NPOI处理excel的类 NPOIHelper.cs

个人的NPOIHelp类,包括datatable导出到excel,dataset导出到excel,excel导入到datatable,excel导入到dataset,

更新excel中的数据,验证导入的Excel是否有数据等操作

   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.UserModel;
  11 using NPOI.HSSF.Util;
  12 using NPOI.POIFS;
  13 using NPOI.SS.Formula.Eval;
  14 using NPOI.SS.UserModel;
  15 using NPOI.Util;
  16 using NPOI.SS;
  17 using NPOI.DDF;
  18 using NPOI.SS.Util;
  19 using System.Collections;
  20 using System.Text.RegularExpressions;
  21 using NPOI.XSSF;
  22 using NPOI.XSSF.UserModel;
  23 
  24     public class NPOIHelper
  25     {
  26         private static WriteLog wl = new WriteLog();
  27 
  28 
  29         #region 从datatable中将数据导出到excel
  30         /// <summary>
  31         /// DataTable导出到Excel的MemoryStream
  32         /// </summary>
  33         /// <param name="dtSource">源DataTable</param>
  34         /// <param name="strHeaderText">表头文本</param>
  35         static MemoryStream ExportDT(DataTable dtSource, string strHeaderText)
  36         {
  37             HSSFWorkbook workbook = new HSSFWorkbook();
  38             HSSFSheet sheet = workbook.CreateSheet() as HSSFSheet;
  39 
  40             #region 右击文件 属性信息
  41 
  42             //{
  43             //    DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
  44             //    dsi.Company = "http://www.yongfa365.com/";
  45             //    workbook.DocumentSummaryInformation = dsi;
  46 
  47             //    SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
  48             //    si.Author = "柳永法"; //填加xls文件作者信息
  49             //    si.ApplicationName = "NPOI测试程序"; //填加xls文件创建程序信息
  50             //    si.LastAuthor = "柳永法2"; //填加xls文件最后保存者信息
  51             //    si.Comments = "说明信息"; //填加xls文件作者信息
  52             //    si.Title = "NPOI测试"; //填加xls文件标题信息
  53             //    si.Subject = "NPOI测试Demo"; //填加文件主题信息
  54             //    si.CreateDateTime = DateTime.Now;
  55             //    workbook.SummaryInformation = si;
  56             //}
  57 
  58             #endregion
  59 
  60             HSSFCellStyle dateStyle = workbook.CreateCellStyle() as HSSFCellStyle;
  61             HSSFDataFormat format = workbook.CreateDataFormat() as HSSFDataFormat;
  62             dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
  63 
  64             //取得列宽
  65             int[] arrColWidth = new int[dtSource.Columns.Count];
  66             foreach (DataColumn item in dtSource.Columns)
  67             {
  68                 arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
  69             }
  70             for (int i = 0; i < dtSource.Rows.Count; i++)
  71             {
  72                 for (int j = 0; j < dtSource.Columns.Count; j++)
  73                 {
  74                     int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
  75                     if (intTemp > arrColWidth[j])
  76                     {
  77                         arrColWidth[j] = intTemp;
  78                     }
  79                 }
  80             }
  81             int rowIndex = 0;
  82 
  83             foreach (DataRow row in dtSource.Rows)
  84             {
  85                 #region 新建表,填充表头,填充列头,样式
  86 
  87                 if (rowIndex == 65535 || rowIndex == 0)
  88                 {
  89                     if (rowIndex != 0)
  90                     {
  91                         sheet = workbook.CreateSheet() as HSSFSheet;
  92                     }
  93 
  94                     #region 表头及样式
  95 
  96                     {
  97                         HSSFRow headerRow = sheet.CreateRow(0) as HSSFRow;
  98                         headerRow.HeightInPoints = 25;
  99                         headerRow.CreateCell(0).SetCellValue(strHeaderText);
 100 
 101                         HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;
 102                         headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
 103                         HSSFFont font = workbook.CreateFont() as HSSFFont;
 104                         font.FontHeightInPoints = 20;
 105                         font.Boldweight = 700;
 106                         headStyle.SetFont(font);
 107 
 108                         headerRow.GetCell(0).CellStyle = headStyle;
 109 
 110                         sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1));
 111                         //headerRow.Dispose();
 112                     }
 113 
 114                     #endregion
 115 
 116 
 117                     #region 列头及样式
 118 
 119                     {
 120                         HSSFRow headerRow = sheet.CreateRow(1) as HSSFRow;
 121 
 122 
 123                         HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;
 124                         headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
 125                         HSSFFont font = workbook.CreateFont() as HSSFFont;
 126                         font.FontHeightInPoints = 10;
 127                         font.Boldweight = 700;
 128                         headStyle.SetFont(font);
 129 
 130 
 131                         foreach (DataColumn column in dtSource.Columns)
 132                         {
 133                             headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
 134                             headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
 135 
 136                             //设置列宽
 137                             sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
 138 
 139                         }
 140                         //headerRow.Dispose();
 141                     }
 142 
 143                     #endregion
 144 
 145                     rowIndex = 2;
 146                 }
 147 
 148                 #endregion
 149 
 150                 #region 填充内容
 151 
 152                 HSSFRow dataRow = sheet.CreateRow(rowIndex) as HSSFRow;
 153                 foreach (DataColumn column in dtSource.Columns)
 154                 {
 155                     HSSFCell newCell = dataRow.CreateCell(column.Ordinal) as HSSFCell;
 156 
 157                     string drValue = row[column].ToString();
 158 
 159                     switch (column.DataType.ToString())
 160                     {
 161                         case "System.String": //字符串类型
 162                             double result;
 163                             if (isNumeric(drValue, out result))
 164                             {
 165 
 166                                 double.TryParse(drValue, out result);
 167                                 newCell.SetCellValue(result);
 168                                 break;
 169                             }
 170                             else
 171                             {
 172                                 newCell.SetCellValue(drValue);
 173                                 break;
 174                             }
 175 
 176                         case "System.DateTime": //日期类型
 177                             DateTime dateV;
 178                             DateTime.TryParse(drValue, out dateV);
 179                             newCell.SetCellValue(dateV);
 180 
 181                             newCell.CellStyle = dateStyle; //格式化显示
 182                             break;
 183                         case "System.Boolean": //布尔型
 184                             bool boolV = false;
 185                             bool.TryParse(drValue, out boolV);
 186                             newCell.SetCellValue(boolV);
 187                             break;
 188                         case "System.Int16": //整型
 189                         case "System.Int32":
 190                         case "System.Int64":
 191                         case "System.Byte":
 192                             int intV = 0;
 193                             int.TryParse(drValue, out intV);
 194                             newCell.SetCellValue(intV);
 195                             break;
 196                         case "System.Decimal": //浮点型
 197                         case "System.Double":
 198                             double doubV = 0;
 199                             double.TryParse(drValue, out doubV);
 200                             newCell.SetCellValue(doubV);
 201                             break;
 202                         case "System.DBNull": //空值处理
 203                             newCell.SetCellValue("");
 204                             break;
 205                         default:
 206                             newCell.SetCellValue("");
 207                             break;
 208                     }
 209 
 210                 }
 211 
 212                 #endregion
 213 
 214                 rowIndex++;
 215             }
 216             using (MemoryStream ms = new MemoryStream())
 217             {
 218                 workbook.Write(ms);
 219                 ms.Flush();
 220                 ms.Position = 0;
 221 
 222                 //sheet.Dispose();
 223                 //workbook.Dispose();
 224 
 225                 return ms;
 226             }
 227         }
 228 
 229         /// <summary>
 230         /// DataTable导出到Excel的MemoryStream
 231         /// </summary>
 232         /// <param name="dtSource">源DataTable</param>
 233         /// <param name="strHeaderText">表头文本</param>
 234         static void ExportDTI(DataTable dtSource, string strHeaderText, FileStream fs)
 235         {
 236             XSSFWorkbook workbook = new XSSFWorkbook();
 237             XSSFSheet sheet = workbook.CreateSheet() as XSSFSheet;
 238 
 239             #region 右击文件 属性信息
 240 
 241             //{
 242             //    DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
 243             //    dsi.Company = "http://www.yongfa365.com/";
 244             //    workbook.DocumentSummaryInformation = dsi;
 245 
 246             //    SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
 247             //    si.Author = "柳永法"; //填加xls文件作者信息
 248             //    si.ApplicationName = "NPOI测试程序"; //填加xls文件创建程序信息
 249             //    si.LastAuthor = "柳永法2"; //填加xls文件最后保存者信息
 250             //    si.Comments = "说明信息"; //填加xls文件作者信息
 251             //    si.Title = "NPOI测试"; //填加xls文件标题信息
 252             //    si.Subject = "NPOI测试Demo"; //填加文件主题信息
 253             //    si.CreateDateTime = DateTime.Now;
 254             //    workbook.SummaryInformation = si;
 255             //}
 256 
 257             #endregion
 258 
 259             XSSFCellStyle dateStyle = workbook.CreateCellStyle() as XSSFCellStyle;
 260             XSSFDataFormat format = workbook.CreateDataFormat() as XSSFDataFormat;
 261             dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
 262 
 263             //取得列宽
 264             int[] arrColWidth = new int[dtSource.Columns.Count];
 265             foreach (DataColumn item in dtSource.Columns)
 266             {
 267                 arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
 268             }
 269             for (int i = 0; i < dtSource.Rows.Count; i++)
 270             {
 271                 for (int j = 0; j < dtSource.Columns.Count; j++)
 272                 {
 273                     int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
 274                     if (intTemp > arrColWidth[j])
 275                     {
 276                         arrColWidth[j] = intTemp;
 277                     }
 278                 }
 279             }
 280             int rowIndex = 0;
 281 
 282             foreach (DataRow row in dtSource.Rows)
 283             {
 284                 #region 新建表,填充表头,填充列头,样式
 285 
 286                 if (rowIndex == 0)
 287                 {
 288                     #region 表头及样式
 289                     //{
 290                     //    XSSFRow headerRow = sheet.CreateRow(0) as XSSFRow;
 291                     //    headerRow.HeightInPoints = 25;
 292                     //    headerRow.CreateCell(0).SetCellValue(strHeaderText);
 293 
 294                     //    XSSFCellStyle headStyle = workbook.CreateCellStyle() as XSSFCellStyle;
 295                     //    headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
 296                     //    XSSFFont font = workbook.CreateFont() as XSSFFont;
 297                     //    font.FontHeightInPoints = 20;
 298                     //    font.Boldweight = 700;
 299                     //    headStyle.SetFont(font);
 300 
 301                     //    headerRow.GetCell(0).CellStyle = headStyle;
 302 
 303                     //    //sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1));
 304                     //    //headerRow.Dispose();
 305                     //}
 306 
 307                     #endregion
 308 
 309 
 310                     #region 列头及样式
 311 
 312                     {
 313                         XSSFRow headerRow = sheet.CreateRow(0) as XSSFRow;
 314 
 315 
 316                         XSSFCellStyle headStyle = workbook.CreateCellStyle() as XSSFCellStyle;
 317                         headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
 318                         XSSFFont font = workbook.CreateFont() as XSSFFont;
 319                         font.FontHeightInPoints = 10;
 320                         font.Boldweight = 700;
 321                         headStyle.SetFont(font);
 322 
 323 
 324                         foreach (DataColumn column in dtSource.Columns)
 325                         {
 326                             headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
 327                             headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
 328 
 329                             //设置列宽
 330                             sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
 331 
 332                         }
 333                         //headerRow.Dispose();
 334                     }
 335 
 336                     #endregion
 337 
 338                     rowIndex = 1;
 339                 }
 340 
 341                 #endregion
 342 
 343                 #region 填充内容
 344 
 345                 XSSFRow dataRow = sheet.CreateRow(rowIndex) as XSSFRow;
 346                 foreach (DataColumn column in dtSource.Columns)
 347                 {
 348                     XSSFCell newCell = dataRow.CreateCell(column.Ordinal) as XSSFCell;
 349 
 350                     string drValue = row[column].ToString();
 351 
 352                     switch (column.DataType.ToString())
 353                     {
 354                         case "System.String": //字符串类型
 355                             double result;
 356                             if (isNumeric(drValue, out result))
 357                             {
 358 
 359                                 double.TryParse(drValue, out result);
 360                                 newCell.SetCellValue(result);
 361                                 break;
 362                             }
 363                             else
 364                             {
 365                                 newCell.SetCellValue(drValue);
 366                                 break;
 367                             }
 368 
 369                         case "System.DateTime": //日期类型
 370                             DateTime dateV;
 371                             DateTime.TryParse(drValue, out dateV);
 372                             newCell.SetCellValue(dateV);
 373 
 374                             newCell.CellStyle = dateStyle; //格式化显示
 375                             break;
 376                         case "System.Boolean": //布尔型
 377                             bool boolV = false;
 378                             bool.TryParse(drValue, out boolV);
 379                             newCell.SetCellValue(boolV);
 380                             break;
 381                         case "System.Int16": //整型
 382                         case "System.Int32":
 383                         case "System.Int64":
 384                         case "System.Byte":
 385                             int intV = 0;
 386                             int.TryParse(drValue, out intV);
 387                             newCell.SetCellValue(intV);
 388                             break;
 389                         case "System.Decimal": //浮点型
 390                         case "System.Double":
 391                             double doubV = 0;
 392                             double.TryParse(drValue, out doubV);
 393                             newCell.SetCellValue(doubV);
 394                             break;
 395                         case "System.DBNull": //空值处理
 396                             newCell.SetCellValue("");
 397                             break;
 398                         default:
 399                             newCell.SetCellValue("");
 400                             break;
 401                     }
 402 
 403                 }
 404 
 405                 #endregion
 406 
 407                 rowIndex++;
 408             }
 409             workbook.Write(fs);
 410             fs.Close();
 411         }
 412 
 413         /// <summary>
 414         /// DataTable导出到Excel文件
 415         /// </summary>
 416         /// <param name="dtSource">源DataTable</param>
 417         /// <param name="strHeaderText">表头文本</param>
 418         /// <param name="strFileName">保存位置</param>
 419         public static void ExportDTtoExcel(DataTable dtSource, string strHeaderText, string strFileName)
 420         {
 421             string[] temp = strFileName.Split('.');
 422 
 423             if (temp[temp.Length - 1] == "xls" && dtSource.Columns.Count < 256 && dtSource.Rows.Count < 65536)
 424             {
 425                 using (MemoryStream ms = ExportDT(dtSource, strHeaderText))
 426                 {
 427                     using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
 428                     {
 429                         byte[] data = ms.ToArray();
 430                         fs.Write(data, 0, data.Length);
 431                         fs.Flush();
 432                     }
 433                 }
 434             }
 435             else
 436             {
 437                 if (temp[temp.Length - 1] == "xls")
 438                     strFileName = strFileName + "x";
 439 
 440                 using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
 441                 {
 442                     ExportDTI(dtSource, strHeaderText, fs);
 443                 }
 444             }
 445         }
 446         #endregion
 447 
 448         #region 从excel中将数据导出到datatable
 449         /// <summary>
 450         /// 读取excel 默认第一行为标头
 451         /// </summary>
 452         /// <param name="strFileName">excel文档路径</param>
 453         /// <returns></returns>
 454         public static DataTable ImportExceltoDt(string strFileName)
 455         {
 456             DataTable dt = new DataTable();
 457             IWorkbook wb;
 458             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 459             {
 460                 wb = WorkbookFactory.Create(file);
 461             }
 462             ISheet sheet = wb.GetSheetAt(0);
 463             dt = ImportDt(sheet, 0, true);
 464             return dt;
 465         }
 466 
 467         /// <summary>
 468         /// 读取Excel流到DataTable
 469         /// </summary>
 470         /// <param name="stream">Excel流</param>
 471         /// <returns>第一个sheet中的数据</returns>
 472         public static DataTable ImportExceltoDt(Stream stream)
 473         {
 474             try
 475             {
 476                 DataTable dt = new DataTable();
 477                 IWorkbook wb;
 478                 using (stream)
 479                 {
 480                     wb = WorkbookFactory.Create(stream);
 481                 }
 482                 ISheet sheet = wb.GetSheetAt(0);
 483                 dt = ImportDt(sheet, 0, true);
 484                 return dt;
 485             }
 486             catch (Exception)
 487             {
 488 
 489                 throw;
 490             }
 491         }
 492 
 493         /// <summary>
 494         /// 读取Excel流到DataTable
 495         /// </summary>
 496         /// <param name="stream">Excel流</param>
 497         /// <param name="sheetName">表单名</param>
 498         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 499         /// <returns>指定sheet中的数据</returns>
 500         public static DataTable ImportExceltoDt(Stream stream, string sheetName, int HeaderRowIndex)
 501         {
 502             try
 503             {
 504                 DataTable dt = new DataTable();
 505                 IWorkbook wb;
 506                 using (stream)
 507                 {
 508                     wb = WorkbookFactory.Create(stream);
 509                 }
 510                 ISheet sheet = wb.GetSheet(sheetName);
 511                 dt = ImportDt(sheet, HeaderRowIndex, true);
 512                 return dt;
 513             }
 514             catch (Exception)
 515             {
 516 
 517                 throw;
 518             }
 519         }
 520 
 521         /// <summary>
 522         /// 读取Excel流到DataSet
 523         /// </summary>
 524         /// <param name="stream">Excel流</param>
 525         /// <returns>Excel中的数据</returns>
 526         public static DataSet ImportExceltoDs(Stream stream)
 527         {
 528             try
 529             {
 530                 DataSet ds = new DataSet();
 531                 IWorkbook wb;
 532                 using (stream)
 533                 {
 534                     wb = WorkbookFactory.Create(stream);
 535                 }
 536                 for (int i = 0; i < wb.NumberOfSheets; i++)
 537                 {
 538                     DataTable dt = new DataTable();
 539                     ISheet sheet = wb.GetSheetAt(i);
 540                     dt = ImportDt(sheet, 0, true);
 541                     ds.Tables.Add(dt);
 542                 }
 543                 return ds;
 544             }
 545             catch (Exception)
 546             {
 547 
 548                 throw;
 549             }
 550         }
 551 
 552         /// <summary>
 553         /// 读取Excel流到DataSet
 554         /// </summary>
 555         /// <param name="stream">Excel流</param>
 556         /// <param name="dict">字典参数,key:sheet名,value:列头所在行号,-1表示没有列头</param>
 557         /// <returns>Excel中的数据</returns>
 558         public static DataSet ImportExceltoDs(Stream stream,Dictionary<string,int> dict)
 559         {
 560             try
 561             {
 562                 DataSet ds = new DataSet();
 563                 IWorkbook wb;
 564                 using (stream)
 565                 {
 566                     wb = WorkbookFactory.Create(stream);
 567                 }
 568                 foreach (string key in dict.Keys)
 569                 {
 570                     DataTable dt = new DataTable();
 571                     ISheet sheet = wb.GetSheet(key);
 572                     dt = ImportDt(sheet, dict[key], true);
 573                     ds.Tables.Add(dt);
 574                 }
 575                 return ds;
 576             }
 577             catch (Exception)
 578             {
 579 
 580                 throw;
 581             }
 582         }
 583 
 584         /// <summary>
 585         /// 读取excel
 586         /// </summary>
 587         /// <param name="strFileName">excel文件路径</param>
 588         /// <param name="sheet">需要导出的sheet</param>
 589         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 590         /// <returns></returns>
 591         public static DataTable ImportExceltoDt(string strFileName, string SheetName, int HeaderRowIndex)
 592         {
 593             HSSFWorkbook workbook;
 594             IWorkbook wb;
 595             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 596             {
 597                 wb = new HSSFWorkbook(file);
 598             }
 599             ISheet sheet = wb.GetSheet(SheetName);
 600             DataTable table = new DataTable();
 601             table = ImportDt(sheet, HeaderRowIndex, true);
 602             //ExcelFileStream.Close();
 603             workbook = null;
 604             sheet = null;
 605             return table;
 606         }
 607 
 608         /// <summary>
 609         /// 读取excel
 610         /// </summary>
 611         /// <param name="strFileName">excel文件路径</param>
 612         /// <param name="sheet">需要导出的sheet序号</param>
 613         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 614         /// <returns></returns>
 615         public static DataTable ImportExceltoDt(string strFileName, int SheetIndex, int HeaderRowIndex)
 616         {
 617             HSSFWorkbook workbook;
 618             IWorkbook wb;
 619             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 620             {
 621                 wb = WorkbookFactory.Create(file);
 622             }
 623             ISheet isheet = wb.GetSheetAt(SheetIndex);
 624             DataTable table = new DataTable();
 625             table = ImportDt(isheet, HeaderRowIndex, true);
 626             //ExcelFileStream.Close();
 627             workbook = null;
 628             isheet = null;
 629             return table;
 630         }
 631 
 632         /// <summary>
 633         /// 读取excel
 634         /// </summary>
 635         /// <param name="strFileName">excel文件路径</param>
 636         /// <param name="sheet">需要导出的sheet</param>
 637         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 638         /// <returns></returns>
 639         public static DataTable ImportExceltoDt(string strFileName, string SheetName, int HeaderRowIndex, bool needHeader)
 640         {
 641             HSSFWorkbook workbook;
 642             IWorkbook wb;
 643             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 644             {
 645                 wb = WorkbookFactory.Create(file);
 646             }
 647             ISheet sheet = wb.GetSheet(SheetName);
 648             DataTable table = new DataTable();
 649             table = ImportDt(sheet, HeaderRowIndex, needHeader);
 650             //ExcelFileStream.Close();
 651             workbook = null;
 652             sheet = null;
 653             return table;
 654         }
 655 
 656         /// <summary>
 657         /// 读取excel
 658         /// </summary>
 659         /// <param name="strFileName">excel文件路径</param>
 660         /// <param name="sheet">需要导出的sheet序号</param>
 661         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 662         /// <returns></returns>
 663         public static DataTable ImportExceltoDt(string strFileName, int SheetIndex, int HeaderRowIndex, bool needHeader)
 664         {
 665             HSSFWorkbook workbook;
 666             IWorkbook wb;
 667             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 668             {
 669                 wb = WorkbookFactory.Create(file);
 670             }
 671             ISheet sheet = wb.GetSheetAt(SheetIndex);
 672             DataTable table = new DataTable();
 673             table = ImportDt(sheet, HeaderRowIndex, needHeader);
 674             //ExcelFileStream.Close();
 675             workbook = null;
 676             sheet = null;
 677             return table;
 678         }
 679 
 680         /// <summary>
 681         /// 将制定sheet中的数据导出到datatable中
 682         /// </summary>
 683         /// <param name="sheet">需要导出的sheet</param>
 684         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 685         /// <returns></returns>
 686         static DataTable ImportDt(ISheet sheet, int HeaderRowIndex, bool needHeader)
 687         {
 688             DataTable table = new DataTable();
 689             IRow headerRow;
 690             int cellCount;
 691             try
 692             {
 693                 if (HeaderRowIndex < 0 || !needHeader)
 694                 {
 695                     headerRow = sheet.GetRow(0);
 696                     cellCount = headerRow.LastCellNum;
 697 
 698                     for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
 699                     {
 700                         DataColumn column = new DataColumn(Convert.ToString(i));
 701                         table.Columns.Add(column);
 702                     }
 703                 }
 704                 else
 705                 {
 706                     headerRow = sheet.GetRow(HeaderRowIndex);
 707                     cellCount = headerRow.LastCellNum;
 708 
 709                     for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
 710                     {
 711                         if (headerRow.GetCell(i) == null)
 712                         {
 713                             if (table.Columns.IndexOf(Convert.ToString(i)) > 0)
 714                             {
 715                                 DataColumn column = new DataColumn(Convert.ToString("重复列名" + i));
 716                                 table.Columns.Add(column);
 717                             }
 718                             else
 719                             {
 720                                 DataColumn column = new DataColumn(Convert.ToString(i));
 721                                 table.Columns.Add(column);
 722                             }
 723 
 724                         }
 725                         else if (table.Columns.IndexOf(headerRow.GetCell(i).ToString()) > 0)
 726                         {
 727                             DataColumn column = new DataColumn(Convert.ToString("重复列名" + i));
 728                             table.Columns.Add(column);
 729                         }
 730                         else
 731                         {
 732                             DataColumn column = new DataColumn(headerRow.GetCell(i).ToString());
 733                             table.Columns.Add(column);
 734                         }
 735                     }
 736                 }
 737                 int rowCount = sheet.LastRowNum;
 738                 for (int i = (HeaderRowIndex + 1); i <= sheet.LastRowNum; i++)
 739                 {
 740                     try
 741                     {
 742                         IRow row;
 743                         if (sheet.GetRow(i) == null)
 744                         {
 745                             row = sheet.CreateRow(i);
 746                         }
 747                         else
 748                         {
 749                             row = sheet.GetRow(i);
 750                         }
 751 
 752                         DataRow dataRow = table.NewRow();
 753 
 754                         for (int j = row.FirstCellNum; j <= cellCount; j++)
 755                         {
 756                             try
 757                             {
 758                                 if (row.GetCell(j) != null)
 759                                 {
 760                                     switch (row.GetCell(j).CellType)
 761                                     {
 762                                         case CellType.STRING:
 763                                             string str = row.GetCell(j).StringCellValue;
 764                                             if (str != null && str.Length > 0)
 765                                             {
 766                                                 dataRow[j] = str.ToString();
 767                                             }
 768                                             else
 769                                             {
 770                                                 dataRow[j] = null;
 771                                             }
 772                                             break;
 773                                         case CellType.NUMERIC:
 774                                             if (DateUtil.IsCellDateFormatted(row.GetCell(j)))
 775                                             {
 776                                                 dataRow[j] = DateTime.FromOADate(row.GetCell(j).NumericCellValue);
 777                                             }
 778                                             else
 779                                             {
 780                                                 dataRow[j] = Convert.ToDouble(row.GetCell(j).NumericCellValue);
 781                                             }
 782                                             break;
 783                                         case CellType.BOOLEAN:
 784                                             dataRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
 785                                             break;
 786                                         case CellType.ERROR:
 787                                             dataRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);
 788                                             break;
 789                                         case CellType.FORMULA:
 790                                             switch (row.GetCell(j).CachedFormulaResultType)
 791                                             {
 792                                                 case CellType.STRING:
 793                                                     string strFORMULA = row.GetCell(j).StringCellValue;
 794                                                     if (strFORMULA != null && strFORMULA.Length > 0)
 795                                                     {
 796                                                         dataRow[j] = strFORMULA.ToString();
 797                                                     }
 798                                                     else
 799                                                     {
 800                                                         dataRow[j] = null;
 801                                                     }
 802                                                     break;
 803                                                 case CellType.NUMERIC:
 804                                                     dataRow[j] = Convert.ToString(row.GetCell(j).NumericCellValue);
 805                                                     break;
 806                                                 case CellType.BOOLEAN:
 807                                                     dataRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
 808                                                     break;
 809                                                 case CellType.ERROR:
 810                                                     dataRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);
 811                                                     break;
 812                                                 default:
 813                                                     dataRow[j] = "";
 814                                                     break;
 815                                             }
 816                                             break;
 817                                         default:
 818                                             dataRow[j] = "";
 819                                             break;
 820                                     }
 821                                 }
 822                             }
 823                             catch (Exception exception)
 824                             {
 825                                 wl.WriteLogs(exception.ToString());
 826                             }
 827                         }
 828                         table.Rows.Add(dataRow);
 829                     }
 830                     catch (Exception exception)
 831                     {
 832                         wl.WriteLogs(exception.ToString());
 833                     }
 834                 }
 835             }
 836             catch (Exception exception)
 837             {
 838                 wl.WriteLogs(exception.ToString());
 839             }
 840             return table;
 841         }
 842 
 843         #endregion
 844 
 845 
 846         public static void InsertSheet(string outputFile, string sheetname, DataTable dt)
 847         {
 848             FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
 849             IWorkbook hssfworkbook = WorkbookFactory.Create(readfile);
 850             //HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
 851             int num = hssfworkbook.GetSheetIndex(sheetname);
 852             ISheet sheet1;
 853             if (num >= 0)
 854                 sheet1 = hssfworkbook.GetSheet(sheetname);
 855             else
 856             {
 857                 sheet1 = hssfworkbook.CreateSheet(sheetname);
 858             }
 859 
 860 
 861             try
 862             {
 863                 if (sheet1.GetRow(0) == null)
 864                 {
 865                     sheet1.CreateRow(0);
 866                 }
 867                 for (int coluid = 0; coluid < dt.Columns.Count; coluid++)
 868                 {
 869                     if (sheet1.GetRow(0).GetCell(coluid) == null)
 870                     {
 871                         sheet1.GetRow(0).CreateCell(coluid);
 872                     }
 873 
 874                     sheet1.GetRow(0).GetCell(coluid).SetCellValue(dt.Columns[coluid].ColumnName);
 875                 }
 876             }
 877             catch (Exception ex)
 878             {
 879                 wl.WriteLogs(ex.ToString());
 880                 throw;
 881             }
 882 
 883 
 884             for (int i = 1; i <= dt.Rows.Count; i++)
 885             {
 886                 try
 887                 {
 888                     if (sheet1.GetRow(i) == null)
 889                     {
 890                         sheet1.CreateRow(i);
 891                     }
 892                     for (int coluid = 0; coluid < dt.Columns.Count; coluid++)
 893                     {
 894                         if (sheet1.GetRow(i).GetCell(coluid) == null)
 895                         {
 896                             sheet1.GetRow(i).CreateCell(coluid);
 897                         }
 898 
 899                         sheet1.GetRow(i).GetCell(coluid).SetCellValue(dt.Rows[i - 1][coluid].ToString());
 900                     }
 901                 }
 902                 catch (Exception ex)
 903                 {
 904                     wl.WriteLogs(ex.ToString());
 905                     //throw;
 906                 }
 907             }
 908             try
 909             {
 910                 readfile.Close();
 911 
 912                 FileStream writefile = new FileStream(outputFile, FileMode.OpenOrCreate, FileAccess.Write);
 913                 hssfworkbook.Write(writefile);
 914                 writefile.Close();
 915             }
 916             catch (Exception ex)
 917             {
 918                 wl.WriteLogs(ex.ToString());
 919             }
 920         }
 921 
 922         #region 更新excel中的数据
 923         /// <summary>
 924         /// 更新Excel表格
 925         /// </summary>
 926         /// <param name="outputFile">需更新的excel表格路径</param>
 927         /// <param name="sheetname">sheet名</param>
 928         /// <param name="updateData">需更新的数据</param>
 929         /// <param name="coluid">需更新的列号</param>
 930         /// <param name="rowid">需更新的开始行号</param>
 931         public static void UpdateExcel(string outputFile, string sheetname, string[] updateData, int coluid, int rowid)
 932         {
 933             //FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
 934             IWorkbook hssfworkbook = null;// WorkbookFactory.Create(outputFile);
 935             //HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
 936             ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
 937             for (int i = 0; i < updateData.Length; i++)
 938             {
 939                 try
 940                 {
 941                     if (sheet1.GetRow(i + rowid) == null)
 942                     {
 943                         sheet1.CreateRow(i + rowid);
 944                     }
 945                     if (sheet1.GetRow(i + rowid).GetCell(coluid) == null)
 946                     {
 947                         sheet1.GetRow(i + rowid).CreateCell(coluid);
 948                     }
 949 
 950                     sheet1.GetRow(i + rowid).GetCell(coluid).SetCellValue(updateData[i]);
 951                 }
 952                 catch (Exception ex)
 953                 {
 954                     wl.WriteLogs(ex.ToString());
 955                     throw;
 956                 }
 957             }
 958             try
 959             {
 960                 //readfile.Close();
 961                 FileStream writefile = new FileStream(outputFile, FileMode.OpenOrCreate, FileAccess.Write);
 962                 hssfworkbook.Write(writefile);
 963                 writefile.Close();
 964             }
 965             catch (Exception ex)
 966             {
 967                 wl.WriteLogs(ex.ToString());
 968             }
 969 
 970         }
 971 
 972         /// <summary>
 973         /// 更新Excel表格
 974         /// </summary>
 975         /// <param name="outputFile">需更新的excel表格路径</param>
 976         /// <param name="sheetname">sheet名</param>
 977         /// <param name="updateData">需更新的数据</param>
 978         /// <param name="coluids">需更新的列号</param>
 979         /// <param name="rowid">需更新的开始行号</param>
 980         public static void UpdateExcel(string outputFile, string sheetname, string[][] updateData, int[] coluids, int rowid)
 981         {
 982             FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
 983 
 984             HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
 985             readfile.Close();
 986             ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
 987             for (int j = 0; j < coluids.Length; j++)
 988             {
 989                 for (int i = 0; i < updateData[j].Length; i++)
 990                 {
 991                     try
 992                     {
 993                         if (sheet1.GetRow(i + rowid) == null)
 994                         {
 995                             sheet1.CreateRow(i + rowid);
 996                         }
 997                         if (sheet1.GetRow(i + rowid).GetCell(coluids[j]) == null)
 998                         {
 999                             sheet1.GetRow(i + rowid).CreateCell(coluids[j]);
1000                         }
1001                         sheet1.GetRow(i + rowid).GetCell(coluids[j]).SetCellValue(updateData[j][i]);
1002                     }
1003                     catch (Exception ex)
1004                     {
1005                         wl.WriteLogs(ex.ToString());
1006                     }
1007                 }
1008             }
1009             try
1010             {
1011                 FileStream writefile = new FileStream(outputFile, FileMode.Create);
1012                 hssfworkbook.Write(writefile);
1013                 writefile.Close();
1014             }
1015             catch (Exception ex)
1016             {
1017                 wl.WriteLogs(ex.ToString());
1018             }
1019         }
1020 
1021         /// <summary>
1022         /// 更新Excel表格
1023         /// </summary>
1024         /// <param name="outputFile">需更新的excel表格路径</param>
1025         /// <param name="sheetname">sheet名</param>
1026         /// <param name="updateData">需更新的数据</param>
1027         /// <param name="coluid">需更新的列号</param>
1028         /// <param name="rowid">需更新的开始行号</param>
1029         public static void UpdateExcel(string outputFile, string sheetname, double[] updateData, int coluid, int rowid)
1030         {
1031             FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1032 
1033             HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
1034             ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
1035             for (int i = 0; i < updateData.Length; i++)
1036             {
1037                 try
1038                 {
1039                     if (sheet1.GetRow(i + rowid) == null)
1040                     {
1041                         sheet1.CreateRow(i + rowid);
1042                     }
1043                     if (sheet1.GetRow(i + rowid).GetCell(coluid) == null)
1044                     {
1045                         sheet1.GetRow(i + rowid).CreateCell(coluid);
1046                     }
1047 
1048                     sheet1.GetRow(i + rowid).GetCell(coluid).SetCellValue(updateData[i]);
1049                 }
1050                 catch (Exception ex)
1051                 {
1052                     wl.WriteLogs(ex.ToString());
1053                     throw;
1054                 }
1055             }
1056             try
1057             {
1058                 readfile.Close();
1059                 FileStream writefile = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
1060                 hssfworkbook.Write(writefile);
1061                 writefile.Close();
1062             }
1063             catch (Exception ex)
1064             {
1065                 wl.WriteLogs(ex.ToString());
1066             }
1067 
1068         }
1069 
1070         /// <summary>
1071         /// 更新Excel表格
1072         /// </summary>
1073         /// <param name="outputFile">需更新的excel表格路径</param>
1074         /// <param name="sheetname">sheet名</param>
1075         /// <param name="updateData">需更新的数据</param>
1076         /// <param name="coluids">需更新的列号</param>
1077         /// <param name="rowid">需更新的开始行号</param>
1078         public static void UpdateExcel(string outputFile, string sheetname, double[][] updateData, int[] coluids, int rowid)
1079         {
1080             FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1081 
1082             HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
1083             readfile.Close();
1084             ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
1085             for (int j = 0; j < coluids.Length; j++)
1086             {
1087                 for (int i = 0; i < updateData[j].Length; i++)
1088                 {
1089                     try
1090                     {
1091                         if (sheet1.GetRow(i + rowid) == null)
1092                         {
1093                             sheet1.CreateRow(i + rowid);
1094                         }
1095                         if (sheet1.GetRow(i + rowid).GetCell(coluids[j]) == null)
1096                         {
1097                             sheet1.GetRow(i + rowid).CreateCell(coluids[j]);
1098                         }
1099                         sheet1.GetRow(i + rowid).GetCell(coluids[j]).SetCellValue(updateData[j][i]);
1100                     }
1101                     catch (Exception ex)
1102                     {
1103                         wl.WriteLogs(ex.ToString());
1104                     }
1105                 }
1106             }
1107             try
1108             {
1109                 FileStream writefile = new FileStream(outputFile, FileMode.Create);
1110                 hssfworkbook.Write(writefile);
1111                 writefile.Close();
1112             }
1113             catch (Exception ex)
1114             {
1115                 wl.WriteLogs(ex.ToString());
1116             }
1117         }
1118 
1119         #endregion
1120 
1121         public static int GetSheetNumber(string outputFile)
1122         {
1123             int number = 0;
1124             try
1125             {
1126                 FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1127 
1128                 HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
1129                 number = hssfworkbook.NumberOfSheets;
1130 
1131             }
1132             catch (Exception exception)
1133             {
1134                 wl.WriteLogs(exception.ToString());
1135             }
1136             return number;
1137         }
1138 
1139         public static ArrayList GetSheetName(string outputFile)
1140         {
1141             ArrayList arrayList = new ArrayList();
1142             try
1143             {
1144                 FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1145 
1146                 HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
1147                 for (int i = 0; i < hssfworkbook.NumberOfSheets; i++)
1148                 {
1149                     arrayList.Add(hssfworkbook.GetSheetName(i));
1150                 }
1151             }
1152             catch (Exception exception)
1153             {
1154                 wl.WriteLogs(exception.ToString());
1155             }
1156             return arrayList;
1157         }
1158 
1159         public static bool isNumeric(String message, out double result)
1160         {
1161             Regex rex = new Regex(@"^[-]?d+[.]?d*$");
1162             result = -1;
1163             if (rex.IsMatch(message))
1164             {
1165                 result = double.Parse(message);
1166                 return true;
1167             }
1168             else
1169                 return false;
1170 
1171         }
1172 
1173 
1174 
1175         //////////  现用导出  \\\\\  
1176         /// <summary>
1177         /// 用于Web导出                                                                                             第一步
1178         /// </summary>
1179         /// <param name="dtSource">源DataTable</param>
1180         /// <param name="strHeaderText">表头文本</param>
1181         /// <param name="strFileName">文件名</param>
1182         public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName)
1183         {
1184             HttpContext curContext = HttpContext.Current;
1185 
1186             // 设置编码和附件格式
1187             curContext.Response.ContentType = "application/vnd.ms-excel";
1188             curContext.Response.ContentEncoding = Encoding.UTF8;
1189             curContext.Response.Charset = "";
1190             curContext.Response.AppendHeader("Content-Disposition",
1191             "attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));
1192 
1193             curContext.Response.BinaryWrite(Export(dtSource, strHeaderText).GetBuffer());
1194             curContext.Response.End();
1195         }
1196 
1197 
1198 
1199         /// <summary>
1200         /// DataTable导出到Excel的MemoryStream                                                                      第二步
1201         /// </summary>
1202         /// <param name="dtSource">源DataTable</param>
1203         /// <param name="strHeaderText">表头文本</param>
1204         public static MemoryStream Export(DataTable dtSource, string strHeaderText)
1205         {
1206             HSSFWorkbook workbook = new HSSFWorkbook();
1207             HSSFSheet sheet = workbook.CreateSheet() as HSSFSheet;
1208 
1209             #region 右击文件 属性信息
1210             {
1211                 DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
1212                 dsi.Company = "NPOI";
1213                 workbook.DocumentSummaryInformation = dsi;
1214 
1215                 SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
1216                 si.Author = "文件作者信息"; //填加xls文件作者信息
1217                 si.ApplicationName = "创建程序信息"; //填加xls文件创建程序信息
1218                 si.LastAuthor = "最后保存者信息"; //填加xls文件最后保存者信息
1219                 si.Comments = "作者信息"; //填加xls文件作者信息
1220                 si.Title = "标题信息"; //填加xls文件标题信息
1221                 si.Subject = "主题信息";//填加文件主题信息
1222 
1223                 si.CreateDateTime = DateTime.Now;
1224                 workbook.SummaryInformation = si;
1225             }
1226             #endregion
1227 
1228             HSSFCellStyle dateStyle = workbook.CreateCellStyle() as HSSFCellStyle;
1229             HSSFDataFormat format = workbook.CreateDataFormat() as HSSFDataFormat;
1230             dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
1231 
1232             //取得列宽
1233             int[] arrColWidth = new int[dtSource.Columns.Count];
1234             foreach (DataColumn item in dtSource.Columns)
1235             {
1236                 arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
1237             }
1238             for (int i = 0; i < dtSource.Rows.Count; i++)
1239             {
1240                 for (int j = 0; j < dtSource.Columns.Count; j++)
1241                 {
1242                     int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
1243                     if (intTemp > arrColWidth[j])
1244                     {
1245                         arrColWidth[j] = intTemp;
1246                     }
1247                 }
1248             }
1249             int rowIndex = 0;
1250             foreach (DataRow row in dtSource.Rows)
1251             {
1252                 #region 新建表,填充表头,填充列头,样式
1253                 if (rowIndex == 65535 || rowIndex == 0)
1254                 {
1255                     if (rowIndex != 0)
1256                     {
1257                         sheet = workbook.CreateSheet() as HSSFSheet;
1258                     }
1259 
1260                     #region 表头及样式
1261                     {
1262                         if (string.IsNullOrEmpty(strHeaderText))
1263                         {
1264                             HSSFRow headerRow = sheet.CreateRow(0) as HSSFRow;
1265                             headerRow.HeightInPoints = 25;
1266                             headerRow.CreateCell(0).SetCellValue(strHeaderText);
1267                             HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;
1268                             //headStyle.Alignment = CellHorizontalAlignment.CENTER;
1269                             HSSFFont font = workbook.CreateFont() as HSSFFont;
1270                             font.FontHeightInPoints = 20;
1271                             font.Boldweight = 700;
1272                             headStyle.SetFont(font);
1273                             headerRow.GetCell(0).CellStyle = headStyle;
1274                             sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1));
1275                             //headerRow.Dispose();
1276                         }
1277                     }
1278                     #endregion
1279 
1280                     #region 列头及样式
1281                     {
1282                         HSSFRow headerRow = sheet.CreateRow(0) as HSSFRow;
1283                         HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;
1284                         //headStyle.Alignment = CellHorizontalAlignment.CENTER;
1285                         HSSFFont font = workbook.CreateFont() as HSSFFont;
1286                         font.FontHeightInPoints = 10;
1287                         font.Boldweight = 700;
1288                         headStyle.SetFont(font);
1289                         foreach (DataColumn column in dtSource.Columns)
1290                         {
1291                             headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
1292                             headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
1293 
1294                             //设置列宽
1295                             sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
1296                         }
1297                         //headerRow.Dispose();
1298                     }
1299                     #endregion
1300 
1301                     rowIndex = 1;
1302                 }
1303                 #endregion
1304 
1305 
1306                 #region 填充内容
1307                 HSSFRow dataRow = sheet.CreateRow(rowIndex) as HSSFRow;
1308                 foreach (DataColumn column in dtSource.Columns)
1309                 {
1310                     HSSFCell newCell = dataRow.CreateCell(column.Ordinal) as HSSFCell;
1311 
1312                     string drValue = row[column].ToString();
1313 
1314                     switch (column.DataType.ToString())
1315                     {
1316                         case "System.String"://字符串类型
1317                             newCell.SetCellValue(drValue);
1318                             break;
1319                         case "System.DateTime"://日期类型
1320                             DateTime dateV;
1321                             DateTime.TryParse(drValue, out dateV);
1322                             newCell.SetCellValue(dateV);
1323 
1324                             newCell.CellStyle = dateStyle;//格式化显示
1325                             break;
1326                         case "System.Boolean"://布尔型
1327                             bool boolV = false;
1328                             bool.TryParse(drValue, out boolV);
1329                             newCell.SetCellValue(boolV);
1330                             break;
1331                         case "System.Int16"://整型
1332                         case "System.Int32":
1333                         case "System.Int64":
1334                         case "System.Byte":
1335                             int intV = 0;
1336                             int.TryParse(drValue, out intV);
1337                             newCell.SetCellValue(intV);
1338                             break;
1339                         case "System.Decimal"://浮点型
1340                         case "System.Double":
1341                             double doubV = 0;
1342                             double.TryParse(drValue, out doubV);
1343                             newCell.SetCellValue(doubV);
1344                             break;
1345                         case "System.DBNull"://空值处理
1346                             newCell.SetCellValue("");
1347                             break;
1348                         default:
1349                             newCell.SetCellValue("");
1350                             break;
1351                     }
1352                 }
1353                 #endregion
1354 
1355                 rowIndex++;
1356             }
1357             using (MemoryStream ms = new MemoryStream())
1358             {
1359                 workbook.Write(ms);
1360                 ms.Flush();
1361                 ms.Position = 0;
1362 
1363                 //sheet.Dispose();
1364                 //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
1365                 return ms;
1366             }
1367         }
1368 
1369         /// <summary>
1370         /// /注:分浏览器进行编码(IE必须编码,FireFox不能编码,Chrome可编码也可不编码)
1371         /// </summary>
1372         /// <param name="ds"></param>
1373         /// <param name="strHeaderText"></param>
1374         /// <param name="strFileName"></param>
1375         public static void ExportByWeb(DataSet ds, string strHeaderText, string strFileName)
1376         {                    
1377              HttpContext curContext = HttpContext.Current;
1378              curContext.Response.ContentType = "application/vnd.ms-excel";
1379              curContext.Response.Charset = "";
1380              if (curContext.Request.UserAgent.ToLower().IndexOf("firefox", System.StringComparison.Ordinal) > 0)
1381              {
1382                  curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + strFileName);
1383              }
1384              else
1385              {
1386                  curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(strFileName, System.Text.Encoding.UTF8));
1387              }
1388 
1389            //  curContext.Response.AppendHeader("Content-Disposition", "attachment;filename=" +strFileName);
1390              curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
1391              curContext.Response.BinaryWrite(ExportDataSetToExcel(ds, strHeaderText).GetBuffer());
1392              curContext.Response.End();         
1393         }
1394 
1395         /// <summary>
1396         /// 由DataSet导出Excel
1397         /// </summary>
1398         /// <param name="sourceTable">要导出数据的DataTable</param>
1399         /// <param name="sheetName">工作表名称</param>
1400         /// <returns>Excel工作表</returns>
1401         private static MemoryStream ExportDataSetToExcel(DataSet sourceDs, string sheetName)
1402         {
1403             HSSFWorkbook workbook = new HSSFWorkbook();
1404             MemoryStream ms = new MemoryStream();
1405             string[] sheetNames = sheetName.Split(',');
1406             for (int i = 0; i < sheetNames.Length; i++)
1407             {
1408                 ISheet sheet = workbook.CreateSheet(sheetNames[i]);
1409 
1410                 #region 列头
1411                 IRow headerRow = sheet.CreateRow(0);
1412                 HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;
1413                 HSSFFont font = workbook.CreateFont() as HSSFFont;
1414                 font.FontHeightInPoints = 10;
1415                 font.Boldweight = 700;
1416                 headStyle.SetFont(font);
1417 
1418                 //取得列宽
1419                 int[] arrColWidth = new int[sourceDs.Tables[i].Columns.Count];
1420                 foreach (DataColumn item in sourceDs.Tables[i].Columns)
1421                 {
1422                     arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
1423                 }
1424 
1425                 // 处理列头
1426                 foreach (DataColumn column in sourceDs.Tables[i].Columns)
1427                 {
1428                     headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
1429                     headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
1430                     //设置列宽
1431                     sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
1432 
1433                 }
1434                 #endregion
1435 
1436                 #region 填充值
1437                 int rowIndex = 1;
1438                 foreach (DataRow row in sourceDs.Tables[i].Rows)
1439                 {
1440                     IRow dataRow = sheet.CreateRow(rowIndex);
1441                     foreach (DataColumn column in sourceDs.Tables[i].Columns)
1442                     {
1443                         dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());
1444                     }
1445                     rowIndex++;
1446                 }
1447                 #endregion
1448             }
1449             workbook.Write(ms);
1450             ms.Flush();
1451             ms.Position = 0;
1452             workbook = null;
1453             return ms;
1454         }
1455 
1456 
1457         /// <summary>
1458         /// 验证导入的Excel是否有数据
1459         /// </summary>
1460         /// <param name="excelFileStream"></param>
1461         /// <returns></returns>
1462         public static bool HasData(Stream excelFileStream)
1463         {
1464             using (excelFileStream)
1465             {
1466                 IWorkbook workBook = new HSSFWorkbook(excelFileStream);
1467                 if (workBook.NumberOfSheets > 0)
1468                 {
1469                     ISheet sheet = workBook.GetSheetAt(0);
1470                     return sheet.PhysicalNumberOfRows > 0;
1471                 }
1472             }
1473             return false;
1474         }
1475     }
原文地址:https://www.cnblogs.com/qizhelongdeyang/p/3417599.html