NPOI - 如何区分格式为日期时间的数字Excel单元格(c#)

7

背景

我有一个包含日期时间和小数的Excel文件(xlxs),我想将其转换为二维字符串数组。数组中的字符串应该与用户在Excel中输入的完全相同。为此,我使用了带有C#的NPOI版本2.2.1。

请注意,示例中的A列在Excel中格式化为日期!

COLUMN A     COLUMN B
2016-07-20   -46,95
2016-07-20   283,59
2016-07-20   -46,95
2016-07-20   52194,64

我有一个通用方法ConvertCellToString(),用于将单元格转换为其适当的字符串表示形式:
    private string GetCellAsString(ICell cell)
    {
        switch (cell.CellType)
        {
            case CellType.Boolean:
                return cell.BooleanCellValue.ToString();
            case CellType.Error:
                return cell.ErrorCellValue.ToString();
            case CellType.Formula:
                return cell.CellFormula.ToString();
            //ALL CELLS IN THE EXEMPEL ARE NUMERIC AND GOES HERE
            case CellType.Numeric:
                return cell.NumericCellValue.ToString();
            case CellType.String:
                return cell.StringCellValue.ToString();
            case CellType.Blank:
            case CellType.Unknown:
            default:
                return "";
        }
    }

然而,由于连日期时间单元格也是数字单元格,因此此解决方案会导致下面的所有日期都以数字而不是日期表示(“21672”而不是“2016-07-20”等)。
下面的方法需要区分具有日期时间的数字单元格和具有数字的数字单元格。是否可以通过NPOI进行这样做?我不想使用解析字符串的方法,特别是因为NPIOs cell.ToString()如果它是日期,则返回可怕的“2016-jan-20”格式。
我被卡住了,所以非常感谢您的帮助!肯定有一些明显的最佳实践,但我找不到!

需要注意的是,我无法控制Excel的格式。它们来自各种客户,其中一些使用不同的格式,上述方法来自我们用于将所有Excel转换为字符串的通用库。 - user1531921
DateUtils有一个public static bool IsCellDateFormatted(Cell cell)方法,如果单元格格式为日期,则返回true。我从未使用过NPOI,但这也是使用apache poi执行此任务的方法。 - Axel Richter
谢谢,我会去看看! - user1531921
看起来已经解决了!如果您发布一个答案,我可以将其标记为正确的答案! - user1531921
我不能发布C#代码,因为我从未编写过C#。;-)。但是你可以用解决此问题的确切代码回答自己的问题。这是一个常见的问题。所以这会很有帮助。 - Axel Richter
1个回答

21

原来可以这样使用DateUtil.IsCellDateFormatted():

            case CellType.Numeric:
                {
                    return DateUtil.IsCellDateFormatted(cell) 
                        ? cell.DateCellValue.ToString() 
                        : cell.NumericCellValue.ToString();
                }

1
我们在更新NPOI库后遇到了一些回归问题。这个解决方案起作用了,而且似乎更加不受日期格式的影响。感谢您的建议! - Guillaume ZAHRA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接