基於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     }
上一篇:关于tableau和execl绘图的区别:


下一篇:同时向主表和从表里面导入execl数据 (asp.net webform)