2017-02-22 106 views
0

我已经在我的程序中写入了一个导出到excel函数,该函数也与导入程序一致。日期格式在导出到Excel时更改

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

查看我的导出程序后,我可以看到在导出之前,网格中的日期都格式正确为dd/MM/yyyy,所以问题不在这里。

打开导出的Excel文件时,可以看到一些日期存储为MM/dd/yyyy,但是。

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

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

为网格中看到的值(正确的格式 - 参见上面两行“率的一个开始”,2016年1月6日)

enter image description here

代码在出口常规

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文件我出口(注意一些日期被DD/MM,而有些是MM/DD)

enter image description here

+0

确保将日期作为日期数据类型传递给Excel。目前,您将它们作为字符串传递给我,并且Excel OM会说美式语言,因此希望在转换为真正的Excel日期时使用m/d/y顺序。 – jkpieterse

+0

@jkpieterse我怎么会把它们作为日期传递?这很奇怪,有些是在正确的格式,但不是全部 – David

+1

@大卫不奇怪。 VBA正在使用美国(MDY)格式进行转换。您认为*的日期正确的是前两位数字大于12的文本字符串。其他人已被错误地转换 - 看第一行 - 由于VBA根据美国设置转换您的数据,“1-jun-16”与“6-Jan-16”。不确定'vb.net'日期与字符串。 –

回答

1

正如@jkpieterse所建议的那样,我只需要将日期值作为实际日期数据类型传递。为此,我修改了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 

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

这工作就像一个梦。

+0

请注意,如果此导出包含许多记录,它将证明首先使用所有数据填充变量数组,然后将数组写入工作表的一行代码中的LOT更快。 – jkpieterse