1 public class NPOIExcel 2 { 3 /// <summary> 4 /// 將excel導入到datatable 5 /// </summary> 6 /// <param name="filePath">excel路徑</param> 7 /// <param name="isColumnName">第一行是否是列名</param> 8 /// <returns>返回datatable</returns> 9 public static DataTable ExcelToDataTable(string filePath, bool isColumnName) 10 { 11 DataTable dataTable = null; 12 FileStream fs = null; 13 DataColumn column = null; 14 DataRow dataRow = null; 15 IWorkbook workbook = null; 16 ISheet sheet = null; 17 IRow row = null; 18 ICell cell = null; 19 int startRow = 0; 20 try 21 { 22 using (fs = File.OpenRead(filePath)) 23 { 24 // 2007版本 25 if (filePath.IndexOf(".xlsx") > 0) 26 workbook = new XSSFWorkbook(fs); 27 // 2003版本 28 else if (filePath.IndexOf(".xls") > 0) 29 workbook = new HSSFWorkbook(fs); 30 31 if (workbook != null) 32 { 33 sheet = workbook.GetSheetAt(0);//讀取第一個sheet,當然也可以循環讀取每個sheet 34 dataTable = new DataTable(); 35 if (sheet != null) 36 { 37 int rowCount = sheet.LastRowNum;//總行數 38 if (rowCount > 0) 39 { 40 IRow firstRow = sheet.GetRow(0);//第一行 41 int cellCount = firstRow.LastCellNum;//列數 42 43 //構建datatable的列 44 if (isColumnName) 45 { 46 startRow = 1;//如果第一行是列名,則從第二行開始讀取 47 for (int i = firstRow.FirstCellNum; i < cellCount; ++i) 48 { 49 cell = firstRow.GetCell(i); 50 if (cell != null) 51 { 52 if (cell.StringCellValue != null) 53 { 54 column = new DataColumn(cell.StringCellValue); 55 dataTable.Columns.Add(column); 56 } 57 } 58 } 59 } 60 else 61 { 62 for (int i = firstRow.FirstCellNum; i < cellCount; ++i) 63 { 64 column = new DataColumn("column" + (i + 1)); 65 dataTable.Columns.Add(column); 66 } 67 } 68 69 //填充行 70 for (int i = startRow; i <= rowCount; ++i) 71 { 72 row = sheet.GetRow(i); 73 if (row == null) continue; 74 75 dataRow = dataTable.NewRow(); 76 for (int j = row.FirstCellNum; j < cellCount; ++j) 77 { 78 cell = row.GetCell(j); 79 if (cell == null) 80 { 81 dataRow[j] = ""; 82 } 83 else 84 { 85 //CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,) 86 switch (cell.CellType) 87 { 88 case CellType.Blank: 89 dataRow[j] = ""; 90 break; 91 case CellType.Numeric: 92 short format = cell.CellStyle.DataFormat; 93 //對時間格式(2015.12.5、2015/12/5、2015-12-5等)的處理 94 if (format == 14 || format == 31 || format == 57 || format == 58) 95 dataRow[j] = cell.DateCellValue; 96 else 97 dataRow[j] = cell.NumericCellValue; 98 break; 99 case CellType.String: 100 dataRow[j] = cell.StringCellValue; 101 break; 102 } 103 } 104 } 105 dataTable.Rows.Add(dataRow); 106 } 107 } 108 } 109 } 110 } 111 return dataTable; 112 } 113 catch (Exception) 114 { 115 if (fs != null) 116 { 117 fs.Close(); 118 } 119 return null; 120 } 121 } 122 123 /// <summary> 124 /// 寫入excel 125 /// </summary> 126 /// <param name="dt">datatable</param> 127 /// <param name="strFile">strFile</param> 128 /// <returns></returns> 129 public static bool DataTableToExcel(DataTable dt, string strFile) 130 { 131 bool result = false; 132 IWorkbook workbook = null; 133 FileStream fs = null; 134 IRow row = null; 135 ISheet sheet = null; 136 ICell cell = null; 137 try 138 { 139 if (dt != null && dt.Rows.Count > 0) 140 { 141 workbook = new HSSFWorkbook(); 142 sheet = workbook.CreateSheet("Sheet0");//創建一個名稱為Sheet0的表 143 int rowCount = dt.Rows.Count;//行數 144 int columnCount = dt.Columns.Count;//列數 145 146 //設置列頭 147 row = sheet.CreateRow(0);//excel第一行設為列頭 148 for (int c = 0; c < columnCount; c++) 149 { 150 cell = row.CreateCell(c); 151 cell.SetCellValue(dt.Columns[c].ColumnName); 152 } 153 154 //設置每行每列的單元格, 155 for (int i = 0; i < rowCount; i++) 156 { 157 row = sheet.CreateRow(i + 1); 158 for (int j = 0; j < columnCount; j++) 159 { 160 cell = row.CreateCell(j);//excel第二行開始寫入數據 161 cell.SetCellValue(dt.Rows[i][j].ToString()); 162 } 163 } 164 using (fs = File.OpenWrite(strFile)) 165 { 166 workbook.Write(fs);//向打開的這個xls文件中寫入數據 167 result = true; 168 } 169 } 170 return result; 171 } 172 catch (Exception ex) 173 { 174 if (fs != null) 175 { 176 fs.Close(); 177 } 178 return false; 179 } 180 } 181 182 /// <summary> 183 /// Excel導入成Datable 184 /// </summary> 185 /// <param name="file">導入路徑(包含文件名與擴展名)</param> 186 /// <returns></returns> 187 public static DataTable ExcelToTable(string file) 188 { 189 DataTable dt = new DataTable(); 190 IWorkbook workbook; 191 string fileExt = Path.GetExtension(file).ToLower(); 192 using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) 193 { 194 //XSSFWorkbook 適用XLSX格式,HSSFWorkbook 適用XLS格式 195 if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(fs); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(fs); } else { workbook = null; } 196 if (workbook == null) { return null; } 197 ISheet sheet = workbook.GetSheetAt(0); 198 199 //表頭 200 IRow header = sheet.GetRow(sheet.FirstRowNum); 201 List<int> columns = new List<int>(); 202 for (int i = 0; i < header.LastCellNum; i++) 203 { 204 object obj = GetValueType(header.GetCell(i)); 205 if (obj == null || obj.ToString() == string.Empty) 206 { 207 dt.Columns.Add(new DataColumn("Columns" + i.ToString())); 208 } 209 else 210 dt.Columns.Add(new DataColumn(obj.ToString())); 211 columns.Add(i); 212 } 213 //數據 214 for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++) 215 { 216 DataRow dr = dt.NewRow(); 217 bool hasValue = false; 218 foreach (int j in columns) 219 { 220 dr[j] = GetValueType(sheet.GetRow(i).GetCell(j)); 221 if (dr[j] != null && dr[j].ToString() != string.Empty) 222 { 223 hasValue = true; 224 } 225 } 226 if (hasValue) 227 { 228 dt.Rows.Add(dr); 229 } 230 } 231 } 232 return dt; 233 } 234 235 /// <summary> 236 /// Datable導出成Excel 237 /// </summary> 238 /// <param name="dt"></param> 239 /// <param name="file">導出路徑(包括文件名與擴展名)</param> 240 public static void TableToExcel(DataTable dt, string file) 241 { 242 IWorkbook workbook; 243 string fileExt = Path.GetExtension(file).ToLower(); 244 if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(); } else { workbook = null; } 245 if (workbook == null) { return; } 246 ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName); 247 248 //表頭 249 IRow row = sheet.CreateRow(0); 250 for (int i = 0; i < dt.Columns.Count; i++) 251 { 252 ICell cell = row.CreateCell(i); 253 cell.SetCellValue(dt.Columns[i].ColumnName); 254 } 255 256 //數據 257 for (int i = 0; i < dt.Rows.Count; i++) 258 { 259 IRow row1 = sheet.CreateRow(i + 1); 260 for (int j = 0; j < dt.Columns.Count; j++) 261 { 262 ICell cell = row1.CreateCell(j); 263 cell.SetCellValue(dt.Rows[i][j].ToString()); 264 } 265 } 266 267 //轉為字節數組 268 MemoryStream stream = new MemoryStream(); 269 workbook.Write(stream); 270 var buf = stream.ToArray(); 271 272 //保存為Excel文件 273 using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write)) 274 { 275 fs.Write(buf, 0, buf.Length); 276 fs.Flush(); 277 } 278 } 279 280 /// <summary> 281 /// 獲取單元格類型 282 /// </summary> 283 /// <param name="cell"></param> 284 /// <returns></returns> 285 private static object GetValueType(ICell cell) 286 { 287 if (cell == null) 288 return null; 289 switch (cell.CellType) 290 { 291 case CellType.Blank: //BLANK: 292 return null; 293 case CellType.Boolean: //BOOLEAN: 294 return cell.BooleanCellValue; 295 case CellType.Numeric: //NUMERIC: 296 return cell.NumericCellValue; 297 case CellType.String: //STRING: 298 return cell.StringCellValue; 299 case CellType.Error: //ERROR: 300 return cell.ErrorCellValue; 301 case CellType.Formula: //FORMULA: 302 default: 303 return "=" + cell.CellFormula; 304 305 } 306 } 307 308 }