5

私のプログラムはExcelで出力を作成します。

一部の日付は誤って解釈されているようです。 ここに画像の説明を入力してください

ファイルを開くと、スクリーンショットのように日付が混在しています。
実際にカーソルをExcelの計算ボックス(スクリーン印刷内)に置いてEnterキーを押すと、セルの書式が正しい書式に戻ります。

ソリューションに保存されているテンプレートにMicrosoft.Office.Interop.Excelデータを移動するために使用しています。DatatableExcel

switchデータをセルに入れる前に、 :を使用して各列の数値形式を適宜変更します。

for(int i = 1; i < NumColumns + 1; i++) {
    switch(dt.Columns[i-1].DataType.ToString()) {
        case "System.Int32":
            xlWorkSheet.Columns[i].NumberFormat = "#,##0_ ;[Red]-#,##0 ";
            break;
        case "System.String":
            xlWorkSheet.Columns[i].NumberFormat = "@";
            break;
        case "System.DateTime":
            xlWorkSheet.Columns[i].NumberFormat = "[$-809]dd mmmm yyyy;@"; //"dd-mmm-yy";
            break;
        case "System.Date":
            xlWorkSheet.Columns[i].NumberFormat = "[$-809]dd mmmm yyyy;@"; //"dd-mmm-yy";
            break;
        default:
            xlWorkSheet.Columns[i].NumberFormat = "@";
            break;
    }
}

データテーブルから値を移動するには、ネストされたループを使用します。

//move header totals into the spreadsheet
for(int i = 1; i < NumColumns + 1; i++) {
    xlWorkSheet.Cells[1, i].value = dt.Columns[i - 1].ColumnName;
}

//move in the data
DataView dv = new DataView(dt);
dv.Sort = "Date ASC";

int rowCount = 2;
string theValue;
try {
    foreach(DataRowView dr in dv) {//(DataRow dr indt.Rows)
        for(int i = 1; i < NumColumns + 1; i++) {
            theValue = dr[i - 1].ToString();
            xlWorkSheet.Cells[rowCount, i].value = theValue;
        }
        rowCount += 1;
    }
} catch(Exception) {
    throw;
}

Datatableにデータを入力するときのストアドプロシージャDATETIMEで、以下を使用してタイプを明示的にスペルアウトしようとしました。

SELECT 
"Date" = CONVERT(DATE,b.[Date])
    ...

Excelが誤って解釈できず、必要なすべての書式が適用されるように、日付データを明示的にするにはどうすればよいですか?


編集

ネストされたループでの次の(テストされていない)試行は次のとおりです。

int rowCount = 2;
string theValue;
DateTime dtm;
DateTime d;
try {
    foreach(DataRowView dr in dv) {//(DataRow dr indt.Rows)
        for(int i = 1; i < NumColumns + 1; i++) {
            //theValue = dr[i - 1].ToString();
            //xlWorkSheet.Cells[rowCount, i].value = theValue;
            switch(dr[i - 1].GetType().ToString()) {
                case "System.DateTime":
                    dtm = Convert.ToDateTime(dr[i - 1]);
                    xlWorkSheet.Cells[rowCount, i].value = dtm.ToOADate();
                    break;
                case "System.Date":
                    d = Convert.ToDateTime(dr[i - 1]);
                    xlWorkSheet.Cells[rowCount, i].value = d.ToOADate();
                    break;
                default:
                    theValue = dr[i - 1].ToString();
                    xlWorkSheet.Cells[rowCount, i].value = theValue;
                    break;
            }

        }
        rowCount += 1;
    }
} catch(Exception) {
    throw;
}
4

2 に答える 2

5

ここでの問題は、すべてを文字列としてExcelに書き込んでいることであり、Excelはそれをそのように保存します。編集してEnterキーを押すと、Excelはセルの内容を再解釈し、別の方法で保存する場合があります。

を呼び出すToString()DateTime、デフォルトのフォーマットはDD / MM / YY HH:mm:ssの形式になります。これは、結果のファイルに表示されているものとまったく同じです。

Excelの日付は、1900年から経過した日数を表す数値として保存されます。この数値を取得するには、ToOADate()メソッドを呼び出すことができます。

http://msdn.microsoft.com/en-gb/library/system.datetime.tooadate.aspxを参照してください

データセットをdouble適切なフォーマット文字列として使用すると、期待する結果が得られるはずです。

于 2013-03-24T21:12:36.533 に答える
-3

(文字列に)を(フォーマットされた値)に置き換えるだけです

于 2017-11-12T13:01:12.150 に答える