你的位置:首页 > ASP.net教程

[ASP.net教程]NPOI 读取excel到DataTable 读取隐藏列 读取公式列


处理思路:

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