导出到Excel

时间:2017-02-22 11:31:58

标签: excel vb.net date

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

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

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

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

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

那么,那可能出现什么问题?为什么有些出口不同?

网格中显示的值(正确格式 - 请参见前2行'Rate One Start',2016年6月1日)

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

1 个答案:

答案 0 :(得分:4)

正如@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

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

这就像一场梦一样。