インストール日付を取得し、datagridview列に日付の形式で保存できるアプリケーションがあります。datetimeを表示するExcelのセル日付形式
しかし、Excelファイルにエクスポートしようとしたときに、セルをフォーマットしようとしたときでも、一部のデータだけではなく日付の代わりにdatetimeが表示されます。
エクスポートするためのコードを以下に示します。それは非常に愚かな質問ですが、私は本当にそれが悪いのかわからない場合はところで、私はvb.net
'reportFile : True = IE_Version_Report.xlsx False = Data.xlsx
Sub ExportData(reportFile)
Dim dSet As New DataSet
dSet.Tables.Add()
For i As Integer = 0 To DataGridView1.ColumnCount - 1
dSet.Tables(0).Columns.Add(DataGridView1.Columns(i).HeaderText)
Next
Dim dr As DataRow
For i As Integer = 0 To DataGridView1.RowCount - 1
dr = dSet.Tables(0).NewRow
For j As Integer = 0 To DataGridView1.Columns.Count - 1
dr(j) = DataGridView1.Rows(i).Cells(j).Value
Next
dSet.Tables(0).Rows.Add(dr)
Next
Dim Ex As Microsoft.Office.Interop.Excel.Application
Dim Wb As Microsoft.Office.Interop.Excel.Workbook
Dim Ws As Microsoft.Office.Interop.Excel.Worksheet
Dim misValue As Object = System.Reflection.Missing.Value
Ex = New Microsoft.Office.Interop.Excel.Application
Wb = Ex.Workbooks.Add(misValue)
Ws = Wb.Sheets("sheet1")
Dim dt As DataTable = dSet.Tables(0)
Dim col, row As Integer
Dim rawData(dt.Rows.Count, dt.Columns.Count - 1) As Object
For col = 0 To dt.Columns.Count - 1
rawData(0, col) = dt.Columns(col).ColumnName.ToUpper
Next
For col = 0 To dt.Columns.Count - 1
For row = 0 To dt.Rows.Count - 1
rawData(row + 1, col) = dt.Rows(row).ItemArray(col)
Next
Next
Dim finalColLetter As String = String.Empty
finalColLetter = ExcelColName(dt.Columns.Count)
Dim excelRange As String = String.Format("A1:{0}{1}", finalColLetter, dt.Rows.Count + 1)
Ws.Range(excelRange, Type.Missing).Value2 = rawData
Ws.Range("A1:L1").EntireColumn.AutoFit() 'columns in excel file will autofit according to the data
Dim num As Integer = DataGridView1.Rows.Count + 1
'set the format for dates in these few columns
Ws.Range("D2:D" & num).NumberFormat = "dd/mm/yyyy;@"
Ws.Range("F2:F" & num).NumberFormat = "dd/mm/yyyy;@"
Ws.Range("H2:H" & num).NumberFormat = "dd/mm/yyyy;@"
Ws.Range("J2:J" & num).NumberFormat = "dd/mm/yyyy;@"
Ws.Range("L2:L" & num).NumberFormat = "dd/mm/yyyy;@"
Ws = Nothing
If reportFile = True Then
fileExported = True
If System.IO.File.Exists(FolderPath & "\MSOffice_Report.xlsx") Then
System.IO.File.Delete(FolderPath & "\MSOffice_Report.xlsx")
End If
Wb.SaveAs(FolderPath & "\MSOffice_Report.xlsx")
Else
fileExported = False
If System.IO.File.Exists("C:\Install\MSData.xlsx") Then
System.IO.File.Delete("C:\Install\MSData.xlsx")
End If
Wb.SaveAs("C:\Install\MSData.xlsx")
SetAttr("C:\Install\MSData.xlsx", vbHidden)
End If
Wb.Close(True)
Wb = Nothing
Ex.Quit()
Ex = Nothing
GC.Collect()
End Sub
Public Function ExcelColName(ByVal Col As Integer) As String
If Col < 0 And Col > 256 Then
MsgBox("Invalid Argument", MsgBoxStyle.Critical)
Return Nothing
Exit Function
End If
Dim i As Int16
Dim r As Int16
Dim S As String
If Col <= 26 Then
S = Chr(Col + 64)
Else
r = Col Mod 26
i = System.Math.Floor(Col/26)
If r = 0 Then
r = 26
i = i - 1
End If
S = Chr(i + 64) & Chr(r + 64)
End If
ExcelColName = S
End Function
申し訳ありませんを使用しています。
ありがとうございます!
すべての値をExcelに文字列として送信しています。時間コンポーネントと共に表示されるExcelエントリは、受信した文字列としてExcelに格納されます。それらは左揃えで、日付のみの項目は右揃えです。 '11/11/1111'は無効なExcel日付値なので、日付値に変換することはできません。 'mm/dd/yyyy'形式で解釈できる文字列はExcelで日付に変換されますが、' dd/mm/yyyy'形式で解釈されることを望みます。 – TnTinMn
コメント文字の制限に達しました。あなたの最善の策は、DGV値をDateTime値に解析し、それをExcel Rangeに割り当てる 'Object'配列にロードすることです。 Interopが有効な日付を処理します。無効な日付は引き続き問題になります。 – TnTinMn
@TnTinMn申し訳ありませんが、私は1時間前に作ったすべての答えを持っていましたが、気を散らして、今までそれを投稿しませんでした。私はあなたのコメントをコピーしませんでしたが、それはそのように見えるかもしれません。 – teylyn