• 《学习笔记》基於NOPI開發 ExeclHelper工具類


    基于NPOI开发的Execl工具类,其中可以导入和汇出功能

    注意:向下兼容.NET4.0

    业务场景:在实际开发过程中有些数据是存在Execl中,那么我们就需要开发一个帮助类来解决通过Execl来批量导入数据,导入数据过程中,多个页签代表多张表,最终我们通过DataSet来获取多个数据集

    提醒:在这里极力推荐我这里封装的数据库帮助类OracleHelper或者使用SQLServerHelper中的 AddInBatchesToDataTable 方法进行导入数据,十万笔数据导入耗时毫秒即可完美导入数据

      1 /// <summary>
      2     ///基於NOPI開發 ExeclHelper工具類
      3     ///<para>作者: 会害羞的青蛙</para>
      4     ///<para>時間: 2020-1-3</para>
      5     /// </summary>
      6     public class ExeclHelper
      7     {
      8         /// <summary>
      9         /// 讀取Execl返回DataSet(DataSet中Tables的名稱根據頁簽《sheet》名稱來決定的)
     10         /// <para>例如:D:测试.xls</para>
     11         /// </summary>
     12         /// <param name="filePath">文件路徑</param>
     13         /// <returns>返回DataSet數據集</returns>
     14         public DataSet ImportExcelToDataSet(string filePath)
     15         {
     16             //聲明工作簿workBook對像
     17             IWorkbook wkBook = null;
     18             FileStream fsRead = null;
     19             try
     20             {
     21                 if (!File.Exists(filePath)) throw new Exception("路徑不存在,請檢查路徑是否正確");
     22                 DataSet dataSet = new DataSet();
     23                 //創建一個工作簿workBook對象
     24                 fsRead = new FileStream(filePath, FileMode.Open);
     25                 //判斷Execl版本
     26                 if (filePath.IndexOf(".xlsx") > 0)
     27                 {
     28                     // 如果是2007+的Excel版本
     29                     wkBook = new XSSFWorkbook(fsRead);
     30                 }
     31                 else
     32                 {
     33                     //如果是2003-的Excel版本
     34                     wkBook = new HSSFWorkbook(fsRead);
     35                 }
     36                 //遍歷wkBook中的每個工作表Sheet
     37                 for (int i = 0; i < wkBook.NumberOfSheets; i++)
     38                 {
     39                     //創建DataTable用來存儲當前sheet數據
     40                     DataTable dt = new DataTable();
     41                     //獲取每個工作表對象
     42                     ISheet sheet = wkBook.GetSheetAt(i);
     43                     //獲取當前sheet名稱
     44                     dt.TableName = sheet.SheetName.ToString().Trim().ToUpper();
     45                     //獲取每個工作表的行
     46                     for (int j = 0; j <= sheet.LastRowNum; j++)
     47                     {
     48                         //獲取工作表中的每一行
     49                         IRow currentRow = sheet.GetRow(j);
     50                         //創建DataTable行
     51                         DataRow dataRow = dt.NewRow();
     52                         if (j == 0)
     53                         {
     54                             //遍歷當前行中的每個單元格
     55                             for (int k = 0; k < currentRow.LastCellNum; k++)
     56                             {
     57                                 //獲取每個單元格
     58                                 ICell cell = currentRow.GetCell(k);
     59                                 //設置當前DataTable列明
     60                                 DataColumn column = new DataColumn(cell.StringCellValue);
     61                                 //填充列名
     62                                 dt.Columns.Add(column);
     63                             }
     64                         }
     65                         else
     66                         {
     67                             //遍歷當前行中的每個單元格
     68                             for (int k = 0; k < currentRow.LastCellNum; k++)
     69                             {
     70                                 //獲取每個單元格
     71                                 ICell cell = currentRow.GetCell(k);
     72                                 //如果單元格為空時将添加Null进去
     73                                 if (cell == null)
     74                                 {
     75                                     dataRow[k] = null;
     76                                 }
     77                                 //如果單元格為空字符串時将添加原本的值带进去
     78                                 else if (cell.ToString().Trim() == "")
     79                                 {
     80                                     dataRow[k] = cell.ToString();
     81                                 }
     82                                 else
     83                                 {
     84                                     // 獲取單元格中的類型
     85                                     CellType cellType = cell.CellType;
     86                                     //判斷當前單元格的數據類型
     87                                     switch (cellType)
     88                                     {
     89                                         case CellType.Numeric: //數字
     90                                             short format = cell.CellStyle.DataFormat;
     91                                             //对时间格式(2015.12.5、2015/12/5、2015-12-5等)的处理
     92                                             if (format == 14 || format == 31 || format == 57 || format == 58)
     93                                                 dataRow[k] = cell.DateCellValue.ToString();
     94                                             else
     95                                                 dataRow[k] = cell.NumericCellValue;
     96                                             break;
     97                                         case CellType.String: //字符串
     98                                             dataRow[k] = cell.StringCellValue;
     99                                             break;
    100                                         case CellType.Boolean://布爾值
    101                                             dataRow[k] = cell.BooleanCellValue;
    102                                             break;
    103                                     }
    104                                 }
    105                             }
    106                             //向DataTable填充每一行數據
    107                             dt.Rows.Add(dataRow);
    108                         }
    109                     }
    110                     //向DataSet填充數據
    111                     dataSet.Tables.Add(dt);
    112                 }
    113                 wkBook.Close();//关闭文件流
    114                 return dataSet;
    115             }
    116             catch (Exception ex)
    117             {
    118                 wkBook.Close();//关闭文件流
    119                 throw ex;
    120             }
    121         }
    122         /// <summary>
    123         /// 根據DataSet匯出Execl(DataSet中Tables的名稱決定頁簽《sheet》名稱)
    124         /// <para>使用方法:filePath(文件存儲路徑) : D:/,exportName(Execl文件名稱):test,exportFormat(Execl匯出格式):xlsx或xls</para>
    125         /// <para>文件生成樣式為:D:/測試.xlsx或者D:/測試.xls</para>
    126         /// <para>匯出結果:成功為:OK,匯出成功,失敗為:NO,失敗原因</para>
    127         /// </summary>
    128         /// <param name="dataSet">多表數據集</param>
    129         /// <param name="filePath">匯出路徑</param>
    130         /// <param name="exportName">Execl名稱</param>
    131         /// <param name="exportFormat">Execl後綴</param>
    132         /// <returns>OK,匯出成功;NO,失敗原因</returns>
    133         public string ExportExcelToDataSet(DataSet dataSet, string filePath, string exportName, string exportFormat)
    134         {
    135             //創建工作簿對象
    136             IWorkbook hssfworkbook = null;
    137             FileStream file = null;
    138             if (dataSet.Tables.Count < 1) throw new Exception("多表數據集不能位空");
    139             if (filePath.ToString().Trim() == "" || filePath == null) throw new Exception("匯出路徑異常,請核對路徑是否正確");
    140             if (exportName.ToString().Trim() == "" || exportName == null) throw new Exception("Execl名稱異常,請核對Execl名稱是否正確");
    141             if (exportFormat.ToString().Trim() == "" || exportFormat == null) throw new Exception("Execl後綴異常,請核對Execl後綴是否正確");
    142             try
    143             {
    144                 switch (exportFormat.ToString().Trim().ToLower())
    145                 {
    146                     case "xlsx": //如果是2003-的Excel版本
    147                         hssfworkbook = new XSSFWorkbook();
    148                         break;
    149                     case "xls": //如果是2007+的Excel版本
    150                         hssfworkbook = new HSSFWorkbook();
    151                         break;
    152                 }
    153                 ICellStyle style = GetCellStyle(hssfworkbook, HorizontalAlignment.Center, VerticalAlignment.Center, short.MinValue, 10, false);
    154                 for (int i = 0; i < dataSet.Tables.Count; i++)
    155                 {
    156                     ISheet sheet = hssfworkbook.CreateSheet(dataSet.Tables[i].TableName) as ISheet;//创建sheet
    157                     IRow row = sheet.CreateRow(0) as IRow;//锁定sheet第一行
    158                     for (int j = 0; j < dataSet.Tables[i].Columns.Count; j++)//获取DataTable列总条数依次循环
    159                     {
    160                         row.CreateCell(j).SetCellValue(dataSet.Tables[i].Columns[j].ColumnName);//填充sheet第一行标题内容
    161                         row.GetCell(j).CellStyle = style;
    162                     }
    163                     for (int g = 0; g < dataSet.Tables[i].Rows.Count; g++)//获取DataTable行总条数依次循环
    164                     {
    165                         row = sheet.CreateRow(g + 1) as IRow;//锁定除sheet第一行外的每一行
    166                         for (int j = 0; j < dataSet.Tables[i].Columns.Count; j++)//获取DataTable列总条数依次循环
    167                         {
    168                             row.CreateCell(j).SetCellValue(dataSet.Tables[i].Rows[g][j].ToString());//将DataTable数据填充sheet内容中
    169                             row.GetCell(j).CellStyle = style;
    170                         }
    171                     }
    172                 }
    173                 //寫入,把內存中的workBook對象寫入到磁盤上
    174                 file = new FileStream(filePath + "\" + exportName + "." + exportFormat, FileMode.Create);
    175                 hssfworkbook.Write(file);
    176                 hssfworkbook.Close();//关闭文件流
    177                 file.Close();
    178                 file.Dispose(); //释放文件流
    179                 return "OK,匯出成功";
    180             }
    181             catch (Exception ex)
    182             {
    183                 hssfworkbook.Close();//关闭文件流
    184                 file.Close();
    185                 file.Dispose(); //释放文件流
    186                 return "NO," + ex.Message;
    187             }
    188         }
    189         /// <summary>
    190         /// 设置样式
    191         /// </summary>
    192         /// <param name="workbook"></param>
    193         /// <param name="hAlignment">水平布局方式</param>
    194         /// <param name="vAlignment">垂直布局方式</param>
    195         /// <param name="boldWeight">字体加粗 (short.MaxValue)</param>
    196         /// <param name="fontPonint">字体大小</param>
    197         /// <param name="isBorder">是否需要边框 true是</param>
    198         /// <returns></returns>
    199         private ICellStyle GetCellStyle(IWorkbook workbook, HorizontalAlignment hAlignment, VerticalAlignment vAlignment, short boldWeight, short fontPonint, bool isBorder)
    200         {
    201             try
    202             {
    203                 ICellStyle cellstyle = workbook.CreateCellStyle();
    204                 cellstyle.Alignment = hAlignment; //水平居中
    205                 cellstyle.VerticalAlignment = vAlignment; //垂直居中
    206                 if (isBorder)
    207                 {
    208                     cellstyle.BorderBottom = BorderStyle.Thin;
    209                     cellstyle.BorderLeft = BorderStyle.Thin;
    210                     cellstyle.BorderRight = BorderStyle.Thin;
    211                     cellstyle.BorderTop = BorderStyle.Thin;
    212                 }
    213                 IFont cellStyleFont = (IFont)workbook.CreateFont(); //创建字体
    214                 cellStyleFont.Boldweight = boldWeight; //字体加粗
    215                 cellStyleFont.FontHeightInPoints = fontPonint; //字体大小
    216                 cellstyle.SetFont(cellStyleFont); //将字体绑定到样式
    217                 return cellstyle;
    218             }
    219             catch (Exception ex)
    220             {
    221 
    222                 throw ex;
    223             }
    224         }
    225     }
  • 相关阅读:
    select中的简单联动
    php中的魔术方法简介
    Mysql常用知识
    php程序员需要注意的问题
    android webview "Uncaught SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.", source: (1)
    gallery调用setselection时有动画的两个方法:
    视频格式资料
    判断网络3,4,2,wifi
    重载的view的ontouchevent不响应的解决办法
    SpannableString用法注意
  • 原文地址:https://www.cnblogs.com/ShyFrog/p/12160270.html
Copyright © 2020-2023  润新知