我有一个Excel工作表与人的生日列表,内容是这样的:C# - Excel中日期不及格日期序列中值2
Mary 08/17/1993
John 01/23/1991
Ann 12/07/1989
凡左边栏有一个“常规”格式,而右列有'DATE'格式。意图是有一个windows服务,每天会读这份生日列表并发送任何“生日快乐!”适用的电子邮件。
这是我使用的代码读取Excel数据:
public static List<Tuple<string, DateTime>> getBirthdays()
{
List<Tuple<string, DateTime>> birthdays = new List<Tuple<string, DateTime>>();
Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"C:\Users\AGuaja\Desktop\birthdays.xlsx");
Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1];
Excel.Range xlRange = xlWorksheet.UsedRange;
int rowCount = xlRange.Rows.Count;
int colCount = xlRange.Columns.Count;
string user = String.Empty;
DateTime bday = DateTime.Now;
for (int i = 1; i <= rowCount; i++)
{
for (int j = 1; j <= colCount; j++)
{
if (xlRange.Cells[i, j] != null && xlRange.Cells[i, j].Value2 != null)
{
if (j == 1)
user = xlRange.Cells[i, j].Value2.ToString();
else
bday = DateTime.FromOADate(double.Parse(xlRange.Cells[i, j].Value2));
}
}
birthdays.Add(new Tuple<string, DateTime>(user, bday));
}
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.ReleaseComObject(xlRange);
Marshal.ReleaseComObject(xlWorksheet);
xlWorkbook.Close();
Marshal.ReleaseComObject(xlWorkbook);
xlApp.Quit();
Marshal.ReleaseComObject(xlApp);
return birthdays;
}
了一下才知道是正确的方式来获得的日期从Excel是使用FromOADate
方法摸索之后,例如,其预期以40599的形式的double
值表示日期。然而,我的Value2
没有返回日期序列,而是上面看到的格式的值,12/07/1989,因此我无法使用转换Excel日期的“正确方法” 。
我的意思是,当然,我可以只使用Value2
的字符串并将其解析为日期,但为什么该值无法正确传递?
在你的Excel中,你是否将行格式化为DATE?如果你不是他们是 存储为文本值,你不会得到内部双值。 – dgorti
@dgorti是的,我明确地确定了这一点,因为我认为那是原始问题,但那不是。 –
明白了,你在你的文章中提到过。让我掀起一个样本,看看发生了什么 – dgorti