导入导出Excel

最近需要频繁的使用导入导出,各么,又不想使用ms的PIA,在4.0以下,存在版本兼容的问题。

于是网上查找了很久,找到两款开源的excel组件。

1、CSharpJExcel,这是JExcel的.net版本,但是只支持到2003,也就是xls格式。

2、NPOI,这是一款国人写的开源组件,功能挺好,就是代码看着有点乱~尤其是xlsx段。优点在于demo比较详细

不管如何,先用了再说。

贴一段改过的helper类

   1 /*******************************************************************
   2  * 版权所有: 
   3  * 类 名 称:ExcelHelper
   4  * 作    者:zk
   5  * 电子邮箱:77148918@QQ.com
   6  * 创建日期:2012/2/25 10:17:21 
   7  * 修改描述:从excel导入datatable时,可以导入日期类型。
   8  *           但对excel中的日期类型有一定要求,要求至少是yyyy/mm/dd类型日期; *           
   9  * 修改描述:将datatable导入excel中,对类型为字符串的数字进行处理,
  10  *           导出数字为double类型;
  11  * 修改描述:针对NPOI 2.0 alpha版本更新,修改了导入excel的方法,划分为2003版本和2007版本;
  12  *           将导入方法里的HSSFWorkbook改为接口;
  13  *           将 NPOI.HSSF.UserModel.HSSFRow改为了NPOI.XSSF.UserModel.XSSFRow(只存在导入excel2007的方法中)
  14  *           将 导入方法的参数HSSFSheet sheet改为了接口类型ISheet(2003的导入方法和2007均有修改) 
  15  *           将 导入方法区分为导入Excel2003以及导入Excel2007;
  16  * 修改日期:2012年5月4日22:06:29 for Jnz Update to NPOI 1.25 正式版
  17  * 修改日期:2012年8月30日17:13:49 for Jnz Update to NPOI 2.0 alpha版
  18  * 修改日期:2015年9月7日  for Feedback Update to NPOI 2.1.3.1 Stable版
  19  * 
  20  * *******************************************************************/
  21 using System;
  22 using System.Collections.Generic;
  23 using System.Data;
  24 using System.IO;
  25 using System.Text;
  26 using System.Web;
  27 using NPOI;
  28 using NPOI.HPSF;
  29 using NPOI.HSSF;
  30 using NPOI.HSSF.Record;//NPOI.HSSF.Record.Formula.Eval改为了NPOI.SS.Formula.Eval;
  31 using NPOI.SS.Formula.Eval;//同上
  32 using NPOI.HSSF.UserModel;
  33 using NPOI.HSSF.Util;
  34 using NPOI.POIFS;
  35 using NPOI.SS.UserModel;
  36 using NPOI.Util;
  37 using NPOI.SS;
  38 using NPOI.DDF;
  39 using NPOI.SS.Util;
  40 using NPOI.XSSF.UserModel;//2007
  41 using System.Collections;
  42 using System.Text.RegularExpressions;
  43 
  44 namespace XX.Carto
  45 {
  46     public class ExcelHelper
  47     {
  48         //private static WriteLog wl = new WriteLog();
  49 
  50 
  51         #region 从datatable中将数据导出到excel
  52         /// <summary>
  53         /// DataTable导出到Excel的MemoryStream
  54         /// </summary>
  55         /// <param name="dtSource">源DataTable</param>
  56         /// <param name="strHeaderText">表头文本</param>
  57         static MemoryStream ExportDT(DataTable dtSource, string strHeaderText)
  58         {
  59             HSSFWorkbook workbook = new HSSFWorkbook();
  60             HSSFSheet sheet = workbook.CreateSheet() as HSSFSheet;
  61 
  62             #region 右击文件 属性信息
  63 
  64             //{
  65             //    DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
  66             //    dsi.Company = "http://www.yongfa365.com/";
  67             //    workbook.DocumentSummaryInformation = dsi;
  68 
  69             //    SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
  70             //    si.Author = "柳永法"; //填加xls文件作者信息
  71             //    si.ApplicationName = "NPOI测试程序"; //填加xls文件创建程序信息
  72             //    si.LastAuthor = "柳永法2"; //填加xls文件最后保存者信息
  73             //    si.Comments = "说明信息"; //填加xls文件作者信息
  74             //    si.Title = "NPOI测试"; //填加xls文件标题信息
  75             //    si.Subject = "NPOI测试Demo"; //填加文件主题信息
  76             //    si.CreateDateTime = DateTime.Now;
  77             //    workbook.SummaryInformation = si;
  78             //}
  79 
  80             #endregion
  81 
  82             HSSFCellStyle dateStyle = workbook.CreateCellStyle() as HSSFCellStyle;
  83             HSSFDataFormat format = workbook.CreateDataFormat() as HSSFDataFormat;
  84             dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
  85 
  86             //取得列宽
  87             int[] arrColWidth = new int[dtSource.Columns.Count];
  88             foreach (DataColumn item in dtSource.Columns)
  89             {
  90                 arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
  91             }
  92             for (int i = 0; i < dtSource.Rows.Count; i++)
  93             {
  94                 for (int j = 0; j < dtSource.Columns.Count; j++)
  95                 {
  96                     int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
  97                     if (intTemp > arrColWidth[j])
  98                     {
  99                         arrColWidth[j] = intTemp;
 100                     }
 101                 }
 102             }
 103             int rowIndex = 0;
 104 
 105             foreach (DataRow row in dtSource.Rows)
 106             {
 107                 #region 新建表,填充表头,填充列头,样式
 108 
 109                 if (rowIndex == 65535 || rowIndex == 0)
 110                 {
 111                     if (rowIndex != 0)
 112                     {
 113                         sheet = workbook.CreateSheet() as HSSFSheet;
 114                     }
 115 
 116                     #region 表头及样式
 117 
 118                     {
 119                         HSSFRow headerRow = sheet.CreateRow(0) as HSSFRow;
 120                         headerRow.HeightInPoints = 25;
 121                         headerRow.CreateCell(0).SetCellValue(strHeaderText);
 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 = 20;
 127                         font.Boldweight = 700;
 128                         headStyle.SetFont(font);
 129 
 130                         headerRow.GetCell(0).CellStyle = headStyle;
 131 
 132                         //sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1));方法已过时
 133                         sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, dtSource.Columns.Count - 1));//2015-09-07 by feedback
 134                         //headerRow.Dispose();
 135                     }
 136 
 137                     #endregion
 138 
 139 
 140                     #region 列头及样式
 141 
 142                     {
 143                         HSSFRow headerRow = sheet.CreateRow(1) as HSSFRow;
 144 
 145 
 146                         HSSFCellStyle headStyle = workbook.CreateCellStyle() as HSSFCellStyle;
 147                         headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;
 148                         HSSFFont font = workbook.CreateFont() as HSSFFont;
 149                         font.FontHeightInPoints = 10;
 150                         font.Boldweight = 700;
 151                         headStyle.SetFont(font);
 152 
 153 
 154                         foreach (DataColumn column in dtSource.Columns)
 155                         {
 156                             headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
 157                             headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
 158 
 159                             //设置列宽
 160                             sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
 161 
 162                         }
 163                         //headerRow.Dispose();
 164                     }
 165 
 166                     #endregion
 167 
 168                     rowIndex = 2;
 169                 }
 170 
 171                 #endregion
 172 
 173                 #region 填充内容
 174 
 175                 HSSFRow dataRow = sheet.CreateRow(rowIndex) as HSSFRow;
 176                 foreach (DataColumn column in dtSource.Columns)
 177                 {
 178                     HSSFCell newCell = dataRow.CreateCell(column.Ordinal) as HSSFCell;
 179 
 180                     string drValue = row[column].ToString();
 181 
 182                     switch (column.DataType.ToString())
 183                     {
 184                         case "System.String": //字符串类型
 185                             double result;
 186                             if (isNumeric(drValue, out result))
 187                             {
 188 
 189                                 double.TryParse(drValue, out result);
 190                                 newCell.SetCellValue(result);
 191                                 break;
 192                             }
 193                             else
 194                             {
 195                                 newCell.SetCellValue(drValue);
 196                                 break;
 197                             }
 198 
 199                         case "System.DateTime": //日期类型
 200                             DateTime dateV;
 201                             DateTime.TryParse(drValue, out dateV);
 202                             newCell.SetCellValue(dateV);
 203 
 204                             newCell.CellStyle = dateStyle; //格式化显示
 205                             break;
 206                         case "System.Boolean": //布尔型
 207                             bool boolV = false;
 208                             bool.TryParse(drValue, out boolV);
 209                             newCell.SetCellValue(boolV);
 210                             break;
 211                         case "System.Int16": //整型
 212                         case "System.Int32":
 213                         case "System.Int64":
 214                         case "System.Byte":
 215                             int intV = 0;
 216                             int.TryParse(drValue, out intV);
 217                             newCell.SetCellValue(intV);
 218                             break;
 219                         case "System.Decimal": //浮点型
 220                         case "System.Double":
 221                             double doubV = 0;
 222                             double.TryParse(drValue, out doubV);
 223                             newCell.SetCellValue(doubV);
 224                             break;
 225                         case "System.DBNull": //空值处理
 226                             newCell.SetCellValue("");
 227                             break;
 228                         default:
 229                             newCell.SetCellValue("");
 230                             break;
 231                     }
 232 
 233                 }
 234 
 235                 #endregion
 236 
 237                 rowIndex++;
 238             }
 239             using (MemoryStream ms = new MemoryStream())
 240             {
 241                 workbook.Write(ms);
 242                 ms.Flush();
 243                 ms.Position = 0;
 244 
 245                 //sheet;
 246                 //workbook.Dispose();
 247 
 248                 return ms;
 249             }
 250         }
 251 
 252         /// <summary>
 253         /// DataTable导出到Excel文件
 254         /// </summary>
 255         /// <param name="dtSource">源DataTable</param>
 256         /// <param name="strHeaderText">表头文本</param>
 257         /// <param name="strFileName">保存位置</param>
 258         public static void ExportDTtoExcel(DataTable dtSource, string strHeaderText, string strFileName)
 259         {
 260             using (MemoryStream ms = ExportDT(dtSource, strHeaderText))
 261             {
 262                 using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
 263                 {
 264                     byte[] data = ms.ToArray();
 265                     fs.Write(data, 0, data.Length);
 266                     fs.Flush();
 267                 }
 268             }
 269         }
 270         #endregion
 271 
 272         #region 从excel2003中将数据导出到datatable
 273         /// <summary>读取excel
 274         /// 默认第一行为标头
 275         /// </summary>
 276         /// <param name="strFileName">excel文档路径</param>
 277         /// <returns></returns>
 278         public static DataTable ImportExcel2003toDt(string strFileName)
 279         {
 280             DataTable dt = new DataTable();
 281             IWorkbook hssfworkbook;
 282             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 283             {
 284                 hssfworkbook = new HSSFWorkbook(file);
 285             }
 286             HSSFSheet sheet = hssfworkbook.GetSheetAt(0) as HSSFSheet;
 287             dt = ImportExcel2003InDt(sheet, 0, true);
 288             return dt;
 289         }
 290 
 291         /// <summary>读取excel
 292         /// 默认第一行为标头
 293         /// </summary>
 294         /// <param name="strFileName">excel文档路径</param>
 295         /// <returns></returns>
 296         public static DataTable ImportExcel2007toDt(string strFileName)
 297         {
 298             DataTable dt = new DataTable();
 299             IWorkbook hssfworkbook;
 300             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 301             {
 302                 hssfworkbook = new XSSFWorkbook(file);
 303             }
 304             ISheet sheet = hssfworkbook.GetSheetAt(0);
 305             dt = ImportExcel2007InDt(sheet, 0, true);
 306             return dt;
 307         }
 308 
 309         /// <summary>
 310         /// 读取excel
 311         /// </summary>
 312         /// <param name="strFileName">excel文件路径</param>
 313         /// <param name="sheet">需要导出的sheet</param>
 314         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 315         /// <returns></returns>
 316         public static DataTable ImportExcel2003toDt(string strFileName, string SheetName, int HeaderRowIndex)
 317         {
 318             IWorkbook workbook;
 319             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 320             {
 321                 workbook = new HSSFWorkbook(file);
 322             }
 323             HSSFSheet sheet = workbook.GetSheet(SheetName) as HSSFSheet;
 324             DataTable table = new DataTable();
 325             table = ImportExcel2003InDt(sheet, HeaderRowIndex, true);
 326             //ExcelFileStream.Close();
 327             workbook = null;
 328             sheet = null;
 329             return table;
 330         }
 331 
 332         /// <summary>
 333         /// 读取excel
 334         /// </summary>
 335         /// <param name="strFileName">excel文件路径</param>
 336         /// <param name="sheet">需要导出的sheet</param>
 337         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 338         /// <returns></returns>
 339         public static DataTable ImportExcel2007toDt(string strFileName, string SheetName, int HeaderRowIndex)
 340         {
 341             IWorkbook workbook;
 342             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 343             {
 344                 workbook = new XSSFWorkbook(file);
 345             }
 346             HSSFSheet sheet = workbook.GetSheet(SheetName) as HSSFSheet;
 347             DataTable table = new DataTable();
 348             table = ImportExcel2007InDt(sheet, HeaderRowIndex, true);
 349             //ExcelFileStream.Close();
 350             workbook = null;
 351             sheet = null;
 352             return table;
 353         }
 354 
 355         /// <summary>
 356         /// 读取excel
 357         /// </summary>
 358         /// <param name="strFileName">excel文件路径</param>
 359         /// <param name="sheet">需要导出的sheet序号</param>
 360         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 361         /// <returns></returns>
 362         public static DataTable ImportExcel2003toDt(string strFileName, int SheetIndex, int HeaderRowIndex)
 363         {
 364             HSSFWorkbook workbook;
 365             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 366             {
 367                 workbook = new HSSFWorkbook(file);
 368             }
 369             HSSFSheet sheet = workbook.GetSheetAt(SheetIndex) as HSSFSheet;
 370             DataTable table = new DataTable();
 371             table = ImportExcel2003InDt(sheet, HeaderRowIndex, true);
 372             //ExcelFileStream.Close();
 373             workbook = null;
 374             sheet = null;
 375             return table;
 376         }
 377         /// <summary>
 378         /// 读取excel
 379         /// </summary>
 380         /// <param name="strFileName">excel文件路径</param>
 381         /// <param name="sheet">需要导出的sheet序号</param>
 382         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 383         /// <returns></returns>
 384         public static DataTable ImportExcel2007toDt(string strFileName, int SheetIndex, int HeaderRowIndex)
 385         {
 386             IWorkbook workbook;
 387             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 388             {
 389                 workbook = new XSSFWorkbook(file);
 390             }
 391             HSSFSheet sheet = workbook.GetSheetAt(SheetIndex) as HSSFSheet;
 392             DataTable table = new DataTable();
 393             table = ImportExcel2007InDt(sheet, HeaderRowIndex, true);
 394             //ExcelFileStream.Close();
 395             workbook = null;
 396             sheet = null;
 397             return table;
 398         }
 399 
 400         /// <summary>
 401         /// 读取excel
 402         /// </summary>
 403         /// <param name="strFileName">excel文件路径</param>
 404         /// <param name="sheet">需要导出的sheet</param>
 405         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 406         /// <returns></returns>
 407         public static DataTable ImportExcel2003toDt(string strFileName, string SheetName, int HeaderRowIndex, bool needHeader)
 408         {
 409             IWorkbook workbook;
 410             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 411             {
 412                 workbook = new HSSFWorkbook(file);
 413             }
 414             HSSFSheet sheet = workbook.GetSheet(SheetName) as HSSFSheet;
 415             DataTable table = new DataTable();
 416             table = ImportExcel2003InDt(sheet, HeaderRowIndex, needHeader);
 417             //ExcelFileStream.Close();
 418             workbook = null;
 419             sheet = null;
 420             return table;
 421         }
 422 
 423         /// <summary>
 424         /// 读取excel
 425         /// </summary>
 426         /// <param name="strFileName">excel文件路径</param>
 427         /// <param name="sheet">需要导出的sheet序号</param>
 428         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 429         /// <returns></returns>
 430         public static DataTable ImportExcel2003toDt(string strFileName, int SheetIndex, int HeaderRowIndex, bool needHeader)
 431         {
 432             HSSFWorkbook workbook;
 433             using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
 434             {
 435                 workbook = new HSSFWorkbook(file);
 436             }
 437             HSSFSheet sheet = workbook.GetSheetAt(SheetIndex) as HSSFSheet;
 438             DataTable table = new DataTable();
 439             table = ImportExcel2003InDt(sheet, HeaderRowIndex, needHeader);
 440             //ExcelFileStream.Close();
 441             workbook = null;
 442             sheet = null;
 443             return table;
 444         }
 445 
 446         static DataTable ImportExcel2003InDt(ISheet sheet, int HeaderRowIndex, bool needHeader)
 447         {
 448             DataTable table = new DataTable();
 449             HSSFRow headerRow;
 450             int cellCount;
 451             try
 452             {
 453                 if (HeaderRowIndex < 0 || !needHeader)
 454                 {
 455                     headerRow = sheet.GetRow(0) as HSSFRow;
 456                     cellCount = headerRow.LastCellNum;
 457 
 458                     for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
 459                     {
 460                         DataColumn column = new DataColumn(Convert.ToString(i));
 461                         table.Columns.Add(column);
 462                     }
 463                 }
 464                 else
 465                 {
 466                     headerRow = sheet.GetRow(HeaderRowIndex) as HSSFRow;
 467                     cellCount = headerRow.LastCellNum;
 468 
 469                     for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
 470                     {
 471                         if (headerRow.GetCell(i) == null)
 472                         {
 473                             if (table.Columns.IndexOf(Convert.ToString(i)) > 0)
 474                             {
 475                                 DataColumn column = new DataColumn(Convert.ToString("重复列名" + i));
 476                                 table.Columns.Add(column);
 477                             }
 478                             else
 479                             {
 480                                 DataColumn column = new DataColumn(Convert.ToString(i));
 481                                 table.Columns.Add(column);
 482                             }
 483 
 484                         }
 485                         else if (table.Columns.IndexOf(headerRow.GetCell(i).ToString()) > 0)
 486                         {
 487                             DataColumn column = new DataColumn(Convert.ToString("重复列名" + i));
 488                             table.Columns.Add(column);
 489                         }
 490                         else
 491                         {
 492                             DataColumn column = new DataColumn(headerRow.GetCell(i).ToString());
 493                             table.Columns.Add(column);
 494                         }
 495                     }
 496                 }
 497                 int rowCount = sheet.LastRowNum;
 498                 for (int i = (HeaderRowIndex + 1); i <= sheet.LastRowNum; i++)
 499                 {
 500                     try
 501                     {
 502                         HSSFRow row;
 503                         if (sheet.GetRow(i) == null)
 504                         {
 505                             row = sheet.CreateRow(i) as HSSFRow;
 506                         }
 507                         else
 508                         {
 509                             row = sheet.GetRow(i) as HSSFRow;
 510                         }
 511 
 512                         DataRow dataRow = table.NewRow();
 513 
 514                         for (int j = row.FirstCellNum; j <= cellCount; j++)
 515                         {
 516                             try
 517                             {
 518                                 if (row.GetCell(j) != null)
 519                                 {
 520                                     switch (row.GetCell(j).CellType)
 521                                     {
 522                                         case CellType.String:
 523                                             string str = row.GetCell(j).StringCellValue;
 524                                             if (str != null && str.Length > 0)
 525                                             {
 526                                                 dataRow[j] = str.ToString();
 527                                             }
 528                                             else
 529                                             {
 530                                                 dataRow[j] = null;
 531                                             }
 532                                             break;
 533                                         case CellType.Numeric:
 534                                             if (DateUtil.IsCellDateFormatted(row.GetCell(j)))
 535                                             {
 536                                                 dataRow[j] = DateTime.FromOADate(row.GetCell(j).NumericCellValue);
 537                                             }
 538                                             else
 539                                             {
 540                                                 dataRow[j] = Convert.ToDouble(row.GetCell(j).NumericCellValue);
 541                                             }
 542                                             break;
 543                                         case CellType.Boolean:
 544                                             dataRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
 545                                             break;
 546                                         case CellType.Error:
 547                                             dataRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);
 548                                             break;
 549                                         case CellType.Formula:
 550                                             switch (row.GetCell(j).CachedFormulaResultType)
 551                                             {
 552                                                 case CellType.String:
 553                                                     string strFORMULA = row.GetCell(j).StringCellValue;
 554                                                     if (strFORMULA != null && strFORMULA.Length > 0)
 555                                                     {
 556                                                         dataRow[j] = strFORMULA.ToString();
 557                                                     }
 558                                                     else
 559                                                     {
 560                                                         dataRow[j] = null;
 561                                                     }
 562                                                     break;
 563                                                 case CellType.Numeric:
 564                                                     dataRow[j] = Convert.ToString(row.GetCell(j).NumericCellValue);
 565                                                     break;
 566                                                 case CellType.Boolean:
 567                                                     dataRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
 568                                                     break;
 569                                                 case CellType.Error:
 570                                                     dataRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);
 571                                                     break;
 572                                                 default:
 573                                                     dataRow[j] = "";
 574                                                     break;
 575                                             }
 576                                             break;
 577                                         default:
 578                                             dataRow[j] = "";
 579                                             break;
 580                                     }
 581                                 }
 582                             }
 583                             catch (Exception exception)
 584                             {
 585                                 //wl.WriteLogs(exception.ToString());
 586                             }
 587                         }
 588                         table.Rows.Add(dataRow);
 589                     }
 590                     catch (Exception exception)
 591                     {
 592                         //wl.WriteLogs(exception.ToString());
 593                     }
 594                 }
 595             }
 596             catch (Exception exception)
 597             {
 598                 //wl.WriteLogs(exception.ToString());
 599             }
 600             return table;
 601         }
 602 
 603         /// <summary>
 604         /// 将制定sheet中的数据导出到datatable中
 605         /// </summary>
 606         /// <param name="sheet">需要导出的sheet</param>
 607         /// <param name="HeaderRowIndex">列头所在行号,-1表示没有列头</param>
 608         /// <returns></returns>
 609         static DataTable ImportExcel2007InDt(ISheet sheet, int HeaderRowIndex, bool needHeader)
 610         {
 611             DataTable table = new DataTable();
 612             NPOI.XSSF.UserModel.XSSFRow headerRow;
 613             int cellCount;
 614             try
 615             {
 616                 if (HeaderRowIndex < 0 || !needHeader)
 617                 {
 618                     headerRow = sheet.GetRow(0) as NPOI.XSSF.UserModel.XSSFRow;
 619                     cellCount = headerRow.LastCellNum;
 620 
 621                     for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
 622                     {
 623                         DataColumn column = new DataColumn(Convert.ToString(i));
 624                         table.Columns.Add(column);
 625                     }
 626                 }
 627                 else
 628                 {
 629                     headerRow = sheet.GetRow(HeaderRowIndex) as NPOI.XSSF.UserModel.XSSFRow;
 630                     cellCount = headerRow.LastCellNum;
 631 
 632                     for (int i = headerRow.FirstCellNum; i <= cellCount; i++)
 633                     {
 634                         if (headerRow.GetCell(i) == null)
 635                         {
 636                             if (table.Columns.IndexOf(Convert.ToString(i)) > 0)
 637                             {
 638                                 DataColumn column = new DataColumn(Convert.ToString("重复列名" + i));
 639                                 table.Columns.Add(column);
 640                             }
 641                             else
 642                             {
 643                                 DataColumn column = new DataColumn(Convert.ToString(i));
 644                                 table.Columns.Add(column);
 645                             }
 646 
 647                         }
 648                         else if (table.Columns.IndexOf(headerRow.GetCell(i).ToString()) > 0)
 649                         {
 650                             DataColumn column = new DataColumn(Convert.ToString("重复列名" + i));
 651                             table.Columns.Add(column);
 652                         }
 653                         else
 654                         {
 655                             DataColumn column = new DataColumn(headerRow.GetCell(i).ToString());
 656                             table.Columns.Add(column);
 657                         }
 658                     }
 659                 }
 660                 int rowCount = sheet.LastRowNum;
 661                 for (int i = (HeaderRowIndex + 1); i <= sheet.LastRowNum; i++)
 662                 {
 663                     try
 664                     {
 665                         NPOI.XSSF.UserModel.XSSFRow row;
 666                         if (sheet.GetRow(i) == null)
 667                         {
 668                             row = sheet.CreateRow(i) as NPOI.XSSF.UserModel.XSSFRow;
 669                         }
 670                         else
 671                         {
 672                             row = sheet.GetRow(i) as NPOI.XSSF.UserModel.XSSFRow;
 673                         }
 674 
 675                         DataRow dataRow = table.NewRow();
 676 
 677                         for (int j = row.FirstCellNum; j <= cellCount; j++)
 678                         {
 679                             try
 680                             {
 681                                 if (row.GetCell(j) != null)
 682                                 {
 683                                     switch (row.GetCell(j).CellType)
 684                                     {
 685                                         case CellType.String:
 686                                             string str = row.GetCell(j).StringCellValue;
 687                                             if (str != null && str.Length > 0)
 688                                             {
 689                                                 dataRow[j] = str.ToString();
 690                                             }
 691                                             else
 692                                             {
 693                                                 dataRow[j] = null;
 694                                             }
 695                                             break;
 696                                         case CellType.Numeric:
 697                                             if (DateUtil.IsCellDateFormatted(row.GetCell(j)))
 698                                             {
 699                                                 dataRow[j] = DateTime.FromOADate(row.GetCell(j).NumericCellValue);
 700                                             }
 701                                             else
 702                                             {
 703                                                 dataRow[j] = Convert.ToDouble(row.GetCell(j).NumericCellValue);
 704                                             }
 705                                             break;
 706                                         case CellType.Boolean:
 707                                             dataRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
 708                                             break;
 709                                         case CellType.Error:
 710                                             dataRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);
 711                                             break;
 712                                         case CellType.Formula:
 713                                             switch (row.GetCell(j).CachedFormulaResultType)
 714                                             {
 715                                                 case CellType.String:
 716                                                     string strFORMULA = row.GetCell(j).StringCellValue;
 717                                                     if (strFORMULA != null && strFORMULA.Length > 0)
 718                                                     {
 719                                                         dataRow[j] = strFORMULA.ToString();
 720                                                     }
 721                                                     else
 722                                                     {
 723                                                         dataRow[j] = null;
 724                                                     }
 725                                                     break;
 726                                                 case CellType.Numeric:
 727                                                     dataRow[j] = Convert.ToString(row.GetCell(j).NumericCellValue);
 728                                                     break;
 729                                                 case CellType.Boolean:
 730                                                     dataRow[j] = Convert.ToString(row.GetCell(j).BooleanCellValue);
 731                                                     break;
 732                                                 case CellType.Error:
 733                                                     dataRow[j] = ErrorEval.GetText(row.GetCell(j).ErrorCellValue);
 734                                                     break;
 735                                                 default:
 736                                                     dataRow[j] = "";
 737                                                     break;
 738                                             }
 739                                             break;
 740                                         default:
 741                                             dataRow[j] = "";
 742                                             break;
 743                                     }
 744                                 }
 745                             }
 746                             catch (Exception exception)
 747                             {
 748                                 //wl.WriteLogs(exception.ToString());
 749                             }
 750                         }
 751                         table.Rows.Add(dataRow);
 752                     }
 753                     catch (Exception exception)
 754                     {
 755                         //wl.WriteLogs(exception.ToString());
 756                     }
 757                 }
 758             }
 759             catch (Exception exception)
 760             {
 761                 //wl.WriteLogs(exception.ToString());
 762             }
 763             return table;
 764         }
 765         #endregion
 766 
 767         #region 更新excel中的数据
 768 
 769         //批量更新,必须所有的excel都是一样的格式
 770         public static void UpdateExcelBatch(string outputFile, List<DataTable> pListTable)
 771         {
 772             //列从0开始
 773             //行从0开始
 774             int coluid = 0;
 775             int rowid = 1;
 776 
 777             FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
 778 
 779             HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
 780 
 781             foreach (DataTable pTable in pListTable)
 782             {
 783                 string sheetname = pTable.TableName;//对应excel的sheet
 784                 ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
 785                 int rownum = 1;
 786                 int column = 0;
 787                 foreach (DataRow pRow in pTable.Rows)
 788                 {
 789                     try
 790                     {
 791                         IRow pR = sheet1.CreateRow(rownum);
 792                         for (int k = 0; k < pTable.Columns.Count; k++)
 793                         {
 794                             column = k + coluid;//列从0开始
 795                             ICell pCell = pR.CreateCell(column);
 796                             pCell.SetCellValue(pRow[k].ToString());
 797                         }
 798                         rownum++;
 799                         //  column++;
 800                     }
 801                     catch (Exception ex)
 802                     {
 803                         // wl.WriteLogs(ex.ToString());
 804                         throw;
 805                     }
 806                 }
 807             }
 808             try
 809             {
 810                 readfile.Close();
 811                 FileStream writefile = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
 812                 hssfworkbook.Write(writefile);
 813                 writefile.Close();
 814             }
 815             catch (Exception ex)
 816             {
 817                 // wl.WriteLogs(ex.ToString());
 818             }
 819 
 820         }
 821 
 822         public static void UpdateExcel(string outputFile, string sheetname, DataTable pTable)
 823         {
 824             //列从0开始
 825             //行从0开始
 826             int coluid = 0;
 827             int rowid = 1;
 828 
 829             FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
 830 
 831             HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
 832             ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
 833             int rownum = 1;
 834             int column = 0;
 835             foreach (DataRow pRow in pTable.Rows)
 836             {
 837                 try
 838                 {
 839                     IRow pR = sheet1.CreateRow(rownum);
 840                     for (int k = 0; k < pTable.Columns.Count; k++)
 841                     {
 842                         column = k + coluid;//列从0开始
 843                         ICell pCell = pR.CreateCell(column);
 844                         pCell.SetCellValue(pRow[k].ToString());
 845                     }
 846                     rownum++;
 847                     //  column++;
 848                 }
 849                 catch (Exception ex)
 850                 {
 851                     // wl.WriteLogs(ex.ToString());
 852                     throw;
 853                 }
 854             }
 855             try
 856             {
 857                 readfile.Close();
 858                 FileStream writefile = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
 859                 hssfworkbook.Write(writefile);
 860                 writefile.Close();
 861             }
 862             catch (Exception ex)
 863             {
 864                 // wl.WriteLogs(ex.ToString());
 865             }
 866 
 867         }
 868         /// <summary>
 869         /// 更新Excel表格
 870         /// </summary>
 871         /// <param name="outputFile">需更新的excel表格路径</param>
 872         /// <param name="sheetname">sheet名</param>
 873         /// <param name="updateData">需更新的数据</param>
 874         /// <param name="coluid">需更新的列号</param>
 875         /// <param name="rowid">需更新的开始行号</param>
 876         public static void UpdateExcel(string outputFile, string sheetname, string[] updateData, int coluid, int rowid)
 877         {
 878             FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
 879 
 880             HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
 881             ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
 882             for (int i = 0; i < updateData.Length; i++)
 883             {
 884                 try
 885                 {
 886                     if (sheet1.GetRow(i + rowid) == null)
 887                     {
 888                         sheet1.CreateRow(i + rowid);
 889                     }
 890                     if (sheet1.GetRow(i + rowid).GetCell(coluid) == null)
 891                     {
 892                         sheet1.GetRow(i + rowid).CreateCell(coluid);
 893                     }
 894 
 895                     sheet1.GetRow(i + rowid).GetCell(coluid).SetCellValue(updateData[i]);
 896                 }
 897                 catch (Exception ex)
 898                 {
 899                     // wl.WriteLogs(ex.ToString());
 900                     throw;
 901                 }
 902             }
 903             try
 904             {
 905                 readfile.Close();
 906                 FileStream writefile = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
 907                 hssfworkbook.Write(writefile);
 908                 writefile.Close();
 909             }
 910             catch (Exception ex)
 911             {
 912                 // wl.WriteLogs(ex.ToString());
 913             }
 914 
 915         }
 916 
 917         /// <summary>
 918         /// 更新Excel表格
 919         /// </summary>
 920         /// <param name="outputFile">需更新的excel表格路径</param>
 921         /// <param name="sheetname">sheet名</param>
 922         /// <param name="updateData">需更新的数据</param>
 923         /// <param name="coluids">需更新的列号</param>
 924         /// <param name="rowid">需更新的开始行号</param>
 925         public static void UpdateExcel(string outputFile, string sheetname, string[][] updateData, int[] coluids, int rowid)
 926         {
 927             FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
 928 
 929             HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
 930             readfile.Close();
 931             ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
 932             for (int j = 0; j < coluids.Length; j++)
 933             {
 934                 for (int i = 0; i < updateData[j].Length; i++)
 935                 {
 936                     try
 937                     {
 938                         if (sheet1.GetRow(i + rowid) == null)
 939                         {
 940                             sheet1.CreateRow(i + rowid);
 941                         }
 942                         if (sheet1.GetRow(i + rowid).GetCell(coluids[j]) == null)
 943                         {
 944                             sheet1.GetRow(i + rowid).CreateCell(coluids[j]);
 945                         }
 946                         sheet1.GetRow(i + rowid).GetCell(coluids[j]).SetCellValue(updateData[j][i]);
 947                     }
 948                     catch (Exception ex)
 949                     {
 950                         // wl.WriteLogs(ex.ToString());
 951                     }
 952                 }
 953             }
 954             try
 955             {
 956                 FileStream writefile = new FileStream(outputFile, FileMode.Create);
 957                 hssfworkbook.Write(writefile);
 958                 writefile.Close();
 959             }
 960             catch (Exception ex)
 961             {
 962                 //wl.WriteLogs(ex.ToString());
 963             }
 964         }
 965 
 966         /// <summary>
 967         /// 更新Excel表格
 968         /// </summary>
 969         /// <param name="outputFile">需更新的excel表格路径</param>
 970         /// <param name="sheetname">sheet名</param>
 971         /// <param name="updateData">需更新的数据</param>
 972         /// <param name="coluid">需更新的列号</param>
 973         /// <param name="rowid">需更新的开始行号</param>
 974         public static void UpdateExcel(string outputFile, string sheetname, double[] updateData, int coluid, int rowid)
 975         {
 976             FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
 977 
 978             HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
 979             ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
 980             for (int i = 0; i < updateData.Length; i++)
 981             {
 982                 try
 983                 {
 984                     if (sheet1.GetRow(i + rowid) == null)
 985                     {
 986                         sheet1.CreateRow(i + rowid);
 987                     }
 988                     if (sheet1.GetRow(i + rowid).GetCell(coluid) == null)
 989                     {
 990                         sheet1.GetRow(i + rowid).CreateCell(coluid);
 991                     }
 992 
 993                     sheet1.GetRow(i + rowid).GetCell(coluid).SetCellValue(updateData[i]);
 994                 }
 995                 catch (Exception ex)
 996                 {
 997                     //wl.WriteLogs(ex.ToString());
 998                     throw;
 999                 }
1000             }
1001             try
1002             {
1003                 readfile.Close();
1004                 FileStream writefile = new FileStream(outputFile, FileMode.Create, FileAccess.Write);
1005                 hssfworkbook.Write(writefile);
1006                 writefile.Close();
1007             }
1008             catch (Exception ex)
1009             {
1010                 //wl.WriteLogs(ex.ToString());
1011             }
1012 
1013         }
1014 
1015         /// <summary>
1016         /// 更新Excel表格
1017         /// </summary>
1018         /// <param name="outputFile">需更新的excel表格路径</param>
1019         /// <param name="sheetname">sheet名</param>
1020         /// <param name="updateData">需更新的数据</param>
1021         /// <param name="coluids">需更新的列号</param>
1022         /// <param name="rowid">需更新的开始行号</param>
1023         public static void UpdateExcel(string outputFile, string sheetname, double[][] updateData, int[] coluids, int rowid)
1024         {
1025             FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1026 
1027             HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
1028             readfile.Close();
1029             ISheet sheet1 = hssfworkbook.GetSheet(sheetname);
1030             for (int j = 0; j < coluids.Length; j++)
1031             {
1032                 for (int i = 0; i < updateData[j].Length; i++)
1033                 {
1034                     try
1035                     {
1036                         if (sheet1.GetRow(i + rowid) == null)
1037                         {
1038                             sheet1.CreateRow(i + rowid);
1039                         }
1040                         if (sheet1.GetRow(i + rowid).GetCell(coluids[j]) == null)
1041                         {
1042                             sheet1.GetRow(i + rowid).CreateCell(coluids[j]);
1043                         }
1044                         sheet1.GetRow(i + rowid).GetCell(coluids[j]).SetCellValue(updateData[j][i]);
1045                     }
1046                     catch (Exception ex)
1047                     {
1048                         //wl.WriteLogs(ex.ToString());
1049                     }
1050                 }
1051             }
1052             try
1053             {
1054                 FileStream writefile = new FileStream(outputFile, FileMode.Create);
1055                 hssfworkbook.Write(writefile);
1056                 writefile.Close();
1057             }
1058             catch (Exception ex)
1059             {
1060                 //wl.WriteLogs(ex.ToString());
1061             }
1062         }
1063 
1064         #endregion
1065 
1066         public static int GetSheetNumber(string outputFile)
1067         {
1068             int number = 0;
1069             try
1070             {
1071                 FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1072 
1073                 HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
1074                 number = hssfworkbook.NumberOfSheets;
1075 
1076             }
1077             catch (Exception exception)
1078             {
1079                 //wl.WriteLogs(exception.ToString());
1080             }
1081             return number;
1082         }
1083 
1084         public static List<string> GetSheetName(string outputFile)
1085         {
1086             List<string> arrayList = new List<string>();
1087             try
1088             {
1089                 FileStream readfile = new FileStream(outputFile, FileMode.Open, FileAccess.Read);
1090 
1091                 HSSFWorkbook hssfworkbook = new HSSFWorkbook(readfile);
1092                 for (int i = 0; i < hssfworkbook.NumberOfSheets; i++)
1093                 {
1094                     arrayList.Add(hssfworkbook.GetSheetName(i));
1095                 }
1096             }
1097             catch (Exception exception)
1098             {
1099                 //wl.WriteLogs(exception.ToString());
1100             }
1101             return arrayList;
1102         }
1103 
1104         public static bool isNumeric(String message, out double result)
1105         {
1106             Regex rex = new Regex(@"^[-]?\d+[.]?\d*$");
1107             result = -1;
1108             if (rex.IsMatch(message))
1109             {
1110                 result = double.Parse(message);
1111                 return true;
1112             }
1113             else
1114                 return false;
1115 
1116         }
1117     }
1118 }
View Code

 

posted @ 2015-09-08 10:30  feedback  阅读(396)  评论(0编辑  收藏  举报