EPPlus:日期列返回 int 而不是实际显示的文本值
EPPlus : date column returning int rather than the actual displayed text value
我正在使用 EPPlus 读取 excel 数据。我需要按原样在网格中向用户显示 excel 个单元格。
在读取日期列时,EPPlus 正在为日期提供 OADate int 值。
有没有一种方法可以将值读取为字符串,用户通常在打开 excel 时会看到它。即应用 excel 格式后的值。
CELL class 上似乎没有提供 valueAsString 或 valueAsDisplayed 等的任何功能...
如果日期在 excel 中存储为双精度(如果没有时间部分则为整数)并应用了格式,这将是 "correct" 方式,您已重新创建日期在代码中并重新应用 Excel 中应用的日期格式。唯一的问题是 excel 的格式与 .net 略有不同,尤其是在区分大小写方面,因此您应该检查一下以确保 MMM 不是 mmm(这会让您在 .net 中花费几分钟) .所以像这样的东西有效:
[TestMethod]
public void OADate_Test()
{
//
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();
}
}
我还发现了一个不太复杂的方法。
如果您将 'NumberFormatLocal' 而不是 'NumberFormat' 属性 更改为 "dd/mm/yyyy",它们将导入为日期而不是数字。
所以
子 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
结束子
我正在使用 EPPlus 读取 excel 数据。我需要按原样在网格中向用户显示 excel 个单元格。
在读取日期列时,EPPlus 正在为日期提供 OADate int 值。
有没有一种方法可以将值读取为字符串,用户通常在打开 excel 时会看到它。即应用 excel 格式后的值。
CELL class 上似乎没有提供 valueAsString 或 valueAsDisplayed 等的任何功能...
如果日期在 excel 中存储为双精度(如果没有时间部分则为整数)并应用了格式,这将是 "correct" 方式,您已重新创建日期在代码中并重新应用 Excel 中应用的日期格式。唯一的问题是 excel 的格式与 .net 略有不同,尤其是在区分大小写方面,因此您应该检查一下以确保 MMM 不是 mmm(这会让您在 .net 中花费几分钟) .所以像这样的东西有效:
[TestMethod]
public void OADate_Test()
{
//
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();
}
}
我还发现了一个不太复杂的方法。 如果您将 'NumberFormatLocal' 而不是 'NumberFormat' 属性 更改为 "dd/mm/yyyy",它们将导入为日期而不是数字。
所以
子 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
结束子