EPPLUS如何知道工作表单元格的格式

3

我正在使用EPPlus读取Excel表格并将数据加载到datatable中进行进一步操作,然后将修改后的数据保存回Excel文件。

以下代码检查单元格值是否为浮点值,然后将浮点值转换为日期时间。

当单元格值是日期时,如发票日期= 42009,该代码可以正常运行,但它会将非日期值(例如:金额= 10)转换为日期。

EPPlus库中是否有任何方法可以确定单元格的格式(即通用/日期/数字等)?

float floatValue;

if (float.TryParse(Convert.ToString(oSheet.Cells[i, j].Value), out floatValue)
                                && Convert.ToString(oSheet.Cells[i, j].Style.Numberformat.Format).Contains("[$-409]d\\-mmm\\-yy;@"))
  {
      dr[j - 1] = String.Format("{0:d-MMM-yy}", DateTime.FromOADate(floatValue));
  }
  else
  {
       DateTime date;

       if (DateTime.TryParse(Convert.ToString(oSheet.Cells[i, j].Value), out date))
        {
                dr[j - 1] = String.Format("{0:d-MMM-yy}", date);
        }
        else
        {
               dr[j - 1] = Convert.ToString(oSheet.Cells[i, j].Value).Trim();
        }
   }
2个回答

4
简而言之,如果Excel中的数据格式设置为“日期”字段(其格式设置为日期且单元格角落没有三角形),EPPlus会自动将其转换为单元格存储中的日期。 Excel将此信息存储在XLSX xml文件中,例如sheet1.xml和styles.xml,您可以通过将文件扩展名更改为.ZIP并将其作为压缩文件夹打开来查看。因此,EPPlus将读取XML标志并自动将字段值转换为DateTime。如果您想查看其详细信息,请下载EPPlus源代码并查看ExcelWorksheet类中的函数private void SetValueFromXml(XmlTextReader xr, string type, int styleID, int row, int col)。
我创建了一个工作表,添加了一个日期值,并将该值复制粘贴到单元格B2,但然后将格式设置为数字。然后,我将B2复制到B3,但通过在值前面放置'使B3中的值成为字符串。就像这样:
[图片]
当我运行此单元测试时,一切都通过了。
[TestMethod]
public void Date_Number_Test()
{
    //https://dev59.com/38Hrs4cB2Jgan1znmTfb
    var existingFile = new FileInfo(@"c:\temp\datetest.xlsx");

    using (var package2 = new ExcelPackage(existingFile))
    {
        var ws = package2.Workbook.Worksheets["Sheet1"];

        var cell = ws.Cells["B1"];
        Assert.IsTrue(cell.Value is DateTime);

        cell = ws.Cells["B2"];
        Assert.IsTrue(cell.Value is double);

        cell = ws.Cells["B3"];
        Assert.IsTrue(cell.Value is string);
    }
}

但是,如果你正在处理的表格有超出你控制范围的格式,那么我认为你的方法是正确的,因为你必须确定数字的“意图”,而不能依赖于EPPlus(实际上是Excel)报告它们。


0
如果你想知道当前单元格的格式,为什么不使用ExcelNumberFormat类呢?
var style=oSheet.Cells[i, j].style;
string format=style.Numberformat.Format;

这将为您提供当前单元格的格式,例如"YYYY-MM-dddd","%#.##"等。


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