导出到Excel时更改date格式

我已经在我的程序中编写了一个导出到excel的函数,这与导入程序一致。

导入程序正在运行一些validation检查,但其中一些validation检查失败,因为Excel工作表正在将它们格式化为MM / dd / yyyy,但其中大多数都以dd / MM / yyyy格式存储。

查看我的导出程序后,我可以看到,在导出之前,date都格式化为dd / MM / yyyy,所以问题不在这里。

打开导出的Excel文件时,可以看到有些date存储为MM / dd / yyyy。

在我的电脑上的区域设置是正确的,设置为英国,甚至在检查列的Excel格式后,我可以看到它设置为dd / MM / yyyy。

那么,有什么可能会出错? 为什么有些导出不同?

在网格中看到的值(正确的格式 – 请参阅顶部2行'率先开始',01/06/2016)

在这里输入图像说明

代码在导出例程中

Dim formatRange As Excel.Range formatRange = xlWorksheet.Range("F2", "F99000") formatRange.NumberFormat = "dd/MM/yyyy" formatRange = xlWorksheet.Range("I1", "I99000") formatRange.NumberFormat = "dd/MM/yyyy" formatRange = xlWorksheet.Range("J1", "J99000") formatRange.NumberFormat = "dd/MM/yyyy" formatRange = xlWorksheet.Range("M1", "M99000") formatRange.NumberFormat = "dd/MM/yyyy" formatRange = xlWorksheet.Range("N1", "N99000") formatRange.NumberFormat = "dd/MM/yyyy" formatRange = xlWorksheet.Range("Q1", "Q99000") formatRange.NumberFormat = "dd/MM/yyyy" For k As Integer = 1 To dgvExport.Columns.Count xlWorksheet.Cells(1, k) = dgvExport.Columns(k - 1).HeaderText Next Dim eStr As String = "" Dim nStr As String = "" Me.Cursor = Cursors.WaitCursor For i = 0 To dgvExport.RowCount - 1 For j = 0 To dgvExport.ColumnCount - 1 Try eStr = Trim(dgvExport(j, i).Value) nStr = eStr.Replace(vbCr, "").Replace(vbLf, "") xlWorksheet.Cells(i + 2, j + 1) = nStr Catch xlWorksheet.Cells(i + 2, j + 1) = dgvExport(j, i).Value End Try Next Next 

我输出的Excel文件(注意一些date是dd / MM,而有些是MM / dd)

在这里输入图像说明

正如@jkpieterse所build议的,我只需要将date值作为实际date数据types传递。 为此,我修改了For Each循环。

原版的:

 For i = 0 To dgvExport.RowCount - 1 For j = 0 To dgvExport.ColumnCount - 1 Try eStr = Trim(dgvExport(j, i).Value) nStr = eStr.Replace(vbCr, "").Replace(vbLf, "") xlWorksheet.Cells(i + 2, j + 1) = nStr Catch xlWorksheet.Cells(i + 2, j + 1) = dgvExport(j, i).Value End Try Next Next 

工作版本:

 For i = 0 To dgvExport.RowCount - 1 For j = 0 To dgvExport.ColumnCount - 1 Try If j <> 5 AndAlso j <> 8 AndAlso j <> 9 AndAlso j <> 12 AndAlso j <> 13 AndAlso j <> 16 Then eStr = Trim(dgvExport(j, i).Value) nStr = eStr.Replace(vbCr, "").Replace(vbLf, "") xlWorksheet.Cells(i + 2, j + 1) = nStr Else xlWorksheet.Cells(i + 2, j + 1) = Convert.ToDateTime(dgvExport(j, i).Value).GetDateTimeFormats(Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat) End If Catch xlWorksheet.Cells(i + 2, j + 1) = dgvExport(j, i).Value End Try Next Next 

这意味着,如果当前正在评估的列的索引不是包含date的列之一,则将其正常导出,但如果是,则将其转换为date时间,其格式与线程的当前文化格式。

这已经像梦一样工作了。