基于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 }