2016-05-20 19 views
0

インストール日付を取得し、datagridview列に日付の形式で保存できるアプリケーションがあります。datetimeを表示するExcelのセル日付形式

しかし、Excelファイルにエクスポートしようとしたときに、セルをフォーマットしようとしたときでも、一部のデータだけではなく日付の代わりにdatetimeが表示されます。

This is how the datagridview looks like

This is how the excel file looks like

エクスポートするためのコードを以下に示します。それは非常に愚かな質問ですが、私は本当にそれが悪いのかわからない場合はところで、私は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 

申し訳ありませんを使用しています。

ありがとうございます!

+0

すべての値をExcelに文字列として送信しています。時間コンポーネントと共に表示されるExcelエントリは、受信した文字列としてExcelに格納されます。それらは左揃えで、日付のみの項目は右揃えです。 '11/11/1111'は無効なExcel日付値なので、日付値に変換することはできません。 'mm/dd/yyyy'形式で解釈できる文字列はExcelで日付に変換されますが、' dd/mm/yyyy'形式で解釈されることを望みます。 – TnTinMn

+0

コメント文字の制限に達しました。あなたの最善の策は、DGV値をDateTime値に解析し、それをExcel Rangeに割り当てる 'Object'配列にロードすることです。 Interopが有効な日付を処理します。無効な日付は引き続き問題になります。 – TnTinMn

+0

@TnTinMn申し訳ありませんが、私は1時間前に作ったすべての答えを持っていましたが、気を散らして、今までそれを投稿しませんでした。私はあなたのコメントをコピーしませんでしたが、それはそのように見えるかもしれません。 – teylyn

答えて

0

Excelは、1900年1月1日より前の日付を認識せず、11/11/1111 12:00:00 AMのような値をテキストとして扱います。日付が右揃えで、テキストがスクリーンショットの左揃えにどのように表示されているかを確認します。

テキストは、値の日付のみを表示するために適用する数値書式の影響を受けません。

達成したいことに応じて、テキスト値を別々に扱うようにコードを調整する必要があります。それらを1/1/1900またはそのようなものに交換してください。

関連する問題