NPOI 导入 Excel

用 NPOI 导入 Excel 时,大部分情况我们预先是不知道每个单元格的数据类型的。对于日期格式的单元格,如果直接转换为字符串将会得到不可预料的日期格式的字符串(如2013/5/31日期将会被转换成 "31/5/13",或者其他)。因此获取日期格式的单元格数据,需要先判断是否为日期格式。

/// <summary>
/// 从EXCEL文件导入到DataTable
/// </summary>
protected DataTable ImportDataTableFromExcel(System.IO.Stream excelFileStream, string sheetName, int headerRowIndex) {
    //创建工作簿对象
    NPOI.HSSF.UserModel.HSSFWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(excelFileStream);
    //获取参数指定的sheet
    NPOI.SS.UserModel.ISheet sheet = workbook.GetSheet(sheetName);
    if (sheet == null)
        return null;
    DataTable table = new DataTable();
    NPOI.SS.UserModel.IRow headerRow = sheet.GetRow(headerRowIndex);
    int cellCount = headerRow.LastCellNum;
    //读取并生成标题行
    for (int i = headerRow.FirstCellNum; i < cellCount; i++) {
        DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
        table.Columns.Add(column);
    }
    for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) {
        NPOI.SS.UserModel.IRow row = sheet.GetRow(i);
        DataRow dataRow = table.NewRow();
        if (row != null) {
            for (int j = row.FirstCellNum; j < cellCount; j++) {
                if (row.GetCell(j) == null)
                    dataRow[j] = "";
                else {
                    ICell cell = row.GetCell(j);
                    //Cell为非NUMERIC时,调用IsCellDateFormatted方法会报错,所以先要进行类型判断
                    if (cell.CellType == CellType.NUMERIC && DateUtil.IsCellDateFormatted(cell))
                        dataRow[j] = cell.DateCellValue.ToString("yyyy/MM/dd");
                    else {
                        dataRow[j] = row.GetCell(j).ToString();
                    }
                }
            }
            table.Rows.Add(dataRow);
        }
    }
    excelFileStream.Close();
    return table;
}

这是一个将Excel文件流导入到DataTable的通用方法。通过DateUtil.IsCellDateFormatted方法可以判断单元格是否为日期格式,是日期格式则可以通过 cell.DateCellValue 获取单元格的日期值。然后可以方便地将其转换为想要的字符串格式。另外 DateUtil.IsCellDateFormatted 方法的参数如果是非 NUMERIC 会报错,所以调用前要确保CellType是否为 NUMERIC。

posted @ 2017-05-17 16:56  花生打代码会头痛  阅读(163)  评论(0)    收藏  举报