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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM