EPPlus:日期列返回int而不是实际显示的文本值

时间:2015-01-20 13:03:53

标签: excel epplus epplus-4

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

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

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

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

2 个答案:

答案 0 :(得分:2)

如果日期在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();

    }
}

答案 1 :(得分:0)

我还发现了一种不太复杂的方法。 如果您将“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

End Sub