【问题标题】:EPPLUS how to know the format of the Worksheet cellEPPLUS如何知道工作表单元格的格式
【发布时间】:2015-02-18 19:02:33
【问题描述】:

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

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

当单元格值为日期时,代码可以正常工作,例如:Invoice Date = 42009,但它会将非日期值(例如:amount = 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();
        }
   }

【问题讨论】:

    标签: epplus epplus-4


    【解决方案1】:

    简短的回答是,如果 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()
    {
        //http://stackoverflow.com/questions/28591763/epplus-how-to-know-the-format-of-the-worksheet-cell
        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(真的很优秀) 将它们报告为。

    【讨论】:

      【解决方案2】:

      如果你想知道当前的单元格格式,为什么不使用 ExcelNumberFormat 类?

      var style=oSheet.Cells[i, j].style;
      string format=style.Numberformat.Format;
      

      这将为您提供当前的单元格格式,即“YYYY-MM-dddd”、“%#.##”等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多