gpt4 book ai didi

c# - 日期的 Excel Interop 单元格格式

转载 作者:太空狗 更新时间:2023-10-29 23:39:51 24 4
gpt4 key购买 nike

我的程序在 Excel 中创建输出。

一些日期似乎被误解了: enter image description here

打开文件时,日期是屏幕截图中的混合日期。
如果我真的将光标放在 Excel 的计算框中(在屏幕打印中)并按回车键,单元格的格式将恢复为正确的格式。

我正在使用 Microsoft.Office.Interop.Excel 将数据从 Datatable 移动到保存在我的解决方案中的 Excel 模板。

在将数据放入单元格之前,我使用 switch 相应地更改了每一列的数字格式:

for(int i = 1; i < NumColumns + 1; i++) {
switch(dt.Columns[i-1].DataType.ToString()) {
case "System.Int32":
xlWorkSheet.Columns[i].NumberFormat = "#,##0_ ;[Red]-#,##0 ";
break;
case "System.String":
xlWorkSheet.Columns[i].NumberFormat = "@";
break;
case "System.DateTime":
xlWorkSheet.Columns[i].NumberFormat = "[$-809]dd mmmm yyyy;@"; //"dd-mmm-yy";
break;
case "System.Date":
xlWorkSheet.Columns[i].NumberFormat = "[$-809]dd mmmm yyyy;@"; //"dd-mmm-yy";
break;
default:
xlWorkSheet.Columns[i].NumberFormat = "@";
break;
}
}

要从数据表中移动值,我使用嵌套循环:

//move header totals into the spreadsheet
for(int i = 1; i < NumColumns + 1; i++) {
xlWorkSheet.Cells[1, i].value = dt.Columns[i - 1].ColumnName;
}

//move in the data
DataView dv = new DataView(dt);
dv.Sort = "Date ASC";

int rowCount = 2;
string theValue;
try {
foreach(DataRowView dr in dv) {//(DataRow dr indt.Rows)
for(int i = 1; i < NumColumns + 1; i++) {
theValue = dr[i - 1].ToString();
xlWorkSheet.Cells[rowCount, i].value = theValue;
}
rowCount += 1;
}
} catch(Exception) {
throw;
}

在填充数据表时的存储过程中,我尝试使用 DATETIME 和以下内容明确拼出类型:

SELECT 
"Date" = CONVERT(DATE,b.[Date])
...

如何使我的日期数据如此明确,以致 Excel 不会误解并应用所有需要的格式?


编辑

嵌套循环的下一个(未经测试的)尝试如下:

int rowCount = 2;
string theValue;
DateTime dtm;
DateTime d;
try {
foreach(DataRowView dr in dv) {//(DataRow dr indt.Rows)
for(int i = 1; i < NumColumns + 1; i++) {
//theValue = dr[i - 1].ToString();
//xlWorkSheet.Cells[rowCount, i].value = theValue;
switch(dr[i - 1].GetType().ToString()) {
case "System.DateTime":
dtm = Convert.ToDateTime(dr[i - 1]);
xlWorkSheet.Cells[rowCount, i].value = dtm.ToOADate();
break;
case "System.Date":
d = Convert.ToDateTime(dr[i - 1]);
xlWorkSheet.Cells[rowCount, i].value = d.ToOADate();
break;
default:
theValue = dr[i - 1].ToString();
xlWorkSheet.Cells[rowCount, i].value = theValue;
break;
}

}
rowCount += 1;
}
} catch(Exception) {
throw;
}

最佳答案

这里的问题是您将所有内容都作为字符串写入 Excel,而 Excel 将按此方式存储它。在编辑并按 Enter 时,Excel 将重新解释单元格内容,然后可能会以不同方式存储它。

当您在 DateTime 上调用 ToString() 时,默认格式为 DD/MM/YY HH:mm:ss,这正是您在生成的文件中看到。

Excel 中的日期存储为表示自 1900 年以来经过的天数的数字。要获取此数字,您可以调用 ToOADate() 方法。

参见 http://msdn.microsoft.com/en-gb/library/system.datetime.tooadate.aspx

将数据集设置为 double 和适当的格式字符串,您应该会得到您希望的结果!

关于c# - 日期的 Excel Interop 单元格格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15603098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com