• 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     }
  • 相关阅读:
    常用的CSS命名规则 (web标准化设计)
    有哪些概率论和数理统计的深入教材可以推荐?
    CV2X国内现状分析
    隐私计算,新能源汽车“安全上路”的“救命稻草”?
    2022年中国车联网行业全景图谱
    2022年十大AI预测:气候独角兽涌现、中美竞争加剧
    OSEK/VDX介绍
    Adaptive Autosar
    基于我国商密算法的车联网5GV2X通信安全可信体系
    行研篇 | 汽车域控制器研究
  • 原文地址:https://www.cnblogs.com/qizhelongdeyang/p/3417599.html
Copyright © 2020-2023  润新知