【发布时间】:2017-02-27 08:58:08
【问题描述】:
我目前正在尝试将一些数据从我的数据库导出到 Excel 文件。一切都很好,除了一列。
我的目标表中有两个日期字段(开始日期和结束日期),我想在 Excel 工作表中显示它们。问题是,结束日期正确显示(dd/mm/yyyy),而我的开始日期不是(mm/dd/yyyy)。它们的定义在数据库级别是完全一样的。
这是我构建 DataTable 的方式:
public System.Data.DataTable ExportLastChangesToExcel()
{
List<HD_DISCOUNTS> listDiscount = (from d in dbHosp.HD_DISCOUNTS where d.TO_EXTRACT == "N" orderby d.EXTRACT_TEXT descending select d).ToList();
System.Data.DataTable table = new System.Data.DataTable();
table.Columns.Add("Condition Type", typeof(string));
table.Columns.Add("Sales organisation", typeof(string));
table.Columns.Add("Distribution Channel", typeof(string));
table.Columns.Add("Customer", typeof(string));
table.Columns.Add("Customer Name", typeof(string));
table.Columns.Add("Material", typeof(string));
table.Columns.Add("Material name", typeof(string));
table.Columns.Add("Amount", typeof(string));
table.Columns.Add("Unit", typeof(string));
table.Columns.Add("C..", typeof(string));
table.Columns.Add("Valid From", typeof(string));
table.Columns.Add("Valid To", typeof(string));
table.Columns.Add("Valid Action", typeof(string));
var allCust = (from v in dbCust.CUSTOMER_MASTER where v.INCLUDE_INTO_HD == "Y" select v).ToList();
foreach (HD_DISCOUNTS disc in listDiscount)
{
string compareId = disc.ID_HOSP.ToString();
CUSTOMER_MASTER cust = (from h in allCust where h.SOLDTOPARTY.TrimStart('0') == compareId select h).FirstOrDefault();
DIM_PRODUCT prod = (from p in db.DIM_PRODUCT where p.P_KEY_AZ == disc.ID_PRODUCT select p).FirstOrDefault();
DIM_PRODUCT_SAP sap = (from s in db.DIM_PRODUCT_SAP where s.P_KEY_AZ == prod.P_KEY_AZ && s.P_TYPE_SAP == "Domestic" select s).FirstOrDefault();
table.Rows.Add("ZD22", "BE10", "1", cust.SOLDTOPARTY, cust.SOLDTOPARTY_DESC, sap.P_KEY_SAP.ToString(), prod.P_DESC_AZ, disc.DISCOUNT.ToString(), "%", "A", disc.START_DATE.Value.ToString("dd/MM/yyyy"), disc.END_DATE.Value.ToString("dd/MM/yyyy"), disc.EXTRACT_TEXT);
}
return table;
}
我已经调试过了,开始日期应该可以很好的显示出来。这是我用来构建 Excel 的代码:
protected void btnExport_Click(object sender, EventArgs e)
{
Microsoft.Office.Interop.Excel.Application excel;
Microsoft.Office.Interop.Excel.Workbook worKbooK;
Microsoft.Office.Interop.Excel.Worksheet worksheet;
Microsoft.Office.Interop.Excel.Range celLrangE;
try
{
excel = new Microsoft.Office.Interop.Excel.Application();
excel.Visible = false;
excel.DisplayAlerts = false;
worKbooK = excel.Workbooks.Add(Type.Missing);
worksheet = (Microsoft.Office.Interop.Excel.Worksheet)worKbooK.ActiveSheet;
worksheet.Name = "Sheet1";
System.Data.DataTable tab = ExportLastChangesToExcel();
Range excelRange = worksheet.get_Range("K1");
excelRange.NumberFormat = "dd/mm/yyyy;@";
int rowcount = 2;
foreach (DataRow datarow in tab.Rows)
{
rowcount += 1;
for (int i = 1; i <= tab.Columns.Count; i++)
{
if (rowcount == 3)
{
worksheet.Cells[1, i] = tab.Columns[i - 1].ColumnName;
worksheet.Cells.Font.Color = System.Drawing.Color.Black;
}
worksheet.Cells[rowcount-1, i] = datarow[i - 1].ToString();
//worksheet.Cells[i, 11].NumberFormat = "@";
if (rowcount > 3)
{
if (i == tab.Columns.Count)
{
if (rowcount % 2 == 0)
{
celLrangE = worksheet.Range[worksheet.Cells[rowcount, 1], worksheet.Cells[rowcount, tab.Columns.Count]];
}
}
}
}
}
celLrangE = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[rowcount, tab.Columns.Count]];
celLrangE.EntireColumn.AutoFit();
celLrangE = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[2, tab.Columns.Count]];
worKbooK.SaveAs("C:\\Temp\\Hospital Discount\\Genpact\\GenpactExtract.xlsx");
worKbooK.Close();
excel.Quit();
}
catch (Exception ex)
{
}
finally
{
worksheet = null;
celLrangE = null;
worKbooK = null;
lblResultMessage.Text = "Extract for Genpact has been successfully generated";
lblResultMessage.Visible = true;
}
由于列 K 是包含错误日期的列,因此我尝试格式化此列以正确格式化我的日期,但没有成功。
知道可能出了什么问题吗?
【问题讨论】:
-
使用像 EPPlus 这样的库来代替互操作。就像调用
sheet.LoadFromDataTable(someTable)一样简单,它会负责正确复制日期。日期和时间是 not 字符串。您可以使用互操作设置实际的 DateTime 值,或者您应该存储从DateTime.ToODate返回的原始双精度值 -
PS - 数据表列是错误的,它们是字符串而不是日期时间。如果您将数据库中的日期作为字符串加载,您已经有一个潜在的错误转换。如果将日期作为字符串存储在数据库中,情况会更糟。在任何情况下,您都必须使用适合存储文本格式的 CultureInfo 将字符串显式解析为
DateTime。不是个好主意 -
@PanagiotisKanavos 感谢您的评论。我实际上做了更改,因为即使使用 DateTime 类型我也遇到了问题。
-
您遇到了不同的问题。现在你有另一个问题。日期不是字符串,您不应该尝试将它们转换为字符串。另外,你确定你有问题吗?最有可能的是,Excel 正在使用您的语言环境来格式化日期。一些格式字符串是“使用等效的本地格式”的别名,即使它们看起来特定于区域设置。我认为
dd/MM/yyyy就是其中之一。打开工作表并尝试不同的日期格式 -
正如我所说,一列以正确的格式显示日期,而另一列正在切换月份和日期。所以我推测问题不是来自文化。