zoukankan      html  css  js  c++  java
  • NPOI 之导入导出

    
    

    转自https://www.cnblogs.com/zuowj/archive/2015/05/04/4475663.html
    转别人的,做了一点点改动

       1 using NPOI.HSSF.UserModel;
       2 using NPOI.SS.UserModel;
       3 using NPOI.XSSF.UserModel;
       4 using System;
       5 using System.Collections.Generic;
       6 using System.Data;
       7 using System.Linq;
       8 using System.Text;
       9 using System.IO;
      10 using System.Windows.Forms;
      11 using NPOI.SS.Util;
      12 using NPOI.HSSF.Util;
      13 using System.Reflection;
      14 
      15 namespace RaysUtil.Office.Excel
      16 {
      17     //titleRow1.Cells[0].Hyperlink = new HSSFHyperlink(HyperlinkType.Url);
      18     public static class ExcelHelper
      19     {
      20         /// <summary>
      21         /// 获取保存文件路径
      22         /// </summary>
      23         /// <returns></returns>
      24         private static string GetSaveFilePath()
      25         {
      26             SaveFileDialog saveFileDig = new SaveFileDialog();
      27             saveFileDig.Filter = "Excel Office97 - 2003(*.xls) | *.xls | Excel Office2007及以上(*.xlsx) | *.xlsx";
      28             saveFileDig.Title = "导出到";
      29             saveFileDig.OverwritePrompt = true;
      30             saveFileDig.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
      31             string filePath = null;
      32             if (saveFileDig.ShowDialog() == DialogResult.OK)
      33             {
      34                 filePath = saveFileDig.FileName;
      35             }
      36             return filePath;
      37         }
      38         /// <summary>
      39         /// 获取要打开要导入的文件名称(含完整路径)
      40         /// </summary>
      41         /// <returns></returns>
      42         private static string GetOpenFilePath()
      43         {
      44             OpenFileDialog openFileDialog = new OpenFileDialog();
      45             openFileDialog.Filter = "Excel Office97-2003(*.xls)|*.xls|Excel Office2007及以上(*.xlsx)|*.xlsx";
      46             openFileDialog.FilterIndex = 0;
      47             openFileDialog.Title = "打开";
      48             openFileDialog.CheckFileExists = true;
      49             openFileDialog.CheckPathExists = true;
      50             openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
      51             string filePath = null;
      52             if (openFileDialog.ShowDialog() == DialogResult.OK)
      53             {
      54                 filePath = openFileDialog.FileName;
      55             }
      56             return filePath;
      57         }
      58         /// <summary>
      59         /// 是否兼容模式
      60         /// </summary>
      61         /// <param name="filePath">文件路径</param>
      62         /// <returns></returns>
      63         private static bool IsCompatible(string filePath)
      64         {
      65             //return filePath.EndsWith(".xls", StringComparison.OrdinalIgnoreCase);
      66             if (Path.GetExtension(filePath).ToLower() == ".xls")
      67             {
      68                 return true;
      69             }
      70             else if (Path.GetExtension(filePath).ToLower() == ".xlsx")
      71             {
      72                 return false;
      73             }
      74             else
      75             {
      76                 throw new Exception("文件扩展名非法或者文件路径不正确!!!");
      77             }
      78         }
      79         /// <summary>
      80         /// 创建工作簿
      81         /// </summary>
      82         /// <param name="isCompatible">是否兼容模式</param>
      83         /// <returns></returns>
      84         private static IWorkbook CreateWorkbook(bool isCompatible)
      85         {
      86             if (isCompatible)
      87             {
      88                 return new HSSFWorkbook();
      89             }
      90             else
      91             {
      92                 return new XSSFWorkbook();
      93             }
      94         }
      95         /// <summary>
      96         /// 依据文件流创建工作簿
      97         /// </summary>
      98         /// <param name="isCompatible"></param>
      99         /// <param name="stream"></param>
     100         /// <returns></returns>
     101         private static IWorkbook CreateWorkbook(bool isCompatible, dynamic stream)
     102         {
     103             if (isCompatible)
     104             {
     105                 return new HSSFWorkbook(stream);
     106             }
     107             else
     108             {
     109                 return new XSSFWorkbook(stream);
     110             }
     111         }
     112         /// <summary>
     113         /// 创建表格单元格样式
     114         /// </summary>
     115         /// <param name="workbook">当前工作簿</param>
     116         /// <param name="borderStyleB">是否有下边框,默认True</param>
     117         /// <param name="borderStyleL">是否有左边框,默认True</param>
     118         /// <param name="borderStyleR">是否有右边框,默认True</param>
     119         /// <param name="borderStyleT">是否有上边框,默认True</param>
     120         /// <param name="borderStyle">有边框的样式,默认薄边框</param>
     121         /// <param name="colorIndex">背景色</param>
     122         /// <param name="isAlignment">是否横向对齐,默认True</param>
     123         /// <param name="horizontalAlignment">横向对齐,默认横向居中</param>
     124         /// <param name="verticalAlignment">垂直对齐,默认垂直居中</param>
     125         /// <param name="isSetFont">是否设置字体信息,默认False</param>
     126         /// <param name="font">字体信息,默认null</param>
     127         /// <param name="fontSize">字体大小</param>
     128         /// <returns></returns>
     129         private static ICellStyle GetCellStyle(IWorkbook workbook, bool borderStyleB = true, bool borderStyleL = true, bool borderStyleR = true, bool borderStyleT = true, NPOI.SS.UserModel.BorderStyle borderStyle = NPOI.SS.UserModel.BorderStyle.Thin, short colorIndex = HSSFColor.LightGreen.Index, bool isAlignment = true, NPOI.SS.UserModel.HorizontalAlignment horizontalAlignment = NPOI.SS.UserModel.HorizontalAlignment.Center, VerticalAlignment verticalAlignment = VerticalAlignment.Center, bool isSetFont = false, IFont font = null, short fontSize = 30)
     130         {
     131             ICellStyle style = workbook.CreateCellStyle();
     132             style.FillPattern = FillPattern.SolidForeground;
     133             style.FillForegroundColor = colorIndex;
     134             //边框
     135             style.BorderBottom = borderStyleB ? borderStyle : NPOI.SS.UserModel.BorderStyle.None;
     136             style.BorderLeft = borderStyleL ? borderStyle : NPOI.SS.UserModel.BorderStyle.None;
     137             style.BorderRight = borderStyleR ? borderStyle : NPOI.SS.UserModel.BorderStyle.None;
     138             style.BorderTop = borderStyleT ? borderStyle : NPOI.SS.UserModel.BorderStyle.None;
     139             //对齐
     140             if (isAlignment)
     141             {
     142                 style.Alignment = horizontalAlignment;
     143             }
     144             else
     145             {
     146                 style.VerticalAlignment = verticalAlignment;
     147             }
     148             if (isSetFont)
     149             {
     150                 if (font == null)
     151                 {
     152                     font = workbook.CreateFont();
     153                     font.Boldweight = short.MaxValue;
     154                     font.FontHeightInPoints = fontSize;
     155                 }
     156                 style.SetFont(font);
     157             }
     158             return style;
     159         }
     160         /// <summary>
     161         /// 创建表格单元格样式
     162         /// </summary>
     163         /// <param name="workbook">当前工作簿</param>
     164         /// <param name="cellStyle">边框样式模板</param>
     165         /// <returns></returns>
     166         private static ICellStyle GetCellStyle(IWorkbook workbook, CellStyleModel cellStyle)
     167         {
     168             if (cellStyle==null)
     169             {
     170                 cellStyle = new CellStyleModel();
     171             }
     172             ICellStyle style = workbook.CreateCellStyle();
     173             style.FillPattern = FillPattern.SolidForeground;
     174             style.FillForegroundColor = cellStyle.ColorIndex;
     175             //边框
     176             style.BorderBottom = cellStyle.BorderStyleB ? cellStyle.BorderStyle : NPOI.SS.UserModel.BorderStyle.None;
     177             style.BorderLeft = cellStyle.BorderStyleL ? cellStyle.BorderStyle : NPOI.SS.UserModel.BorderStyle.None;
     178             style.BorderRight = cellStyle.BorderStyleR ? cellStyle.BorderStyle : NPOI.SS.UserModel.BorderStyle.None;
     179             style.BorderTop = cellStyle.BorderStyleT ? cellStyle.BorderStyle : NPOI.SS.UserModel.BorderStyle.None;
     180             //对齐
     181             if (cellStyle.IsAlignment)
     182             {
     183                 style.Alignment = cellStyle.HorizontalAlignment;
     184             }
     185             else
     186             {
     187                 style.VerticalAlignment = cellStyle.VerticalAlignment;
     188             }
     189             if (cellStyle.IsSetFont)
     190             {
     191                 if (cellStyle.Font == null)
     192                 {
     193                     cellStyle.Font = workbook.CreateFont();
     194                     cellStyle.Font.Boldweight = short.MaxValue;
     195                     cellStyle.Font.FontHeightInPoints = cellStyle.FontSize;
     196                 }
     197                 style.SetFont(cellStyle.Font);
     198             }
     199             return style;
     200         }
     201         /// <summary>
     202         /// 合并单元格
     203         /// </summary>
     204         /// <param name="sheet">要合并单元格所在的sheet</param>
     205         /// <param name="rowStart">开始行的索引</param>
     206         /// <param name="rowEnd">结束行的索引</param>
     207         /// <param name="colStart">开始列的索引</param>
     208         /// <param name="colEnd">结束行的索引</param>
     209         public static void SetCellRangeAddress(ISheet sheet, int rowStart, int rowEnd, int colStart, int colEnd)
     210         {
     211             CellRangeAddress cellRangeAddress = new CellRangeAddress(rowStart, rowEnd, colStart, colEnd);
     212             sheet.AddMergedRegion(cellRangeAddress);
     213         }
     214         /// <summary>
     215         /// 工作表生成DataTable
     216         /// </summary>
     217         /// <param name="sheet"></param>
     218         /// <param name="headerRowIndex"></param>
     219         /// <returns></returns>
     220         private static DataTable GetDataTableFromSheet(ISheet sheet, int headerRowIndex)
     221         {
     222             DataTable table = new DataTable();
     223             #region 操作首行(标题行)
     224             //获取首行
     225             IRow headerRow = sheet.GetRow(headerRowIndex);
     226             //PhysicalNumberOfCells获取不为空的列个数
     227             //LastCellNum获取最后一个不为空的列个数
     228             int cellCount = headerRow.LastCellNum;
     229             for (int i = headerRow.FirstCellNum; i < cellCount; i++)
     230             {
     231                 if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "")
     232                 {
     233                     //如果标题行遇到空列,则不再向后继续读取
     234                     cellCount = i + 1;//返回真实列数
     235                     break;
     236                 }
     237                 DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
     238                 table.Columns.Add(column);
     239             }
     240             #endregion
     241             #region 遍历数据行,标题行除外
     242             //遍历数据行,标题行除外
     243             for (int i = (headerRowIndex + 1); i < sheet.LastRowNum; i++)
     244             {
     245                 IRow row = sheet.GetRow(i);
     246                 if (row != null && !string.IsNullOrEmpty(row.Cells[0].StringCellValue))
     247                 {
     248                     DataRow dataRow = table.NewRow();
     249                     for (int j = row.FirstCellNum; j < cellCount; j++)
     250                     {
     251                         dataRow[i] = row.GetCellEx(j).ToString();
     252                     }
     253                     table.Rows.Add(dataRow);
     254                 }
     255             }
     256             #endregion
     257             return table;
     258         }
     259         #region 公共导出方法
     260         /// <summary>
     261         /// DataSet导出Excel
     262         /// </summary>
     263         /// <param name="sourceDs">DataSet源</param>
     264         /// <param name="filePath">文件保存路径</param>
     265         /// <param name="titles">首行标题数组</param>
     266         /// <param name="childTitles">子标题数组</param>
     267         /// <param name="dateTimes">子标题时间</param>
     268         /// <param name="cellStyle">样式类</param>
     269         /// <returns>返回生成的Excel保存路径</returns>
     270         public static string ExportToExcel(DataSet sourceDs, string filePath, string[] titles = null, string[] childTitles = null, string[] dateTimes = null)
     271         {
     272             if (string.IsNullOrEmpty(filePath))
     273             {
     274                 filePath = GetSaveFilePath();
     275             }
     276             if (string.IsNullOrEmpty(filePath)) throw new ArgumentNullException("excel文件路径为空字符串或null");
     277             #region 检测标题、子标题、时间
     278             if (titles == null)
     279             {
     280                 titles = new string[sourceDs.Tables.Count];
     281                 for (int i = 0; i < titles.Length; i++)
     282                 {
     283                     titles[i] = sourceDs.Tables[i].TableName;
     284                 }
     285             }
     286             if (dateTimes == null)
     287             {
     288                 dateTimes = new string[sourceDs.Tables.Count];
     289                 for (int i = 0; i < dateTimes.Length; i++)
     290                 {
     291                     titles[i] = DateTime.Now.ToString("yyyy-MM-dd");
     292                 }
     293             }
     294             if (titles != null && (titles.Length < sourceDs.Tables.Count || titles.Length > sourceDs.Tables.Count))
     295             {
     296                 throw new Exception(string.Format("工作表行首Title参数个数应该为{0}", sourceDs.Tables.Count));
     297             }
     298             if (childTitles != null && (childTitles.Length < sourceDs.Tables.Count || childTitles.Length > sourceDs.Tables.Count))
     299             {
     300                 throw new Exception(string.Format("工作表行首Title参数个数应该为{0}", sourceDs.Tables.Count));
     301             }
     302             if (dateTimes != null && (dateTimes.Length < sourceDs.Tables.Count || dateTimes.Length > sourceDs.Tables.Count))
     303             {
     304                 throw new Exception(string.Format("工作表行首Title参数个数应该为{0}", sourceDs.Tables.Count));
     305             }
     306             #endregion
     307 
     308 
     309             bool isCompatible = IsCompatible(filePath);
     310             IWorkbook workbook = CreateWorkbook(isCompatible);
     311             //表头行样式
     312             ICellStyle headerCellStyle = GetCellStyle(workbook, colorIndex: 22);
     313             //数据行样式
     314             ICellStyle dataCellStyle = GetCellStyle(workbook, horizontalAlignment: NPOI.SS.UserModel.HorizontalAlignment.Left, colorIndex: 42);
     315             #region sheet处理
     316             for (int i = 0; i < sourceDs.Tables.Count; i++)
     317             {
     318                 DataTable table = sourceDs.Tables[i];
     319                 string sheetName = string.IsNullOrEmpty(table.TableName) ? "sheet" + i.ToString() : table.TableName;
     320                 ISheet sheet = workbook.CreateSheet(sheetName);
     321                 IRow titleRow1 = sheet.CreateRow(0);
     322                 IRow titleRow2 = sheet.CreateRow(1);
     323                 IRow headerRow = sheet.CreateRow(2);
     324 
     325                 #region 处理首行
     326                 foreach (DataColumn column in table.Columns)
     327                 {
     328                     ICell cell = headerRow.CreateCell(column.Ordinal);
     329                     ICell titleCell1 = titleRow1.CreateCell(column.Ordinal);
     330                     ICell titleCell2 = titleRow2.CreateCell(column.Ordinal);
     331                     cell.SetCellValue(column.ColumnName);
     332                     cell.CellStyle = headerCellStyle;
     333                 }
     334                 //标题行样式
     335                 int cellMaxIndex = titleRow1.LastCellNum - 1;
     336                 SetCellRangeAddress(sheet, 0, 0, 0, cellMaxIndex);
     337                 SetCellRangeAddress(sheet, 1, 1, 0, (int)Math.Floor(cellMaxIndex / 2.0));
     338                 SetCellRangeAddress(sheet, 1, 1, (int)Math.Floor(cellMaxIndex / 2.0) + 1, cellMaxIndex);
     339                 titleRow1.Cells[0].SetCellValue(titles[i]);
     340                 if (childTitles != null)
     341                 {
     342                     titleRow2.Cells[0].SetCellValue(childTitles[i]);
     343                 }
     344                 titleRow2.Cells[(int)Math.Floor(cellMaxIndex / 2.0) + 1].SetCellValue(dateTimes[i]);
     345                 titleRow1.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, borderStyleB: false, colorIndex: 32767, isSetFont: true));
     346 
     347                 titleRow2.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, borderStyleT: false, colorIndex: 32767));
     348                 titleRow2.Cells[0].CellStyle = GetCellStyle(workbook, borderStyleT: false, borderStyleR: false, colorIndex: 32767);
     349                 titleRow2.Cells[titleRow2.LastCellNum - 1].CellStyle = GetCellStyle(workbook, borderStyleT: false, borderStyleL: false, colorIndex: 32767);
     350                 titleRow1.HeightInPoints = 40;
     351                 titleRow2.HeightInPoints = 20;
     352                 #endregion
     353 
     354                 #region 处理数据行,首行除外
     355                 int rowIndex = 3;
     356                 foreach (DataRow row in table.Rows)
     357                 {
     358                     IRow dataRow = sheet.CreateRow(rowIndex);
     359                     foreach (DataColumn column in table.Columns)
     360                     {
     361                         ICell dataCell = dataRow.CreateCell(column.Ordinal);
     362                         dataCell.SetCellValue((row[column] ?? "").ToString());
     363                         dataCell.CellStyle = dataCellStyle;
     364                     }
     365                     rowIndex++;
     366                 }
     367                 #endregion
     368                 //设置列宽
     369                 for (int k = 0; k < table.Columns.Count; k++)
     370                 {
     371                     sheet.SetColumnWidth(k, (table.Columns[k].Caption.Length < 20 ? 20 : table.Columns[k].Caption.Length) * 256);
     372                 }
     373             }
     374             #endregion
     375             #region 保存
     376             using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
     377             {
     378                 workbook.Write(fs);
     379             }
     380             workbook = null;
     381             #endregion
     382             return filePath;
     383         }
     384         /// <summary>
     385         /// DataSet导出Excel
     386         /// </summary>
     387         /// <param name="sourceDs">DataSet源</param>
     388         /// <param name="filePath">文件保存路径</param>
     389         /// <param name="titles">首行标题数组</param>
     390         /// <param name="childTitles">子标题数组</param>
     391         /// <param name="dateTimes">子标题时间</param>
     392         /// <param name="cellStyle">样式类</param>
     393         /// <returns></returns>
     394         public static string ExportToExcel(DataSet sourceDs, string filePath, CellStyleModel cellStyle , string[] titles = null, string[] childTitles = null, string[] dateTimes = null)
     395         {
     396             if (string.IsNullOrEmpty(filePath))
     397             {
     398                 filePath = GetSaveFilePath();
     399             }
     400             if (string.IsNullOrEmpty(filePath)) throw new ArgumentNullException("excel文件路径为空字符串或null");
     401             #region 检测标题、子标题、时间
     402             if (titles == null)
     403             {
     404                 titles = new string[sourceDs.Tables.Count];
     405                 for (int i = 0; i < titles.Length; i++)
     406                 {
     407                     titles[i] = sourceDs.Tables[i].TableName;
     408                 }
     409             }
     410             if (dateTimes == null)
     411             {
     412                 dateTimes = new string[sourceDs.Tables.Count];
     413                 for (int i = 0; i < dateTimes.Length; i++)
     414                 {
     415                     titles[i] = DateTime.Now.ToString("yyyy-MM-dd");
     416                 }
     417             }
     418             if (titles != null && (titles.Length < sourceDs.Tables.Count || titles.Length > sourceDs.Tables.Count))
     419             {
     420                 throw new Exception(string.Format("工作表行首Title参数个数应该为{0}", sourceDs.Tables.Count));
     421             }
     422             if (childTitles != null && (childTitles.Length < sourceDs.Tables.Count || childTitles.Length > sourceDs.Tables.Count))
     423             {
     424                 throw new Exception(string.Format("工作表行首Title参数个数应该为{0}", sourceDs.Tables.Count));
     425             }
     426             if (dateTimes != null && (dateTimes.Length < sourceDs.Tables.Count || dateTimes.Length > sourceDs.Tables.Count))
     427             {
     428                 throw new Exception(string.Format("工作表行首Title参数个数应该为{0}", sourceDs.Tables.Count));
     429             }
     430             #endregion
     431 
     432 
     433             bool isCompatible = IsCompatible(filePath);
     434             IWorkbook workbook = CreateWorkbook(isCompatible);
     435             //表头行样式
     436             ICellStyle headerCellStyle = GetCellStyle(workbook, cellStyle ?? new CellStyleModel { ColorIndex = 22 });
     437             //数据行样式
     438             
     439             ICellStyle dataCellStyle = GetCellStyle(workbook, cellStyle ?? new CellStyleModel { HorizontalAlignment = NPOI.SS.UserModel.HorizontalAlignment.Left, ColorIndex = 42 });
     440             #region sheet处理
     441             for (int i = 0; i < sourceDs.Tables.Count; i++)
     442             {
     443                 DataTable table = sourceDs.Tables[i];
     444                 string sheetName = string.IsNullOrEmpty(table.TableName) ? "sheet" + i.ToString() : table.TableName;
     445                 ISheet sheet = workbook.CreateSheet(sheetName);
     446                 IRow titleRow1 = sheet.CreateRow(0);
     447                 IRow titleRow2 = sheet.CreateRow(1);
     448                 IRow headerRow = sheet.CreateRow(2);
     449 
     450                 #region 处理首行
     451                 foreach (DataColumn column in table.Columns)
     452                 {
     453                     ICell cell = headerRow.CreateCell(column.Ordinal);
     454                     ICell titleCell1 = titleRow1.CreateCell(column.Ordinal);
     455                     ICell titleCell2 = titleRow2.CreateCell(column.Ordinal);
     456                     cell.SetCellValue(column.ColumnName);
     457                     cell.CellStyle = headerCellStyle;
     458                 }
     459                 //标题行样式
     460                 int cellMaxIndex = titleRow1.LastCellNum - 1;
     461                 SetCellRangeAddress(sheet, 0, 0, 0, cellMaxIndex);
     462                 SetCellRangeAddress(sheet, 1, 1, 0, (int)Math.Floor(cellMaxIndex / 2.0));
     463                 SetCellRangeAddress(sheet, 1, 1, (int)Math.Floor(cellMaxIndex / 2.0) + 1, cellMaxIndex);
     464                 titleRow1.Cells[0].SetCellValue(titles[i]);
     465                 if (childTitles != null)
     466                 {
     467                     titleRow2.Cells[0].SetCellValue(childTitles[i]);
     468                 }
     469                 titleRow2.Cells[(int)Math.Floor(cellMaxIndex / 2.0) + 1].SetCellValue(dateTimes[i]);
     470                 titleRow1.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook,
     471                     cellStyle??new CellStyleModel { BorderStyleB=false,ColorIndex=32767,IsSetFont=true}));
     472 
     473                 titleRow2.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook,
     474                     cellStyle??new CellStyleModel { BorderStyleT=false,ColorIndex=32767}));
     475                 titleRow2.Cells[0].CellStyle = GetCellStyle(workbook,
     476                     cellStyle??new CellStyleModel { BorderStyleT=false,BorderStyleR=false,ColorIndex=32767});
     477                 titleRow2.Cells[titleRow2.LastCellNum - 1].CellStyle = GetCellStyle(workbook,
     478                     cellStyle??new CellStyleModel { BorderStyleT=false,BorderStyleL=false,ColorIndex=32767});
     479                 titleRow1.HeightInPoints = 40;
     480                 titleRow2.HeightInPoints = 20;
     481                 #endregion
     482 
     483                 #region 处理数据行,首行除外
     484                 int rowIndex = 3;
     485                 foreach (DataRow row in table.Rows)
     486                 {
     487                     IRow dataRow = sheet.CreateRow(rowIndex);
     488                     foreach (DataColumn column in table.Columns)
     489                     {
     490                         ICell dataCell = dataRow.CreateCell(column.Ordinal);
     491                         dataCell.SetCellValue((row[column] ?? "").ToString());
     492                         dataCell.CellStyle = dataCellStyle;
     493                     }
     494                     rowIndex++;
     495                 }
     496                 #endregion
     497                 //设置列宽
     498                 for (int k = 0; k < table.Columns.Count; k++)
     499                 {
     500                     sheet.SetColumnWidth(k, (table.Columns[k].Caption.Length < 20 ? 20 : table.Columns[k].Caption.Length) * 256);
     501                 }
     502             }
     503             #endregion
     504             #region 保存
     505             using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
     506             {
     507                 workbook.Write(fs);
     508             }
     509             workbook = null;
     510             #endregion
     511             return filePath;
     512         }
     513         /// <summary>
     514         /// DataTable导出Excel
     515         /// </summary>
     516         /// <param name="sourceTable">DataTable源</param>
     517         /// <param name="sheetName">工作表名称</param>
     518         /// <param name="filePath">文件保存路径</param>
     519         /// <param name="title">首行标题</param>
     520         /// <param name="childTitle">子标题</param>
     521         /// <param name="dateTime">子标题时间</param>
     522         /// <param name="cellStyle">样式类</param>
     523         /// <returns>返回生成的Excel保存路径</returns>
     524         public static string ExportToExcel(DataTable sourceTable, string sheetName = "sheet1", string filePath = null, string title = "", string childTitle = "", string dateTime = "")
     525         {
     526             if (sourceTable.Rows.Count <= 0) throw new ArgumentException("DataTable源不存在有效的数据!");
     527             if (string.IsNullOrEmpty(filePath))
     528             {
     529                 filePath = GetSaveFilePath();
     530             }
     531             if (string.IsNullOrEmpty(filePath)) throw new ArgumentNullException("excel文件路径为空字符串或null!");
     532             bool isCompatible = IsCompatible(filePath);
     533             IWorkbook workbook = CreateWorkbook(isCompatible);
     534             //表头行样式
     535             ICellStyle headerCellStyle = GetCellStyle(workbook, colorIndex: 22);
     536             //数据行样式
     537             ICellStyle dataCellStyle = GetCellStyle(workbook, horizontalAlignment: NPOI.SS.UserModel.HorizontalAlignment.Left, colorIndex: 42);
     538             ISheet sheet = workbook.CreateSheet(sheetName);
     539             IRow titleRow1 = sheet.CreateRow(0);
     540             IRow titleRow2 = sheet.CreateRow(1);
     541             IRow headerRow = sheet.CreateRow(2);
     542 
     543             #region 处理首行
     544             foreach (DataColumn column in sourceTable.Columns)
     545             {
     546                 ICell cell = headerRow.CreateCell(column.Ordinal);
     547                 ICell titleCell1 = titleRow1.CreateCell(column.Ordinal);
     548                 ICell titleCell2 = titleRow2.CreateCell(column.Ordinal);
     549                 cell.SetCellValue(column.ColumnName);
     550                 cell.CellStyle = headerCellStyle;
     551             }
     552 
     553             //标题行样式
     554             int cellMaxIndex = titleRow1.LastCellNum - 1;
     555             SetCellRangeAddress(sheet, 0, 0, 0, titleRow1.LastCellNum - 1);
     556             SetCellRangeAddress(sheet, 1, 1, 0, (int)Math.Floor(cellMaxIndex / 2.0));
     557             SetCellRangeAddress(sheet, 1, 1, (int)Math.Floor(cellMaxIndex / 2.0) + 1, cellMaxIndex);
     558 
     559             titleRow1.Cells[0].SetCellValue(string.IsNullOrEmpty(title) ? sourceTable.TableName : title);
     560             titleRow2.Cells[0].SetCellValue(childTitle);
     561             titleRow2.Cells[(int)Math.Floor(cellMaxIndex / 2.0) + 1].SetCellValue(string.IsNullOrEmpty(dateTime) ? DateTime.Now.ToString("yyyy-MM-dd") : dateTime);
     562 
     563             titleRow1.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, borderStyleB: false, colorIndex: 32767, isSetFont: true));
     564 
     565             //titleRow2.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, borderStyleT: false, colorIndex: 32767));
     566             titleRow2.Cells[0].CellStyle = GetCellStyle(workbook, borderStyleT: false, borderStyleR: false, colorIndex: 32767);
     567             titleRow2.Cells[titleRow2.LastCellNum - 1].CellStyle = GetCellStyle(workbook, borderStyleT: false, borderStyleL: false, colorIndex: 32767);
     568 
     569             titleRow1.HeightInPoints = 40;
     570             titleRow2.HeightInPoints = 20;
     571             #endregion
     572 
     573             #region 处理数据行,首行除外
     574             int rowIndex = 3;
     575             foreach (DataRow row in sourceTable.Rows)
     576             {
     577                 IRow dataRow = sheet.CreateRow(rowIndex);
     578                 foreach (DataColumn column in sourceTable.Columns)
     579                 {
     580                     ICell dataCell = dataRow.CreateCell(column.Ordinal);
     581                     dataCell.SetCellValue((row[column] ?? "").ToString());
     582                     dataCell.CellStyle = dataCellStyle;
     583                 }
     584                 rowIndex++;
     585             }
     586             //设置列宽
     587             for (int k = 0; k < sourceTable.Columns.Count; k++)
     588             {
     589                 sheet.SetColumnWidth(k, (sourceTable.Columns[k].Caption.Length < 20 ? 20 : sourceTable.Columns[k].Caption.Length) * 256);
     590             }
     591             #endregion
     592             #region 保存
     593             using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
     594             {
     595                 workbook.Write(fs);
     596             }
     597             sheet = null;
     598             headerRow = null;
     599             workbook = null;
     600             #endregion
     601             return filePath;
     602         }
     603         /// <summary>
     604         /// DataTable导出Excel
     605         /// </summary>
     606         /// <param name="sourceTable">DataTable源</param>
     607         /// <param name="sheetName">工作表名称</param>
     608         /// <param name="filePath">文件保存路径</param>
     609         /// <param name="title">首行标题</param>
     610         /// <param name="childTitle">子标题</param>
     611         /// <param name="dateTime">子标题时间</param>
     612         /// <param name="cellStyle">样式类</param>
     613         /// <returns></returns>
     614         public static string ExportToExcel(DataTable sourceTable, CellStyleModel cellStyle, string sheetName = "sheet1", string filePath = null, string title = "", string childTitle = "", string dateTime = "")
     615         {
     616             if (sourceTable.Rows.Count <= 0) throw new ArgumentException("DataTable源不存在有效的数据!");
     617             if (string.IsNullOrEmpty(filePath))
     618             {
     619                 filePath = GetSaveFilePath();
     620             }
     621             if (string.IsNullOrEmpty(filePath)) throw new ArgumentNullException("excel文件路径为空字符串或null!");
     622             bool isCompatible = IsCompatible(filePath);
     623             IWorkbook workbook = CreateWorkbook(isCompatible);
     624             //表头行样式
     625             ICellStyle headerCellStyle = GetCellStyle(workbook, cellStyle??new CellStyleModel { ColorIndex=22});
     626             //数据行样式
     627             ICellStyle dataCellStyle = GetCellStyle(workbook, cellStyle??new CellStyleModel { HorizontalAlignment=NPOI.SS.UserModel.HorizontalAlignment.Left,ColorIndex=42});
     628             ISheet sheet = workbook.CreateSheet(sheetName);
     629             IRow titleRow1 = sheet.CreateRow(0);
     630             IRow titleRow2 = sheet.CreateRow(1);
     631             IRow headerRow = sheet.CreateRow(2);
     632 
     633             #region 处理首行
     634             foreach (DataColumn column in sourceTable.Columns)
     635             {
     636                 ICell cell = headerRow.CreateCell(column.Ordinal);
     637                 ICell titleCell1 = titleRow1.CreateCell(column.Ordinal);
     638                 ICell titleCell2 = titleRow2.CreateCell(column.Ordinal);
     639                 cell.SetCellValue(column.ColumnName);
     640                 cell.CellStyle = headerCellStyle;
     641             }
     642 
     643             //标题行样式
     644             int cellMaxIndex = titleRow1.LastCellNum - 1;
     645             SetCellRangeAddress(sheet, 0, 0, 0, titleRow1.LastCellNum - 1);
     646             SetCellRangeAddress(sheet, 1, 1, 0, (int)Math.Floor(cellMaxIndex / 2.0));
     647             SetCellRangeAddress(sheet, 1, 1, (int)Math.Floor(cellMaxIndex / 2.0) + 1, cellMaxIndex);
     648 
     649             titleRow1.Cells[0].SetCellValue(string.IsNullOrEmpty(title) ? sourceTable.TableName : title);
     650             titleRow2.Cells[0].SetCellValue(childTitle);
     651             titleRow2.Cells[(int)Math.Floor(cellMaxIndex / 2.0) + 1].SetCellValue(string.IsNullOrEmpty(dateTime) ? DateTime.Now.ToString("yyyy-MM-dd") : dateTime);
     652 
     653             titleRow1.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, 
     654                 cellStyle??new CellStyleModel { BorderStyleB=false,ColorIndex=32767,IsSetFont=true}));
     655             //titleRow2.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, borderStyleT: false, colorIndex: 32767));
     656             titleRow2.Cells[0].CellStyle = GetCellStyle(workbook, 
     657                 cellStyle??new CellStyleModel { BorderStyleT=false,BorderStyleR=false,ColorIndex=32767});
     658             titleRow2.Cells[titleRow2.LastCellNum - 1].CellStyle = GetCellStyle(workbook, 
     659                 cellStyle??new CellStyleModel { BorderStyleT=false,BorderStyleL=false,ColorIndex=32767});
     660             titleRow1.HeightInPoints = 40;
     661             titleRow2.HeightInPoints = 20;
     662             #endregion
     663 
     664             #region 处理数据行,首行除外
     665             int rowIndex = 3;
     666             foreach (DataRow row in sourceTable.Rows)
     667             {
     668                 IRow dataRow = sheet.CreateRow(rowIndex);
     669                 foreach (DataColumn column in sourceTable.Columns)
     670                 {
     671                     ICell dataCell = dataRow.CreateCell(column.Ordinal);
     672                     dataCell.SetCellValue((row[column] ?? "").ToString());
     673                     dataCell.CellStyle = dataCellStyle;
     674                 }
     675                 rowIndex++;
     676             }
     677             //设置列宽
     678             for (int k = 0; k < sourceTable.Columns.Count; k++)
     679             {
     680                 sheet.SetColumnWidth(k, (sourceTable.Columns[k].Caption.Length < 20 ? 20 : sourceTable.Columns[k].Caption.Length) * 256);
     681             }
     682             #endregion
     683             #region 保存
     684             using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
     685             {
     686                 workbook.Write(fs);
     687             }
     688             sheet = null;
     689             headerRow = null;
     690             workbook = null;
     691             #endregion
     692             return filePath;
     693         }
     694         /// <summary>
     695         /// List导出Excel
     696         /// </summary>
     697         /// <typeparam name="T">List元素类型</typeparam>
     698         /// <param name="data">List数据源</param>
     699         /// <param name="headerNameList">首行数据映射源</param>
     700         /// <param name="sheetName">工作表名称</param>
     701         /// <param name="filePath">导出的文件地址</param>
     702         /// <param name="title">首行标题</param>
     703         /// <param name="childTitle">子标题</param>
     704         /// <param name="dateTime">子标题时间</param>
     705         /// <returns></returns>
     706         public static string ExportToExcel<T>(List<T> data, IList<KeyValuePair<string, string>> headerNameList, string sheetName = "sheet1", string filePath = null, string title = "", string childTitle = "", string dateTime = "") where T : class
     707         {
     708             if (data.Count <= 0) throw new ArgumentException("List数据源不存在有效的数据");
     709             if (string.IsNullOrEmpty(filePath))
     710             {
     711                 filePath = GetSaveFilePath();
     712             }
     713             if (string.IsNullOrEmpty(filePath)) throw new ArgumentNullException("excel文件路径为空字符串或null");
     714             bool isCompatible = IsCompatible(filePath);
     715             IWorkbook workbook = CreateWorkbook(isCompatible);
     716             //表头行样式
     717             ICellStyle headerCellStyle = GetCellStyle(workbook, colorIndex: 22);
     718             //数据行样式
     719             ICellStyle dataCellStyle = GetCellStyle(workbook, horizontalAlignment: NPOI.SS.UserModel.HorizontalAlignment.Left, colorIndex: 42);
     720             ISheet sheet = workbook.CreateSheet(sheetName);
     721             IRow titleRow1 = sheet.CreateRow(0);
     722             IRow titleRow2 = sheet.CreateRow(1);
     723             IRow headerRow = sheet.CreateRow(2);
     724 
     725             #region 处理首行
     726             for (int i = 0; i < headerNameList.Count; i++)
     727             {
     728                 ICell cell = headerRow.CreateCell(i);
     729                 ICell titleCell1 = titleRow1.CreateCell(i);
     730                 ICell titleCell2 = titleRow2.CreateCell(i);
     731                 cell.SetCellValue(headerNameList[i].Value);
     732                 cell.CellStyle = headerCellStyle;
     733             }
     734             //标题行样式
     735             int cellMaxIndex = titleRow1.LastCellNum - 1;
     736             SetCellRangeAddress(sheet, 0, 0, 0, cellMaxIndex);
     737             SetCellRangeAddress(sheet, 1, 1, 0, (int)Math.Floor(cellMaxIndex / 2.0));
     738             SetCellRangeAddress(sheet, 1, 1, (int)Math.Floor(cellMaxIndex / 2.0) + 1, cellMaxIndex);
     739             //Console.WriteLine("合并后列数是{0}",titleRow1.PhysicalNumberOfCells);
     740             titleRow1.Cells[0].SetCellValue(string.IsNullOrEmpty(title) ? sheetName : title);
     741             titleRow2.Cells[0].SetCellValue(childTitle);
     742             titleRow2.Cells[(int)Math.Floor(cellMaxIndex / 2.0) + 1].SetCellValue(string.IsNullOrEmpty(dateTime) ? DateTime.Now.ToString("yyyy-MM-dd") : dateTime);
     743             titleRow1.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, borderStyleB: false, colorIndex: 32767, isSetFont: true));
     744 
     745             //titleRow2.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, borderStyleT: false, colorIndex: 32767));
     746             titleRow2.Cells[0].CellStyle = GetCellStyle(workbook, borderStyleT: false, borderStyleR: false, colorIndex: 32767);
     747             titleRow2.Cells[titleRow2.LastCellNum - 1].CellStyle = GetCellStyle(workbook, borderStyleT: false, borderStyleL: false, colorIndex: 32767);
     748             titleRow1.HeightInPoints = 40;
     749             titleRow2.HeightInPoints = 20;
     750             #endregion
     751             #region 处理数据行
     752             Type t = typeof(T);
     753             int rowIndex = 3;
     754             foreach (T item in data)
     755             {
     756                 IRow dataRow = sheet.CreateRow(rowIndex);
     757                 for (int j = 0; j < headerNameList.Count; j++)
     758                 {
     759                     object pValue = t.GetProperty(headerNameList[j].Key).GetValue(item, null);
     760                     ICell dataCell = dataRow.CreateCell(j);
     761                     dataCell.SetCellValue((pValue ?? "").ToString());
     762                     dataCell.CellStyle = dataCellStyle;
     763                 }
     764                 rowIndex++;
     765             }
     766             //设置列宽
     767             for (int k = 0; k < headerRow.Cells.Count; k++)
     768             {
     769                 sheet.SetColumnWidth(k, (headerRow.Cells[k].StringCellValue.Length < 20 ? 20 : headerRow.Cells[k].StringCellValue.Length) * 256);
     770             }
     771             #endregion
     772             FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
     773             workbook.Write(fs);
     774             fs.Dispose();
     775             sheet = null;
     776             headerRow = null;
     777             workbook = null;
     778             return filePath;
     779         }
     780         /// <summary>
     781         /// List导出Excel
     782         /// </summary>
     783         /// <typeparam name="T">List元素类型</typeparam>
     784         /// <param name="data">List数据源</param>
     785         /// <param name="headerNameList">首行数据映射源</param>
     786         /// <param name="sheetName">工作表名称</param>
     787         /// <param name="filePath">导出的文件地址</param>
     788         /// <param name="title">首行标题</param>
     789         /// <param name="childTitle">子标题</param>
     790         /// <param name="dateTime">子标题时间</param>
     791         /// <param name="cellStyle">样式类</param>
     792         /// <returns></returns>
     793         public static string ExportToExcel<T>(List<T> data, IList<KeyValuePair<string, string>> headerNameList, CellStyleModel cellStyle, string sheetName = "sheet1", string filePath = null, string title = "", string childTitle = "", string dateTime = "") where T : class
     794         {
     795             if (data.Count <= 0) throw new ArgumentException("List数据源不存在有效的数据");
     796             if (string.IsNullOrEmpty(filePath))
     797             {
     798                 filePath = GetSaveFilePath();
     799             }
     800             if (string.IsNullOrEmpty(filePath)) throw new ArgumentNullException("excel文件路径为空字符串或null");
     801             bool isCompatible = IsCompatible(filePath);
     802             IWorkbook workbook = CreateWorkbook(isCompatible);
     803             //表头行样式
     804             ICellStyle headerCellStyle = GetCellStyle(workbook, cellStyle??new CellStyleModel { ColorIndex=22});
     805             //数据行样式
     806             ICellStyle dataCellStyle = GetCellStyle(workbook, 
     807                 cellStyle??new CellStyleModel { HorizontalAlignment= NPOI.SS.UserModel.HorizontalAlignment.Left,ColorIndex=42});
     808             ISheet sheet = workbook.CreateSheet(sheetName);
     809             IRow titleRow1 = sheet.CreateRow(0);
     810             IRow titleRow2 = sheet.CreateRow(1);
     811             IRow headerRow = sheet.CreateRow(2);
     812 
     813             #region 处理首行
     814             for (int i = 0; i < headerNameList.Count; i++)
     815             {
     816                 ICell cell = headerRow.CreateCell(i);
     817                 ICell titleCell1 = titleRow1.CreateCell(i);
     818                 ICell titleCell2 = titleRow2.CreateCell(i);
     819                 cell.SetCellValue(headerNameList[i].Value);
     820                 cell.CellStyle = headerCellStyle;
     821             }
     822             //标题行样式
     823             int cellMaxIndex = titleRow1.LastCellNum - 1;
     824             SetCellRangeAddress(sheet, 0, 0, 0, cellMaxIndex);
     825             SetCellRangeAddress(sheet, 1, 1, 0, (int)Math.Floor(cellMaxIndex / 2.0));
     826             SetCellRangeAddress(sheet, 1, 1, (int)Math.Floor(cellMaxIndex / 2.0) + 1, cellMaxIndex);
     827             //Console.WriteLine("合并后列数是{0}",titleRow1.PhysicalNumberOfCells);
     828             titleRow1.Cells[0].SetCellValue(string.IsNullOrEmpty(title) ? sheetName : title);
     829             titleRow2.Cells[0].SetCellValue(childTitle);
     830             titleRow2.Cells[(int)Math.Floor(cellMaxIndex / 2.0) + 1].SetCellValue(string.IsNullOrEmpty(dateTime) ? DateTime.Now.ToString("yyyy-MM-dd") : dateTime);
     831             titleRow1.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, 
     832                 cellStyle??new CellStyleModel { BorderStyleB=false,ColorIndex=32767,IsSetFont=true}));
     833             //titleRow2.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, borderStyleT: false, colorIndex: 32767));
     834             titleRow2.Cells[0].CellStyle = GetCellStyle(workbook, 
     835                 cellStyle??new CellStyleModel { BorderStyleT=false,BorderStyleR=false,ColorIndex=32767});
     836             titleRow2.Cells[titleRow2.LastCellNum - 1].CellStyle = GetCellStyle(workbook, 
     837                 cellStyle??new CellStyleModel { BorderStyleT=false,BorderStyleL=false,ColorIndex=32767});
     838             titleRow1.HeightInPoints = 40;
     839             titleRow2.HeightInPoints = 20;
     840             #endregion
     841             #region 处理数据行
     842             Type t = typeof(T);
     843             int rowIndex = 3;
     844             foreach (T item in data)
     845             {
     846                 IRow dataRow = sheet.CreateRow(rowIndex);
     847                 for (int j = 0; j < headerNameList.Count; j++)
     848                 {
     849                     object pValue = t.GetProperty(headerNameList[j].Key).GetValue(item, null);
     850                     ICell dataCell = dataRow.CreateCell(j);
     851                     dataCell.SetCellValue((pValue ?? "").ToString());
     852                     dataCell.CellStyle = dataCellStyle;
     853                 }
     854                 rowIndex++;
     855             }
     856             //设置列宽
     857             for (int k = 0; k < headerRow.Cells.Count; k++)
     858             {
     859                 sheet.SetColumnWidth(k, (headerRow.Cells[k].StringCellValue.Length < 20 ? 20 : headerRow.Cells[k].StringCellValue.Length) * 256);
     860             }
     861             #endregion
     862             FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
     863             workbook.Write(fs);
     864             fs.Dispose();
     865             sheet = null;
     866             headerRow = null;
     867             workbook = null;
     868             return filePath;
     869         }
     870         /// <summary>
     871         /// DataGridView导出Excel
     872         /// </summary>
     873         /// <param name="grid">DataGridView数据源</param>
     874         /// <param name="sheetName">工作表名称</param>
     875         /// <param name="filePath">文件路径</param>
     876         /// <param name="title">首行标题</param>
     877         /// <param name="childTitle">子标题</param>
     878         /// <param name="dateTime">子标题时间</param>
     879         /// <returns></returns>
     880         public static string ExportToExcel(DataGridView grid, string sheetName = "sheet1", string filePath = null, string title = "", string childTitle = "", string dateTime = "")
     881         {
     882             if (grid.Rows.Count <= 0) throw new ArgumentException("DataGridView数据源不存在游侠的数据!");
     883             if (string.IsNullOrEmpty(filePath))
     884             {
     885                 filePath = GetSaveFilePath();
     886             }
     887             if (string.IsNullOrEmpty(filePath)) throw new ArgumentNullException("excel文件路径为空字符串或null!");
     888             bool isCompatible = IsCompatible(filePath);
     889             IWorkbook workbook = CreateWorkbook(isCompatible);
     890             //表头行样式
     891             ICellStyle headerCellStyle = GetCellStyle(workbook, colorIndex: 22);
     892             //数据行样式
     893             ICellStyle dataCellStyle = GetCellStyle(workbook, horizontalAlignment: NPOI.SS.UserModel.HorizontalAlignment.Left, colorIndex: 42);
     894             ISheet sheet = workbook.CreateSheet(sheetName);
     895             IRow titleRow1 = sheet.CreateRow(0);
     896             IRow titleRow2 = sheet.CreateRow(1);
     897             IRow headerRow = sheet.CreateRow(2);
     898 
     899             for (int i = 0; i < grid.Columns.Count; i++)
     900             {
     901                 ICell cell = headerRow.CreateCell(i);
     902                 ICell titleCell1 = titleRow1.CreateCell(i);
     903                 ICell titleCell2 = titleRow2.CreateCell(i);
     904                 cell.SetCellValue(grid.Columns[i].HeaderText);
     905                 cell.CellStyle = headerCellStyle;
     906             }
     907             //标题行样式
     908             int cellMaxIndex = titleRow1.LastCellNum - 1;
     909             SetCellRangeAddress(sheet, 0, 0, 0, titleRow1.LastCellNum - 1);
     910             SetCellRangeAddress(sheet, 1, 1, 0, (int)Math.Floor(cellMaxIndex / 2.0));
     911             SetCellRangeAddress(sheet, 1, 1, (int)Math.Floor(cellMaxIndex / 2.0) + 1, cellMaxIndex);
     912             titleRow1.Cells[0].SetCellValue(string.IsNullOrEmpty(title) ? sheetName : title);
     913             titleRow2.Cells[0].SetCellValue(childTitle);
     914             titleRow2.Cells[(int)Math.Floor(cellMaxIndex / 2.0) + 1].SetCellValue(string.IsNullOrEmpty(dateTime) ? DateTime.Now.ToString("yyyy-MM-dd") : dateTime);
     915             titleRow1.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, borderStyleB: false, colorIndex: 32767, isSetFont: true));
     916 
     917             //titleRow2.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, borderStyleT: false, colorIndex: 32767));
     918             titleRow2.Cells[0].CellStyle = GetCellStyle(workbook, borderStyleT: false, borderStyleR: false, colorIndex: 32767);
     919             titleRow2.Cells[titleRow2.LastCellNum - 1].CellStyle = GetCellStyle(workbook, borderStyleT: false, borderStyleL: false, colorIndex: 32767);
     920             titleRow1.HeightInPoints = 40;
     921             titleRow2.HeightInPoints = 20;
     922 
     923             int rowIndex = 3;
     924             foreach (DataGridViewRow row in grid.Rows)
     925             {
     926                 IRow dataRow = sheet.CreateRow(rowIndex);
     927                 for (int j = 0; j < grid.Columns.Count; j++)
     928                 {
     929                     ICell dataCell = dataRow.CreateCell(j);
     930                     dataCell.SetCellValue((row.Cells[j].Value ?? "").ToString());
     931                     dataCell.CellStyle = dataCellStyle;
     932                 }
     933                 rowIndex++;
     934             }
     935 
     936             //设置列宽
     937             for (int k = 0; k < grid.Columns.Count; k++)
     938             {
     939                 sheet.SetColumnWidth(k, (grid.Columns[k].HeaderText.Length < 20 ? 20 : grid.Columns[k].HeaderText.Length) * 256);
     940             }
     941             FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
     942             workbook.Write(fs);
     943             fs.Dispose();
     944             sheet = null;
     945             headerRow = null;
     946             workbook = null;
     947             return filePath;
     948         }
     949         /// <summary>
     950         /// DataGridView导出Excel
     951         /// </summary>
     952         /// <param name="grid">DataGridView数据源</param>
     953         /// <param name="sheetName">工作表名称</param>
     954         /// <param name="filePath">文件路径</param>
     955         /// <param name="title">首行标题</param>
     956         /// <param name="childTitle">子标题</param>
     957         /// <param name="dateTime">子标题时间</param>
     958         /// <param name="cellStyle">样式类</param>
     959         /// <returns></returns>
     960         public static string ExportToExcel(DataGridView grid, CellStyleModel cellStyle, string sheetName = "sheet1", string filePath = null, string title = "", string childTitle = "", string dateTime = "")
     961         {
     962             if (grid.Rows.Count <= 0) throw new ArgumentException("DataGridView数据源不存在游侠的数据!");
     963             if (string.IsNullOrEmpty(filePath))
     964             {
     965                 filePath = GetSaveFilePath();
     966             }
     967             if (string.IsNullOrEmpty(filePath)) throw new ArgumentNullException("excel文件路径为空字符串或null!");
     968             bool isCompatible = IsCompatible(filePath);
     969             IWorkbook workbook = CreateWorkbook(isCompatible);
     970             //表头行样式
     971             ICellStyle headerCellStyle = GetCellStyle(workbook, cellStyle??new CellStyleModel { ColorIndex=22});
     972             //数据行样式
     973             ICellStyle dataCellStyle = GetCellStyle(workbook,cellStyle??new CellStyleModel { HorizontalAlignment=NPOI.SS.UserModel.HorizontalAlignment.Left,ColorIndex=42});
     974             ISheet sheet = workbook.CreateSheet(sheetName);
     975             IRow titleRow1 = sheet.CreateRow(0);
     976             IRow titleRow2 = sheet.CreateRow(1);
     977             IRow headerRow = sheet.CreateRow(2);
     978 
     979             for (int i = 0; i < grid.Columns.Count; i++)
     980             {
     981                 ICell cell = headerRow.CreateCell(i);
     982                 ICell titleCell1 = titleRow1.CreateCell(i);
     983                 ICell titleCell2 = titleRow2.CreateCell(i);
     984                 cell.SetCellValue(grid.Columns[i].HeaderText);
     985                 cell.CellStyle = headerCellStyle;
     986             }
     987             //标题行样式
     988             int cellMaxIndex = titleRow1.LastCellNum - 1;
     989             SetCellRangeAddress(sheet, 0, 0, 0, titleRow1.LastCellNum - 1);
     990             SetCellRangeAddress(sheet, 1, 1, 0, (int)Math.Floor(cellMaxIndex / 2.0));
     991             SetCellRangeAddress(sheet, 1, 1, (int)Math.Floor(cellMaxIndex / 2.0) + 1, cellMaxIndex);
     992             titleRow1.Cells[0].SetCellValue(string.IsNullOrEmpty(title) ? sheetName : title);
     993             titleRow2.Cells[0].SetCellValue(childTitle);
     994             titleRow2.Cells[(int)Math.Floor(cellMaxIndex / 2.0) + 1].SetCellValue(string.IsNullOrEmpty(dateTime) ? DateTime.Now.ToString("yyyy-MM-dd") : dateTime);
     995             titleRow1.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, 
     996                 cellStyle??new CellStyleModel { BorderStyleB=false,ColorIndex=32767,IsSetFont=true}));
     997             //titleRow2.Cells.ForEach(c => c.CellStyle = GetCellStyle(workbook, borderStyleT: false, colorIndex: 32767));
     998             titleRow2.Cells[0].CellStyle = GetCellStyle(workbook,
     999                 cellStyle??new CellStyleModel { BorderStyleT=false,BorderStyleR=false,ColorIndex=32767});
    1000             titleRow2.Cells[titleRow2.LastCellNum - 1].CellStyle = GetCellStyle(workbook, 
    1001                 cellStyle??new CellStyleModel { BorderStyleT=false,BorderStyleL=false,ColorIndex=32767});
    1002             titleRow1.HeightInPoints = 40;
    1003             titleRow2.HeightInPoints = 20;
    1004             int rowIndex = 3;
    1005             foreach (DataGridViewRow row in grid.Rows)
    1006             {
    1007                 IRow dataRow = sheet.CreateRow(rowIndex);
    1008                 for (int j = 0; j < grid.Columns.Count; j++)
    1009                 {
    1010                     ICell dataCell = dataRow.CreateCell(j);
    1011                     dataCell.SetCellValue((row.Cells[j].Value ?? "").ToString());
    1012                     dataCell.CellStyle = dataCellStyle;
    1013                 }
    1014                 rowIndex++;
    1015             }
    1016 
    1017             //设置列宽
    1018             for (int k = 0; k < grid.Columns.Count; k++)
    1019             {
    1020                 sheet.SetColumnWidth(k, (grid.Columns[k].HeaderText.Length < 20 ? 20 : grid.Columns[k].HeaderText.Length) * 256);
    1021             }
    1022             FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
    1023             workbook.Write(fs);
    1024             fs.Dispose();
    1025             sheet = null;
    1026             headerRow = null;
    1027             workbook = null;
    1028             return filePath;
    1029         }
    1030         #endregion
    1031         #region 公共导入方法
    1032         /// <summary>
    1033         /// 由Excel导入DataTable
    1034         /// </summary>
    1035         /// <param name="excelFileStream">Excel文件流</param>
    1036         /// <param name="sheetName">工作表名称</param>
    1037         /// <param name="headerRowIndex">表头行索引</param>
    1038         /// <param name="isCompatible">是否兼容模式</param>
    1039         /// <returns>返回DataTable</returns>
    1040         public static DataTable ImportFromExcel(Stream excelFileStream, string sheetName, int headerRowIndex, bool isCompatible)
    1041         {
    1042             IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream);
    1043             ISheet sheet = null;
    1044             int sheetIndex = -1;
    1045             if (int.TryParse(sheetName, out sheetIndex))
    1046             {
    1047                 sheet = workbook.GetSheetAt(sheetIndex);
    1048             }
    1049             else
    1050             {
    1051                 sheet = workbook.GetSheet(sheetName);
    1052             }
    1053             DataTable table = GetDataTableFromSheet(sheet, headerRowIndex);
    1054             excelFileStream.Close();
    1055             workbook = null;
    1056             sheet = null;
    1057             return table;
    1058         }
    1059         /// <summary>
    1060         /// 由Excel导入DataTable
    1061         /// </summary>
    1062         /// <param name="excelFilePath">Excel文件路径</param>
    1063         /// <param name="sheetName">工作表名称</param>
    1064         /// <param name="headerRowIndex">表头行索引</param>
    1065         /// <returns></returns>
    1066         public static DataTable ImportFromExcel(string excelFilePath, string sheetName, int headerRowIndex)
    1067         {
    1068             if (string.IsNullOrEmpty(excelFilePath))
    1069             {
    1070                 excelFilePath = GetOpenFilePath();
    1071             }
    1072             if (string.IsNullOrEmpty(excelFilePath)) throw new ArgumentNullException("excel文件路径为空字符串或null");
    1073             using (FileStream fs = File.OpenRead(excelFilePath))
    1074             {
    1075                 bool isCompatible = IsCompatible(excelFilePath);
    1076                 return ImportFromExcel(fs, sheetName, headerRowIndex, isCompatible);
    1077             }
    1078         }
    1079         /// <summary>
    1080         /// Excel导入DataSet,如果有多个工作表,则导入多个DataTable
    1081         /// </summary>
    1082         /// <param name="excelFileStream">Excel文件流</param>
    1083         /// <param name="headRowIndex">表头行索引</param>
    1084         /// <param name="isCompatible">是否兼容模式</param>
    1085         /// <returns>返回dataSet</returns>
    1086         public static DataSet ImportFromExcel(Stream excelFileStream, int headerRowIndex, bool isCompatible)
    1087         {
    1088             DataSet ds = new DataSet();
    1089             IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream);
    1090             for (int i = 0; i < workbook.NumberOfSheets; i++)
    1091             {
    1092                 ISheet sheet = workbook.GetSheetAt(i);
    1093                 DataTable table = GetDataTableFromSheet(sheet, headerRowIndex);
    1094                 ds.Tables.Add(table);
    1095             }
    1096             excelFileStream.Close();
    1097             workbook = null;
    1098             return ds;
    1099         }
    1100         /// <summary>
    1101         /// Excel导入DataSet,如果有多个工作表,则导入多个DataTable
    1102         /// </summary>
    1103         /// <param name="excelFilePath">Excel文件路径</param>
    1104         /// <param name="headerRowIndex">表头行索引</param>
    1105         /// <returns>返回dataSet</returns>
    1106         public static DataSet ImportFromExcel(string excelFilePath, int headerRowIndex)
    1107         {
    1108             if (string.IsNullOrEmpty(excelFilePath))
    1109             {
    1110                 excelFilePath = GetOpenFilePath();
    1111             }
    1112             if (string.IsNullOrEmpty(excelFilePath)) throw new ArgumentNullException("excel文件路径为空字符串或null");
    1113             using (FileStream fs = File.OpenRead(excelFilePath))
    1114             {
    1115                 bool isCompatible = IsCompatible(excelFilePath);
    1116                 return ImportFromExcel(fs, headerRowIndex, isCompatible);
    1117             }
    1118         }
    1119         /// <summary>
    1120         /// Excel导入List
    1121         /// </summary>
    1122         /// <typeparam name="T">实体类</typeparam>
    1123         /// <param name="excelFilePath">Excel文件全路径</param>
    1124         /// <param name="headerRowIndex">行索引</param>
    1125         /// <returns></returns>
    1126         public static IList<T> ImportFromExcel<T>(string excelFilePath, int headerRowIndex = 0) where T : class, new()
    1127         {
    1128             IList<T> list = new List<T>();
    1129             if (string.IsNullOrEmpty(excelFilePath))
    1130             {
    1131                 excelFilePath = GetOpenFilePath();
    1132             }
    1133             if (string.IsNullOrEmpty(excelFilePath)) throw new ArgumentNullException("excel文件路径为空字符串或null");
    1134             try
    1135             {
    1136                 using (FileStream fs = File.OpenRead(excelFilePath))
    1137                 {
    1138                     bool isComPatible = IsCompatible(excelFilePath);
    1139                     IWorkbook workbook = CreateWorkbook(isComPatible, fs);
    1140                     ISheet sheet = workbook.GetSheetAt(0);
    1141                     IRow headerRow = sheet.GetRow(0);
    1142                     int headerCellNum = headerRow.LastCellNum;
    1143                     for (int i = headerRow.FirstCellNum; i < headerCellNum; i++)
    1144                     {
    1145                         if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "")
    1146                         {
    1147                             //如果标题行遇到空列,则不再向后继续读取
    1148                             headerCellNum = i + 1;//返回真实列数
    1149                             break;
    1150                         }
    1151                     }
    1152                     //T t = default(T);
    1153                     T t = new T();
    1154                     PropertyInfo[] properties = typeof(T).GetProperties();
    1155                     if (properties.Count() < headerCellNum)
    1156                     {
    1157                         throw new Exception("对象属性与工作表字段数量不符!");
    1158                     }
    1159                     for (int i = headerRowIndex + 1; i < sheet.LastRowNum + 1; i++)
    1160                     {
    1161                         IRow row = sheet.GetRow(i);
    1162                         if (row != null && !string.IsNullOrEmpty(row.Cells[0].StringCellValue))
    1163                         {
    1164                             t = Activator.CreateInstance<T>();
    1165                             for (int j = row.FirstCellNum; j < headerCellNum; j++)
    1166                             {
    1167                                 //如果碰到空cell,那么创建cell后赋空字符串
    1168                                 var value = ValueType(properties[j].PropertyType, row.GetCellEx(j).ToString());
    1169                                 properties[j].SetValue(t, value, null);
    1170                             }
    1171                             list.Add(t);
    1172 
    1173                         }
    1174                     }
    1175                 }
    1176             }
    1177             catch (Exception ex)
    1178             {
    1179                 list = null;
    1180                 throw new Exception(ex.Message);
    1181             }
    1182             return list;
    1183         }
    1184         /// <summary>
    1185         /// Excel导入List
    1186         /// </summary>
    1187         /// <typeparam name="T">实体类型</typeparam>
    1188         /// <param name="excelFilePath">excel文件路径</param>
    1189         /// <param name="fields">实体属性的字符串表示形式的数组,顺序与excel字段保持一致</param>
    1190         /// <param name="headerRowIndex">头部索引行</param>
    1191         /// <returns></returns>
    1192         public static IList<T> ImportFromExcel<T>(ISheet sheet, string[] fields, int headerRowIndex = 0) where T : class, new()
    1193         {
    1194             if (fields == null) throw new ArgumentNullException("fields", "参数不能为null!");
    1195             IList<T> list = new List<T>();
    1196             try
    1197             {
    1198                 IRow headerRow = sheet.GetRow(0);
    1199                 int headerCellNum = headerRow.LastCellNum;
    1200                 for (int i = headerRow.FirstCellNum; i < headerCellNum; i++)
    1201                 {
    1202                     if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "")
    1203                     {
    1204                         //如果标题行遇到空列,则不再向后继续读取
    1205                         headerCellNum = i + 1;//返回真实列数
    1206                         break;
    1207                     }
    1208                 }
    1209                 if (fields.Length != headerCellNum)
    1210                 {
    1211                     throw new Exception("指定的对象属性数量超过工作表字段数量!");
    1212                 }
    1213                 //T t = default(T);
    1214                 T t = new T();
    1215                 for (int i = headerRowIndex + 1; i < sheet.LastRowNum + 1; i++)
    1216                 {
    1217                     IRow row = sheet.GetRow(i);
    1218                     if (row != null && !string.IsNullOrEmpty(row.Cells[0].StringCellValue))
    1219                     {
    1220                         t = Activator.CreateInstance<T>();
    1221                         for (int j = 0; j < fields.Length; j++)
    1222                         {
    1223                             var property = typeof(T).GetProperty(fields[j]);
    1224                             //如果碰到空cell,那么创建cell后赋空字符串
    1225                             var value = ValueType(property.PropertyType, row.GetCellEx(j).ToString());
    1226                             property.SetValue(t, value, null);
    1227                         }
    1228                         list.Add(t);
    1229                     }
    1230                 }
    1231             }
    1232             catch (Exception ex)
    1233             {
    1234                 list = null;
    1235                 throw new Exception(ex.Message);
    1236             }
    1237             return list;
    1238         }
    1239         /// <summary>
    1240         /// Excel导入List
    1241         /// </summary>
    1242         /// <typeparam name="T">实体类型</typeparam>
    1243         /// <param name="excelFilePath">excel文件全路径</param>
    1244         /// <param name="fields">实体属性的字符串表示形式的数组,顺序与excel字段保持一致</param>
    1245         /// <param name="sheetName">工作表名</param>
    1246         /// <param name="headerRowIndex">首行索引,默认0</param>
    1247         /// <returns></returns>
    1248         public static IList<T> ImportFromExcel<T>(string excelFilePath, string[] fields, string sheetName, int headerRowIndex = 0) where T : class, new()
    1249         {
    1250             if (string.IsNullOrEmpty(excelFilePath))
    1251             {
    1252                 excelFilePath = GetOpenFilePath();
    1253             }
    1254             if (string.IsNullOrEmpty(excelFilePath)) throw new ArgumentNullException("excel文件路径为空字符串或null");
    1255             FileStream fs = null;
    1256             IWorkbook workbook = null;
    1257             IList<T> list = null;
    1258             try
    1259             {
    1260                 using (fs = File.OpenRead(excelFilePath))
    1261                 {
    1262                     bool isComPatible = IsCompatible(excelFilePath);
    1263                     workbook = CreateWorkbook(isComPatible, fs);
    1264                     list = ImportFromExcel<T>(workbook.GetSheet(sheetName), fields, headerRowIndex);
    1265                 }
    1266             }
    1267             catch (Exception ex)
    1268             {
    1269                 workbook = null;
    1270                 if (fs != null) fs.Dispose();
    1271                 list = null;
    1272                 throw new Exception(ex.Message);
    1273             }
    1274             return list;
    1275         }
    1276         /// <summary>
    1277         /// Excel导入List
    1278         /// </summary>
    1279         /// <typeparam name="T">实体类型</typeparam>
    1280         /// <param name="excelFilePath">excel文件全路径</param>
    1281         /// <param name="fields">实体属性的字符串表示形式的数组,顺序与excel字段保持一致</param>
    1282         /// <param name="sheetIndex">第几个工作表,默认值为1</param>
    1283         /// <param name="headerRowIndex">首行索引,默认0</param>
    1284         /// <returns></returns>
    1285         public static IList<T> ImportFromExcel<T>(string excelFilePath, string[] fields, int sheetIndex = 1, int headerRowIndex = 0) where T : class, new()
    1286         {
    1287             if (string.IsNullOrEmpty(excelFilePath))
    1288             {
    1289                 excelFilePath = GetOpenFilePath();
    1290             }
    1291             if (string.IsNullOrEmpty(excelFilePath)) throw new ArgumentNullException("excel文件路径为空字符串或null");
    1292             FileStream fs = null;
    1293             IWorkbook workbook = null;
    1294             IList<T> list = null;
    1295             try
    1296             {
    1297                 using (fs = File.OpenRead(excelFilePath))
    1298                 {
    1299                     bool isComPatible = IsCompatible(excelFilePath);
    1300                     workbook = CreateWorkbook(isComPatible, fs);
    1301                     list = ImportFromExcel<T>(workbook.GetSheetAt(sheetIndex - 1), fields, headerRowIndex);
    1302                 }
    1303             }
    1304             catch (Exception ex)
    1305             {
    1306                 workbook = null;
    1307                 if (fs != null) fs.Dispose();
    1308                 list = null;
    1309                 throw new Exception(ex.Message);
    1310             }
    1311             return list;
    1312         }
    1313         #endregion
    1314         #region 公共转换方法
    1315         /// <summary>
    1316         /// 将Excel的列索引转换为列名,列索引从0开始,列名从A开始。如第0列为A,第1列为B...
    1317         /// </summary>
    1318         /// <param name="index">列索引</param>
    1319         /// <returns>列名,如第0列为A,第1列为B...</returns>
    1320         public static string ConvertColumnIndexToColumnName(int index)
    1321         {
    1322             index++;
    1323             int letterCount = 26;
    1324             char[] array = new char[100];
    1325             int i = 0;
    1326             while (index > 0)
    1327             {
    1328                 int mod = index % letterCount;
    1329                 if (mod == 0) mod = letterCount;
    1330                 array[i++] = (char)(mod - 1 + 'A');
    1331                 index = (index - 1) / 26;
    1332             }
    1333             StringBuilder sb = new StringBuilder(i);
    1334             for (int j = i - 1; j >= 0; j--)
    1335             {
    1336                 sb.Append(array[j]);
    1337             }
    1338             return sb.ToString();
    1339         }
    1340         /// <summary>
    1341         /// 转化日期
    1342         /// </summary>
    1343         /// <param name="date">日期</param>
    1344         /// <returns></returns>
    1345         public static DateTime ConvertDate(object date)
    1346         {
    1347             string dateString = (date ?? "").ToString();
    1348             DateTime dt = new DateTime();
    1349             if (DateTime.TryParse(dateString, out dt))
    1350             {
    1351                 return dt;
    1352             }
    1353             try
    1354             {
    1355                 string spString = "";
    1356                 if (dateString.Contains("-"))
    1357                 {
    1358                     spString = "-";
    1359                 }
    1360                 else if (dateString.Contains("/"))
    1361                 {
    1362                     spString = "/";
    1363                 }
    1364                 string[] time = dateString.Split(spString.ToCharArray());
    1365                 int year = Convert.ToInt32(time[2]);
    1366                 int month = Convert.ToInt32(time[0]);
    1367                 int day = Convert.ToInt32(time[1]);
    1368                 string years = Convert.ToString(year);
    1369                 string months = Convert.ToString(month);
    1370                 string days = Convert.ToString(day);
    1371                 if (months.Length == 4)
    1372                 {
    1373                     dt = Convert.ToDateTime(date);
    1374                 }
    1375                 else
    1376                 {
    1377                     string rq = "";
    1378                     if (years.Length == 1)
    1379                     {
    1380                         years = "0" + years;
    1381                     }
    1382                     if (months.Length == 1)
    1383                     {
    1384                         months = "0" + months;
    1385                     }
    1386                     if (days.Length == 1)
    1387                     {
    1388                         days = "0" + days;
    1389                     }
    1390                     rq = "20" + years + "-" + months + "-" + days;
    1391                     dt = Convert.ToDateTime(rq);
    1392                 }
    1393             }
    1394             catch
    1395             {
    1396                 throw new Exception("日期格式不正确,转换日期失败!");
    1397             }
    1398             return dt;
    1399         }
    1400         /// <summary>
    1401         /// 转化数字
    1402         /// </summary>
    1403         /// <param name="d">数字字符串</param>
    1404         /// <returns></returns>
    1405         public static decimal ConvertDecimal(object d)
    1406         {
    1407             string dString = (d ?? "").ToString();
    1408             decimal result = 0m;
    1409             if (decimal.TryParse(dString, out result))
    1410             {
    1411                 return result;
    1412             }
    1413             else
    1414             {
    1415                 throw new Exception("数字格式不正确,转换数字失败!");
    1416             }
    1417         }
    1418         /// <summary>
    1419         /// 转换布尔
    1420         /// </summary>
    1421         /// <param name="b">布尔值字符串</param>
    1422         /// <returns></returns>
    1423         public static bool ConvertBoolean(object b)
    1424         {
    1425             string bString = (b ?? "").ToString();
    1426             bool result = false;
    1427             if (bool.TryParse(bString, out result))
    1428             {
    1429                 return result;
    1430             }
    1431             else if (bString == "0" || bString == "1")
    1432             {
    1433                 return (bString == "0");
    1434             }
    1435             else
    1436             {
    1437                 throw new Exception("布尔格式不正确,转换布尔类型失败!");
    1438             }
    1439         }
    1440         /// <summary>
    1441         /// 实体类属性类型与Excel字段类型的转换
    1442         /// </summary>
    1443         /// <param name="t"></param>
    1444         /// <param name="value"></param>
    1445         /// <returns></returns>
    1446         public static object ValueType(Type t, string value)
    1447         {
    1448             object o = null;
    1449             string strType = t.Name;
    1450             if (strType == "Nullable`1")
    1451             {
    1452                 strType = t.GetGenericArguments()[0].Name;
    1453             }
    1454             switch (strType)
    1455             {
    1456                 case "Decimal":
    1457                     o = decimal.Parse(value);
    1458                     break;
    1459                 case "Int32":
    1460                     o = int.Parse(value);
    1461                     break;
    1462                 case "Float":
    1463                     o = float.Parse(value);
    1464                     break;
    1465                 case "DateTime":
    1466                     o = DateTime.Parse(value);
    1467                     break;
    1468                 case "Char":
    1469                     o = char.Parse(value);
    1470                     break;
    1471                 case "Boolean":
    1472                     if (new string[] { "0","1"}.Contains(value))
    1473                     {
    1474                         o = Convert.ToBoolean(int.Parse(value));
    1475                     }
    1476                     else
    1477                     {
    1478                         o = bool.Parse(value);
    1479                     }                   
    1480                     break;
    1481                 default:
    1482                     o = value;
    1483                     break;
    1484             }
    1485             return o;
    1486         }
    1487         #endregion
    1488 
    1489     }
    1490 }
    扩展IRow的GetCell方法
     1 using NPOI.SS.UserModel;
     2 using System;
     3 using System.Collections.Generic;
     4 using System.Linq;
     5 using System.Text;
     6 
     7 namespace RaysUtil.Office.Excel
     8 {
     9     public static  class NpoiEx
    10     {
    11         /// <summary>
    12         /// 如果当前单元格为空,创建新的字符串类型的单元格
    13         /// </summary>
    14         /// <param name="row"></param>
    15         /// <param name="index"></param>
    16         /// <returns></returns>
    17         public static ICell GetCellEx(this IRow row,int index)
    18         {
    19             return row.FirstOrDefault(n => n.ColumnIndex == index) ?? row.CreateCell(index,CellType.String);
    20         }
    21     }
    22 }
    
    
    
     

    样式类

     1 using NPOI.HSSF.Util;
     2 using NPOI.SS.UserModel;
     3 using System;
     4 using System.Collections.Generic;
     5 using System.Linq;
     6 using System.Text;
     7 
     8 namespace RaysUtil.Office.Excel
     9 {
    10     //==============================================================
    11     //  作者:*
    12     //  时间:2018/1/6 21:06:18
    13     //  文件名:CellStyleModel
    14     //  版本:V1.0.1  
    15     //  说明: 
    16     //  修改者:**
    17     //  修改说明: 分离出样式,单独写一个类
    18     //==============================================================
    19     public  class CellStyleModel
    20     {
    21         /// <summary>
    22         /// 是否存在下边框,默认true
    23         /// </summary>
    24         public bool BorderStyleB { get; set; } = true;
    25         /// <summary>
    26         /// 是否存在左边框,默认true
    27         /// </summary>
    28         public bool BorderStyleL { get; set; } = true;
    29         /// <summary>
    30         /// 是否存在右边框,默认true
    31         /// </summary>
    32         public bool BorderStyleR { get; set; } = true;
    33         /// <summary>
    34         /// 是否存在上边框,默认true
    35         /// </summary>
    36         public bool BorderStyleT { get; set; } = true;
    37         /// <summary>
    38         /// 有边框的样式,默认薄边框
    39         /// </summary>
    40         public BorderStyle BorderStyle { get; set; } = BorderStyle.Thin;
    41         /// <summary>
    42         /// 背景色
    43         /// </summary>
    44         public short ColorIndex { get; set; } = HSSFColor.LightGreen.Index;
    45         /// <summary>
    46         /// 是否横向对齐,默认True
    47         /// </summary>
    48         public bool IsAlignment { get; set; } = true;
    49         /// <summary>
    50         /// 横向对齐,默认横向居中
    51         /// </summary>
    52         public HorizontalAlignment HorizontalAlignment { get; set; } = HorizontalAlignment.Center;
    53         /// <summary>
    54         /// 垂直对齐,默认垂直居中
    55         /// </summary>
    56         public VerticalAlignment VerticalAlignment { get; set; } = VerticalAlignment.Center;
    57         /// <summary>
    58         /// 是否设置字体信息,默认False
    59         /// </summary>
    60         public bool IsSetFont { get; set; } = false;
    61         /// <summary>
    62         /// 字体信息,默认null
    63         /// </summary>
    64         public IFont Font { get; set; } = null;
    65         /// <summary>
    66         /// 字体大小,默认30
    67         /// </summary>
    68         public short FontSize { get; set; } = 30;
    69     }
    70 }
  • 相关阅读:
    C++ 虚基类表指针字节对齐
    C++ 虚函数的内存分配
    虚函数&&虚继承
    内存管理简便复习总结
    stack,heap的区别
    内存泄漏(memory leak)和内存溢出
    php+mysqli预处理技术实现添加、修改及删除多条数据的方法
    JavaScript 常用方法总结
    6个超实用的PHP代码片段
    php 备份数据库代码(生成word,excel,json,xml,sql)
  • 原文地址:https://www.cnblogs.com/oren/p/8308831.html
Copyright © 2011-2022 走看看