2017-04-03 2 views
0

Excel interopでExcelオートメーションを使用します。私のコードは配列フェッチを使用してExcelシートを取ります。あなたが下で見ることができるように、私はそれらをすべて.Value2として取る。しかし、例えば、私のExcelの列の1つを.Textとすることを指定したいと思う。それを達成する方法?配列を使用して.Text、.Value、.Value2のいずれかを宣言してデータをExcelから取得する

'Convert from interop object to native vb.net object, indexed 1 to length 
Dim data As Object(,) = DirectCast(_xlWorkSheet.UsedRange.Value2, Object(,)) 

For row As Integer = 2 To data.GetUpperBound(0) - 1 
    Dim newDataRow As DataRow = dt.NewRow() 

    Dim dattime As DateTime = DateTime.FromOADate(data(row, 11)) 
Next 
+0

ここでExcel形式についての情報を得ることができます。http://vb.net-informations.com/excel-2007/vb.net_excel_page_format.htm – David

+0

@David Excelの1列には、次の形式があります。[h]: mm:ssは時間が時計の時を超えている可能性があることを意味します。つまり、例えば783:34:12が存在する可能性があります。私は、例えば:NumberFormat = "@"などの書式を使用しようとしたとき、私はいつも間違った結果を得ました。後で私は本当に時間が本当にその列のセルの.Textを取得することですが、そのセルから正しい値を取得する唯一の方法を実現しました。したがって、私は.Value2ではなくカラムの1つに.Textを使用するように頼みます。私のポイントを得ることを願っています。 – dev

答えて

0

iはフォーマットを有するExcelでの列を有する:[H]:MM:34:12:ssはそう例えば783が存在し得る手段時間クロック時間を超える可能性を意味します。私は、例えば:NumberFormat = "@"などの書式を使用しようとしたとき、私はいつも間違った結果を得ました。

この説明に基づいて、Excelに数値Doubleとして値が入力されたものとします。すなわち783:34:13は32.64875に等しい。

VB.Netでは、結果の日、時間、分、秒のコンポーネントを生成するためにTimeSpan構造を生成できます。以下において、rngは、単一セルを表すExcel.Rangeである。

Dim s As String = String.Format("{0}:{1:00}:{2:00}", (ts.Days * 24) + ts.Hours, ts.Minutes, ts.Seconds) 

私はTextを得る上で、この手法を推奨しています理由:Excelで表示されたものと同様の文字列としてTimeSpanの書式を設定したい場合

Dim val As Double = CDbl(rng.Value2) 
Dim ts As TimeSpan = DateTime.FromOADate(val) - DateTime.FromOADate(0) 

さて、あなたはこのような何かを行うことができますExcel.Rangeのプロパティでは、Textプロパティは、列が書式設定された値を表示するのに十分な幅でないときに役立つ "###"など、Excelで表示される内容を正確に返します。


編集コメントに対処するために:あなたはこれを行う理由

はあなたが説明することができます: - DateTime.FromOADate(0)?

Excelは、ゼロの値を持つ指定された日付時刻からの24時間(日)の10進数として日付/時刻値をエンコードします。あなたのデータは明らかにこの事実を利用して、小数点として783:34:12(783時間、34分、12秒)または32.64875の値を持つセルを持つことができます。

元の値が表す(日、時間、分、秒)オフセットを取得するには、その基底値(ゼロ)で表される日時を減算する必要があります。 0時04分06秒(その1秒のdiffrence理由:私はこれを取得あなたの関数の後にExcelで:::午後12時04分07秒(12時04分07秒AM実際の値が背後にある)

私は不一致などを見ましたそれはありますか?

私はこの問題を再現することはできません。これは、浮動小数点値の表現があまりにも限界によりそう丸め問題です。


また、Excelは二つの異なる日基準をサポートすることをお勧めしますシステム; 1900日付システム(デフォルト)と1904日付システム。DateTime.FromOADate関数は、1900年の日付システムに基づいて変換を行います。これらの2つのシステムの違いは、ゼロとして扱われる日付です。WorkBook.Date1904プロパティをチェックして、.Net DateTimeに変換するときにExcelから取得した値に追加日(1462日)を追加する必要があるかどうかを確認する必要があります。詳細については、Differences between the 1900 and the 1904 date system in Excel

Dim dattime As DateTime = DateTime.FromOADate(data(row, 11)) 

参照:

この

は、このコードの結果に影響を与える可能性があります。

+0

私はそれをテストした素晴らしいですが、1つの値のために私はミスマッチを見た:例えば、エクセル:0:04:07(実際の値は遅れています:12:04:07 AM)関数の後にこれを得る:0:04:06なぜなら、他のすべての15の例はOKだったからです。 – dev

+0

と、なぜこれを行うのか説明できますか? - DateTime.FromOADate(0)? – dev

+0

@dev、私はあなたのコメントに対処するための情報を追加しました – TnTinMn

関連する問題