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))
参照:
この
は、このコードの結果に影響を与える可能性があります。
ここでExcel形式についての情報を得ることができます。http://vb.net-informations.com/excel-2007/vb.net_excel_page_format.htm – David
@David Excelの1列には、次の形式があります。[h]: mm:ssは時間が時計の時を超えている可能性があることを意味します。つまり、例えば783:34:12が存在する可能性があります。私は、例えば:NumberFormat = "@"などの書式を使用しようとしたとき、私はいつも間違った結果を得ました。後で私は本当に時間が本当にその列のセルの.Textを取得することですが、そのセルから正しい値を取得する唯一の方法を実現しました。したがって、私は.Value2ではなくカラムの1つに.Textを使用するように頼みます。私のポイントを得ることを願っています。 – dev