【问题标题】:EPPlus : date column returning int rather than the actual displayed text valueEPPlus :日期列返回 int 而不是实际显示的文本值
【发布时间】:2015-01-20 13:03:53
【问题描述】:

我正在使用 EPPlus 读取 excel 数据。我需要在网格中按原样向用户显示 excel 单元格。

在读取日期列时,EPPlus 为日期提供 OADate int 值。

有没有一种方法可以将值读取为字符串,用户通常在打开 excel 时会看到这些值。即应用excel格式后的值。

CELL 类上似乎没有任何函数提供 valueAsString 或 valueAsDisplayed 等...

【问题讨论】:

    标签: excel epplus epplus-4


    【解决方案1】:

    如果日期以双精度形式存储在 excel 中(如果没有时间组件,则为整数)并应用格式,这将是“正确”的方式,您已经在代码中重新创建日期并重新应用应用的日期格式在 Excel 中。唯一的问题是 excel 的格式与 .net 略有不同,尤其是在区分大小写方面,因此您应该在其中进行检查以确保 MMM 不是 mmm(这将使您在 .net 中花费几分钟)。所以像这样的工作:

    [TestMethod]
    public void OADate_Test()
    {
        //http://stackoverflow.com/questions/28046069/epplus-date-column-returning-int-rather-than-the-actual-displayed-text-value
        var existingFile = new FileInfo(@"c:\temp\temp.xlsx");
        if (existingFile.Exists)
            existingFile.Delete();
    
    
        using (var package = new ExcelPackage(existingFile))
        {
            //.NET is case sensive so MMM must be capital but Excel might not be
            const string FORMATDATE = "dd-MMM-yyyy";
            var mydate = new DateTime(2015, 1, 1);
            var datedouble = mydate.ToOADate();
    
            var worksheet = package.Workbook.Worksheets.Add("Newsheet");
    
            worksheet.Cells["A1"].Value = "As Date";
    
            worksheet.Cells["A2"].Value = datedouble;
            worksheet.Cells["A2"].Style.Numberformat.Format = FORMATDATE;
    
            package.Save();
        }
    
        using (var package = new ExcelPackage(existingFile))
        {
            var worksheet = package.Workbook.Worksheets["Newsheet"];
    
            worksheet.Cells["B1"].Value = "As String";
    
            var datedouble = (double) worksheet.Cells["A2"].Value;
            worksheet.Cells["B2"].Value = DateTime.FromOADate(datedouble).ToString(worksheet.Cells["A2"].Style.Numberformat.Format);
    
            package.Save();
    
        }
    }
    

    【讨论】:

    • 最好是这样的:worksheet.Cells["A2"].Value.ToString( worksheet.Cells["A2"].Style.Numberformat.Format) 我的意思是类似于这样的
    • @HarishR 你的意思是倒数第二行(保存前的那一行)吗?我相信这会产生设计时错误。值是一个对象类型,所以它不能应用格式字符串而不先转换。
    • 我知道它会产生错误,我的意思是,这样的东西会很棒:) 并且从 EP-Plus 库中丢失,真的无法理解为什么框架丢失了一些东西基本的像给定格式的值。无论如何感谢您的回答
    • 我的问题是,excel字符串值(应该是日期)并不总是保证是一个有效的日期,所以我可能需要更多的验证检查
    • @HarishR 我明白了。是的,很高兴看到,就像可能的事情一样。但我想他们能做的只有这么多——在没有 excel 的情况下生成 excel 文件非常困难。为了验证,是的,这里肯定需要一些,也许是围绕铸件的尝试。祝你好运! :)
    【解决方案2】:

    我还发现了一种不太复杂的方法。 如果您将“NumberFormatLocal”而不是“NumberFormat”属性更改为“dd/mm/yyyy”,它们将作为日期而不是数字导入。

    所以

    Sub ChangeExcelColumnFormat()

        Dim ExcelApp As Excel.Application
        Dim ExcelWB As Excel.Workbook
        Dim ExcelWS As Excel.Worksheet
        Dim formatRange As Excel.Range
    
        Dim strFile As String = "C:\Test.xlsx"
        Dim strSheetname As String = "Sheet1"
    
    
        ExcelApp = New Excel.Application
        ExcelWB = ExcelApp.Workbooks.Open(strFile)
    
            strColSelect = "A:A"
            strFormat = "dd/mm/yyyy"
    
            formatRange = ExcelWS.Range(strColSelect)
            formatRange.NumberFormatLocal = strFormat
    
        ExcelWB.Save()
        ExcelWB.Close()
        ExcelApp.Quit()
    
        ExcelWS = Nothing
        ExcelWB = Nothing
        ExcelApp = Nothing
    

    结束子

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 2021-10-17
      • 2018-11-27
      • 1970-01-01
      • 2019-10-16
      相关资源
      最近更新 更多