【问题标题】:From DataBase to Excel : date format issue从数据库到 Excel:日期格式问题
【发布时间】: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 就是其中之一。打开工作表并尝试不同的日期格式
  • 正如我所说,一列以正确的格式显示日期,而另一列正在切换月份和日期。所以我推测问题不是来自文化。

标签: c# excel oracle date


【解决方案1】:

我认为问题是您给 Excel 留下了太多东西,需要明确说明输入和呈现数据的方式。

我的建议:

  1. 从数据库中读取数据作为日期,而不是字符串
  2. 将其作为日期输入 Excel,因为 Excel 会解释日期
  3. 按照您希望的方式设置单元格格式

例子:

Excel.Range r = worksheet.Cells[rowcount - 1, i];

if (datarow[i - 1] is DateTime)
{
    r.Value2 = ((DateTime)(datarow[i - 1])).ToOADate();
    r.NumberFormat = "dd/MM/yyyy";
}
else
{
    r.Value2 = datarow[i - 1]
}

请记住,您可以一起跳过数据表,只需使用 OracleDataReader 读取数据,然后将其直接放入 Excel。

此外,如果您有 ODBC 连接,您可以让 Excel 直接从 Oracle 读取它并将其放入表中——如果您这样做,它甚至可以正确处理日期。顺便说一句,您仍然可以从 C# 中执行此操作,只需几行代码,然后让 Excel 完成繁重的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-08
    • 2021-12-23
    • 2016-08-03
    • 2011-12-12
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多