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は、私が入力したものと同じものをすべて表示すべきではありませんか?
列全体を日付列としてフォーマットしようとしましたか?このようなもの:
Range rg = (Excel.Range)worksheetobject.Cells[1,1];
rg.EntireColumn.NumberFormat = "MM/DD/YYYY";
もう1つ試すことができるのは、テキストをExcelセルに読み込む前に文字列式の前に単一のチェックを入れることです(それが重要かどうかはわかりませんが、セルにテキストを直接入力するときに機能します)。
使用してみてください
DateTime.ToOADate()
そして、それをセルにダブルで入れます。 Macシステム上のExcelで問題が発生する可能性があります(異なる日時を使用->二重変換)が、ほとんどの場合にうまく機能するはずです。
お役に立てれば。
これは私のために働いた:
sheet.Cells[currentRow, ++currentColumn] = "'" + theDate.ToString("MM/dd/yy");
日付の前に追加された目盛りに注意してください。
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;
私はこの質問が古いことを知っていますが、VSTO経由でExcell Cellsに日付を入力することにはいくつかの落とし穴があります。
列全体のフォーマットは[〜#〜] not [〜#〜]でした。
マイクロソフトのこのアプローチでさえうまくいきませんでした: http://msdn.Microsoft.com/en-us/library/Microsoft.office.tools.Excel.namedrange.numberformat.aspx
式が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と同じです。
古い質問ですが、まだ関連しています。各地域に適切な日時形式を取得する辞書を生成しました。生成したヘルパークラスは次のとおりです。
https://github.com/anakic/ExcelDateTimeFormatHelper/blob/master/FormatHelper.cs
FWIWこれは私がそれについて行った方法です:
この助けを願っています
private bool isDate(Range cell)
{
if (cell.NumberFormat.ToString().Contains("/yy"))
{
return true;
}
return false;
}
isDate(worksheet.Cells[irow, icol])
これは私のために働いた:
hoja_trabajo.Cells[i + 2, j + 1] = fecha.ToString("dd-MMM-yyyy").Replace(".", "");