Excel 导出日期格式出错,但仅适用于某些日期值

Posted

技术标签:

【中文标题】Excel 导出日期格式出错,但仅适用于某些日期值【英文标题】:Excel export date formatting goes wrong, but only for some date values 【发布时间】:2016-11-29 11:19:39 【问题描述】:

当我使用 vb.net 从 access 导出到 excel 时,我正在将我的日期时间值格式化为日期。

我有以下代码

Dim formatRange As Excel.Range

formatRange = xlWorksheet.Range("C1", "C9999")
formatRange.NumberFormat = "dd/MM/yyyy"

formatRange = xlWorksheet.Range("D1", "D9999")
formatRange.NumberFormat = "dd/MM/yyyy"

这适用于我数据库中的大多数日期,但是,其中一些仍然显示时间部分为 00:00:00,我认为当日期高于 20 时..

为什么会这样,我该如何解决?

编辑

我的完整代码是:

Dim sPath As String = sDt.Rows(0).Item("excelPath")
Dim i, j As Integer

Dim xlapp As Excel.Application
Dim xlWorkbook As Excel.Workbook
Dim xlWorksheet As Excel.Worksheet
Dim misvalue As Object = Reflection.Missing.Value

xlapp = New Excel.Application
xlWorkbook = xlapp.Workbooks.Add(misvalue)
xlWorksheet = xlWorkbook.Sheets.Add
xlWorksheet.Name = "CommissionInformation"

Dim formatRange As Excel.Range

formatRange = xlWorksheet.Range("C1", "C9999")
formatRange.NumberFormat = "dd/MM/yyyy"

formatRange = xlWorksheet.Range("D1", "D9999")
formatRange.NumberFormat = "dd/MM/yyyy"

For k As Integer = 1 To dgvExport.Columns.Count
     xlWorksheet.Cells(1, k) = dgvExport.Columns(k - 1).HeaderText
Next

For i = 0 To dgvExport.RowCount - 1
  For j = 0 To dgvExport.ColumnCount - 1
       xlWorksheet.Cells(i + 2, j + 1) = dgvExport(j, i).Value.ToString
  Next
Next

xlWorksheet.Columns.AutoFit()

【问题讨论】:

日期应该几乎总是被格式化为年/月/日,所以 yyyy/MM/dd @Fionnuala 即使是英国约会? 听起来您不是按原样导出日期值,而是表示值的字符串。 @Gustav 在我的数据库中,它们保存为 DateTime(然后显示在 DataGridView 中,从中获取和导出数据 是的,但你的密码可能会困住你。 【参考方案1】:

正如猜测的那样,您导出文本:

   xlWorksheet.Cells(i + 2, j + 1) = dgvExport(j, i).Value.ToString

这将在日期值的文本表达式中强制使用默认日期格式。

日期值没有格式。所以插入值:

   xlWorksheet.Cells(i + 2, j + 1) = dgvExport(j, i).Value

【讨论】:

【参考方案2】:

虽然按照另一个答案中的建议,将 .Value 从 DataGridView 单元格中简单地推送到 Excel 单元格中可能很诱人......

xlWorksheet.Cells(i + 2, j + 1) = dgvExport(j, i).Value

...这种方法适用于当前日期,它也将

    为 1900 年 3 月 1 日之前的日期引入一个错误,并且 1899-12-30 之前的日期完全失败。

更安全的方法是继续使用.ToString,但强制它是明确的 yyyy-mm-dd 日期:

xlWorksheet.Cells(i + 2, j + 1) = Convert.ToDateTime(dgvExport(j, i).Value).ToString("yyyy-MM-dd")

这将确保将正确的日期 value 插入 Excel 单元格,而生成的日期 format 将通过 Excel 中的显式单元格格式或由在 Windows 控制面板的区域设置中指定的默认格式。

【讨论】:

嗨,戈德,这个信息很有用,如果前面的答案没有解决问题,那么我会使用这个方法,但是这个系统永远不会遇到 2016 年之前的日期,所以这个问题不会出现。但是,如果在其他程序中可能出现这种情况,那么我当然会考虑这个

以上是关于Excel 导出日期格式出错,但仅适用于某些日期值的主要内容,如果未能解决你的问题,请参考以下文章

3 个最新值,但仅适用于特定用户

java 数据库增加日期字段后无法导出Excel

使用Aspose.Cells导出Excel遇到的日期格式问题

为啥java导出excel 日期格式不显示时分秒

为啥将数据导出到 Excel 时日期格式会发生变化?

hutool导出excel 设置单元格日期格式 poi设置excel单元格日期格式