【发布时间】:2015-01-20 13:03:53
【问题描述】:
我正在使用 EPPlus 读取 excel 数据。我需要在网格中按原样向用户显示 excel 单元格。
在读取日期列时,EPPlus 为日期提供 OADate int 值。
有没有一种方法可以将值读取为字符串,用户通常在打开 excel 时会看到这些值。即应用excel格式后的值。
CELL 类上似乎没有任何函数提供 valueAsString 或 valueAsDisplayed 等...
【问题讨论】:
我正在使用 EPPlus 读取 excel 数据。我需要在网格中按原样向用户显示 excel 单元格。
在读取日期列时,EPPlus 为日期提供 OADate int 值。
有没有一种方法可以将值读取为字符串,用户通常在打开 excel 时会看到这些值。即应用excel格式后的值。
CELL 类上似乎没有任何函数提供 valueAsString 或 valueAsDisplayed 等...
【问题讨论】:
如果日期以双精度形式存储在 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) 我的意思是类似于这样的
我还发现了一种不太复杂的方法。 如果您将“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
结束子
【讨论】: