web-dev-qa-db-ja.com

Excelにデータを書き込むときに正しい日付形式を作成する方法

Iamは、Office相互運用機能を使用してDataTableをExcelファイルにエクスポートします。問題は、Excelが日付を日付として認識せず、代わりに数値を表示することです。別のケースでは、日付として認識する文字列を渡します。どちらの場合も、データは台無しになります。

セルをテキスト形式で保存するはずのNumberFormat @を試しましたが、どちらも機能しませんでした。

Application app = new Application();
app.Visible = false;
app.ScreenUpdating = false;
app.DisplayAlerts = false;
app.EnableAnimations = false;
app.EnableAutoComplete = false;
app.EnableSound = false;
app.EnableTipWizard = false;
app.ErrorCheckingOptions.BackgroundChecking = false; 

Workbook wb = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet ws = (Worksheet)wb.Worksheets[1];

for (int j = 0; j < dt.Rows.Count; j++)
{
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        Range rng = ws.Cells[j+2, i+1]as Range;
        rng.Value2 = dt.Rows[j][i].ToString();
        rng.NumberFormat = "@";
    }   
}           

wb.SaveAs(filename, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
       Missing.Value, XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

wb.Close(false, Missing.Value, Missing.Value);            

app.Workbooks.Close();
app.Application.Quit();
app.Quit();    
System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
ws = null;
wb = null;
app = null;
GC.Collect();

NumberFormat @が機能しないのはなぜですか? Textformatは、私が入力したものと同じものをすべて表示すべきではありませんか?

34
codymanix

列全体を日付列としてフォーマットしようとしましたか?このようなもの:

Range rg = (Excel.Range)worksheetobject.Cells[1,1];
rg.EntireColumn.NumberFormat = "MM/DD/YYYY";

もう1つ試すことができるのは、テキストをExcelセルに読み込む前に文字列式の前に単一のチェックを入れることです(それが重要かどうかはわかりませんが、セルにテキストを直接入力するときに機能します)。

35
dcp

使用してみてください

DateTime.ToOADate()

そして、それをセルにダブルで入れます。 Macシステム上のExcelで問題が発生する可能性があります(異なる日時を使用->二重変換)が、ほとんどの場合にうまく機能するはずです。

お役に立てれば。

10
Assaf

これは私のために働いた:

sheet.Cells[currentRow, ++currentColumn] = "'" + theDate.ToString("MM/dd/yy");

日付の前に追加された目盛りに注意してください。

2
Versatile

Excelセルの日付をコードでフォーマットするには、次を試してください。

Excel.Range rg = (Excel.Range)xlWorkSheet.Cells[numberRow, numberColumn];

rg.NumberFormat = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;

この後、DateTime値を特定のセルに設定できます

xlWorkSheet.Cells[numberRow, numberColumn] = myDate;

列全体を設定する場合は、Excel.Range rg =(Excel.Range)xlWorkSheet.Cells [numberRow、numberColumn];を試してください。

rg.EntireColumn.NumberFormat = 
    CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
2
daniele3004

私はこの質問が古いことを知っていますが、VSTO経由でExcell Cellsに日付を入力することにはいくつかの落とし穴があります。

式がyyyy-mmm-dd形式の日付では機能しないことがわかりました-たとえセルがDATE形式であったとしても!数式で使用するには、日付をdd/mm/yyyy形式に変換する必要があります。

たとえば、SQL Analysis Serverから戻ってきた日付を反転させてからフォーマットする必要がありました。

using (var dateRn = xlApp.Range["A1"].WithComCleanup())
{
    dateRn.Resource.Value2 = Convert.ToDateTime(dateRn.Resource.Value2).ToString("dd-MMM-yyyy");
}


using (var rn = xlApp.Range["A1:A10"].WithComCleanup())
{
    rn.Resource.Select();
    rn.Resource.NumberFormat =  "d-mmm-yyyy;@";
}

それ以外の場合、日付を使用した数式は機能しません。セルC4の数式はC3と同じです。

enter image description here

2
Jeremy Thompson

古い質問ですが、まだ関連しています。各地域に適切な日時形式を取得する辞書を生成しました。生成したヘルパークラスは次のとおりです。

https://github.com/anakic/ExcelDateTimeFormatHelper/blob/master/FormatHelper.cs

FWIWこれは私がそれについて行った方法です:

  1. excelを開き、ブックの最初のセルに日時を手動で入力しました
  2. コントロールパネルでリージョンダイアログを開きました
  3. spyを使用して領域のコンボボックスと適用ボタンのHWNDを見つけたので、SetForegroundWindowとSendKeyを使用して領域を変更できます(Windows APIを介して領域を変更する方法が見つかりませんでした)
  4. すべての地域を反復処理し、各地域でExcelに日付を含むセルのNumberFormatを要求し、このデータをファイルに保存しました
1
anakic

この助けを願っています

private bool isDate(Range cell)
    {
        if (cell.NumberFormat.ToString().Contains("/yy"))
        {
            return true;
        }
        return false;
    }

isDate(worksheet.Cells[irow, icol])
0
Vo Tran Hai Anh

これは私のために働いた:

hoja_trabajo.Cells[i + 2, j + 1] = fecha.ToString("dd-MMM-yyyy").Replace(".", "");
0