2017-02-22 14 views
0

Я написал экспорт в excel-функцию в свою программу, что также совпадает с программой импорта.Формат даты Изменение при экспорте в Excel

В программе импорта выполняется проверка проверки, но некоторые из них не работают, потому что лист Excel форматирует их как MM/dd/yyyy, однако большинство из них хранятся как dd/MM/yyyy.

После просмотра в моей программе экспорта, я вижу, что в сетке, перед экспортом, даты все правильно отформатированы как dd/MM/yyyy, поэтому проблема здесь отсутствует.

При открытии экспортированного файла Excel я вижу, что некоторые даты хранятся как MM/dd/yyyy.

Региональные настройки на моем компьютере правильные, установлены в Великобритании и даже после проверки формата Excel в столбце, я вижу, что он установлен на dd/MM/yyyy.

Итак, что это может произойти неправильно? Почему некоторые экспортируются по-разному?

значения, как видно в сетке (Правильный формат - см 2 верхних строк 'Rate One Start', 01/06/2016)

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 Я экспортировал (Обратите внимание на некоторые из дат дд/мм, в то время как некоторые из них ММ дд /)

enter image description here

+0

Обязательно укажите даты в виде даты в Excel. В настоящее время вы передаете их как строки, которые я думаю, и Excel OM говорит по-американски и, следовательно, ожидает порядка m/d/y при преобразовании в настоящие даты Excel. – jkpieterse

+0

@jkpieterse Как я могу пропустить их как даты? Странно, что некоторые из них находятся в правильном формате, но не все – David

+1

@David Не странно. VBA конвертируется в формате US (MDY). Даты, которые вы считаете правильным, действительно являются текстовыми строками с первыми двумя цифрами> 12. Другие были неверно преобразованы - посмотрите на первую строку - '1-jun-16' vs' 6-Jan-16' из-за того, что VBA конвертирует ваши данные в соответствии с настройками США. Не уверен насчет 'vb.net' date vs string. –

ответ

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 

Это означает, что если индекс текущего столбца, оцениваемого не одна из колонн, которая содержит дату, а затем экспортировать его как normal, но если это так, то преобразуйте его в дату, где формат совпадает с текущим форматом культуры для потока.

Это работало как сон.

+0

Обратите внимание, что если этот экспорт содержит много записей, он будет быстрее LOT, чтобы сначала заполнить вариантный массив всеми данными, а затем записать массив на рабочий лист в одной строке кода. – jkpieterse

Смежные вопросы