NPOI 日期转字符串问题

用 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。

 

你可能感兴趣的:(poi)