使用opemxml SDK获取单元格格式以检查excel中的日期列值

本文关键字:excel 日期 检查 SDK opemxml 获取 单元格 格式 使用 | 更新日期: 2023-09-27 18:07:53

value = string.Empty;
if (cell.StyleIndex != null)
{
    CellFormat cf = document.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.ChildElements[int.Parse(cell.StyleIndex.InnerText)] as CellFormat;
    if (cf.NumberFormatId == 14)
    {
        //value = DateTime.Parse("1900-01-01").AddDays(int.Parse(cell.CellValue.Text) - 2).ToString("yyyy-MM-dd");
        value = Convert.ToString(DateTime.FromOADate(Double.Parse(cell.CellValue.Text)).ToShortDateString());
    }
    if (cf.NumberFormatId == 176 || cf.NumberFormatId == 177)
    {
        //value = DateTime.Parse("1900-01-01").AddDays(int.Parse(cell.CellValue.Text) - 2).ToString("yyyy-MM-dd");
        value = Convert.ToString(DateTime.FromOADate(Double.Parse(cell.CellValue.Text)));
    }
}

我使用上面的代码来检查excel中是否有任何日期列,然后将单元格的值转换为等效日期。默认情况下,NumberFormatID是14,但是在excel中有更多的日期格式。对于特定的日期格式,NumberFormatID有时显示165,有时显示176。这些不是固定的。所以当我选择日期时间格式时,有时它是176,有时它是不同的,所以我的代码不工作。如何区分特定的日期和日期时间格式?

使用opemxml SDK获取单元格格式以检查excel中的日期列值

就像你说的,有很多"日期格式",人们可以自定义字段(我不知道它是否适合你)。

如果您唯一的问题是"解析日期",只需使用DateTime。TryParse

value = string.Empty;
if (cell.StyleIndex != null)
{
    DateTime res;
    if (DateTime.TryParse(cell.CellValue.Text, out res))
    {
        value = res.ToString("yyyy-MM-dd");
    }
}

如果单元格是"日期格式",TryParse将成功