處理思路:
1.打開excel 用NPOI進行讀取;
2.讀取第一個Sheet;
讀取過程中:
a.先設置相應列 不隱藏
b.讀取Cell時 先判斷是否的包含公式
相應代碼如下:
public static DataTable ReadDataFromExcelByNPOI() { DataTable dt = new DataTable(); var filePathAndName = Path.Combine(Server.MapPath("~/Content/Excel"), "ExcelForUploadTest.xls"); //打開文件讀取數據 stream = System.IO.File.Open(filePathAndName2, FileMode.Open); //通過Stream創建Workbook HSSFWorkbook workbook = new HSSFWorkbook(stream); //獲取excel的第一個sheet HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(0); //設置隱藏列 為 不隱藏 for (int iHide = 0; iHide <= 40; iHide++) { sheet.SetColumnHidden(iHide, false); } //最后一列的標號(即總的行數) int rowCount = sheet.LastRowNum; //獲取sheet的首行 HSSFRow headerRow = (HSSFRow)sheet.GetRow(0); //一行最后一個方格的編號(即總的列數) int cellCount = headerRow.LastCellNum; string columnNames = @"A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z, AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ"; string[] columns = columnNames.Split(','); //使用 A B C D ... 字母的方式 命名DataTable的各列名 for (int i = headerRow.FirstCellNum; i < cellCount; i++) { //DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); DataColumn column = new DataColumn(columns[i]); dt.Columns.Add(column); } for (int i = (iHeaderRowIndex.Value + 1); i <= rowCount; i++) { HSSFRow row = (HSSFRow)sheet.GetRow(i); DataRow dataRow = dt.NewRow(); if (row != null) { for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null) { //如果是公式Cell //則僅讀取其Cell單元格的顯示值 而不是讀取公式 if (row.GetCell(j).CellType == CellType.FORMULA) { dataRow[j] = row.GetCell(j).StringCellValue; }else{ dataRow[j] = row.GetCell(j).ToString(); } } } } //某標示列 33 //某標示列 38 //其值非空 標示是有效數據 //其值為空 標示結束 if(string.IsNullOrEmpty(dataRow[33].ToString()) && string.IsNullOrEmpty(dataRow[38].ToString()) ) { break;//讀取結束 退出For循環 } else { dt.Rows.Add(dataRow); } } workbook = null; sheet = null; return dt; } #endregion