1

私はOffice2003ドキュメント(.xls)を使用してVS2008.NET3.5に取り組んでいます。Microsoft.Office.Interop.Excelを使用してドキュメントにアクセスしています。

これは私の目的には問題なく機能しますが、日付を取得しようとすると失敗します。

私が使用している方法が最も一般的です:

object date= xlWorkSheet.get_Range("E" + i, "E" + i).Value2;
double doubleDate = double.Parse(date);
DateTime finallyDate = DateTime.FromOADate(doubleDate);

私が保存した日付は1961年1月12日です(イタリア語では最初の12月を意味し、Excelを開くと1961年12月1日と表示されます)。

アプリを実行すると、doubleの値が15011.0になり、finallyDateの値が1941年2月4日になると正しくありません。

どうすればこの問題を解決できますか?その15011番号を(手動でも)変換する方法はありますか?

ありがとうございました!!

4

2 に答える 2

3

Value2の代わりにValueプロパティを取得すると、Dateオブジェクトを操作できるようになります。(DateTime)としてキャストする必要があるかもしれません。

Value2で代わりに得られるのは、Dateの浮動小数点値です。

たとえば、以下のスプレッドシートを確認してください。A1には日付が含まれています。

スプレッドシート

次に、Excelで、Microsoft.Office.Interop.Excelへの参照を追加し、次のようにValueプロパティとValue2プロパティを取得します。

var excel = new Excel.Application();

var workbook = excel.Workbooks.Open(@"C:\Test\Test.xlsx");
var worksheet = (Excel.Worksheet)workbook.Sheets[1];

Excel.Range range = worksheet.get_Range("A1");

var rangeAsValue = range.Value;
var rangeAsValue2 = range.Value2;

Console.WriteLine(rangeAsValue);
Console.WriteLine(rangeAsValue2);

Console.ReadLine();

私はこの出力を取得します:

出力

興味深いことに、これを.Net 4.5アプリケーションで試してみると、それでも機能しますが、タイプはとのvar動的として解決され、インテリセンスが失われます。rangeAsValuerangeAsValue2

于 2012-08-29T18:00:04.550 に答える
0

あなたの質問の最初の部分に、どうすればこの問題を解決できますか?

確認してください

  1. ドキュメントが保存されます。
  2. 正しいセルにアクセスしています。

質問の2番目の部分に、その15011番号を(手動でも)変換する方法はありますか?

15011は、実際には1-1〜1900の日数です。私は通常、大まかな日付を取得するために、言及された数を365で割るだけです。あなたはなぜラフなのかと尋ねるでしょう?何年かが366日になると、うるう年を考慮する必要があるからです。

シリアル番号を使用して日付を正確に計算する必要がある場合は、ここにある方法を使用することをお勧めします。http://naspinski.net/post/Translate-an-Excel-Serial-Date-into-aC-DateTime.aspx

public DateTime ExcelSerialDateToDT(int nSerialDate)
 {
 int l = nSerialDate + 68569 + 2415019;
 int n = ((4 * l) / 146097);
 l = l - ((146097 * n + 3) / 4);
 int i = ((4000 * (l + 1)) / 1461001);
 l = l - ((1461 * i) / 4) + 31;
 int j = ((80 * l) / 2447);
 int nDay = l - ((2447 * j) / 80);
 l = (j / 11);
 int nMonth = j + 2 - (12 * l);
 int nYear = 100 * (n - 49) + i + l;

return DateTime.Parse(nMonth + "/" + nDay + "/" + nYear);
 } 

Microsoft Office Excelでこの動作が発生する理由について詳しくは、 http://www.codeproject.com/Articles/2750/Excel-serial-date-to-Day-Month-Year-and-vise-versaをご覧ください。

于 2012-08-29T17:37:53.513 に答える