- PR -

POIを使用してEXCELから値を取得する方法

投稿者投稿内容
ステイ
会議室デビュー日: 2005/08/02
投稿数: 11
投稿日時: 2005-08-22 02:11
POIを使用してEXCELから値を取得しようと考えています。
値自体の数値・文字列・日付などを型ごとに
メソッドを換えて取得ができています。

ただ、書式が日付だとYYYY/MM/DDで取得されてしまいます。
Excelを開いたときに、YYYY/M/Dで表示されている状態で取得できません。
YYYY/MM/DDはYYYY/MM/DDのままで、
YYYY/M/DはYYYY/M/Dのままで、
Javaで取得したいので、ここでつまづいてます。
(ExcelファイルをExcelアプリで開いたときに画面に表示されている状態)

Excelにはどんな値が入ってくるかわかりませんし、
型(数値か文字列か日付か)もわかりませんし、
書式(YY年MM月DD日や整数・小数など)もわかりません。
Excelのセルに'を付ければ解決できそうですがExcelは変更できず、
Javaのプログラム内で解決しなければならない状況です。

どなたか、いい方法をご存知ありませんか?
POIのバージョンは2.5です。

以上、よろしくお願い申し上げます。


[ メッセージ編集済み 編集者: ステイ 編集日時 2005-08-22 10:48 ]
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2005-08-22 10:29
質問の意味がよく判らないのですが・・・
1. *.xlsファイルをPOIで読み込んだ際の(Javaの変数の)値
2. *.xlsファイルにPOIで書き込んだものをExcelで開いた時の表示
のどちらで悩まれているのでしょうか?
ステイ
会議室デビュー日: 2005/08/02
投稿数: 11
投稿日時: 2005-08-22 10:47
Desmoさん、レスありがとうございます。

説明の仕方が分かりづらくて申し訳ありません。
自分の文章の表現力を恥ずかしく思う限りです。

1. *.xlsファイルをPOIで読み込んだ際の(Javaの変数の)値

で、悩んでいます。
自分でも、試行錯誤していろいろ試しておりますが、
突破口が開けそうにありません。


もしご存知の方がいらっしゃったらご教授をお願いします。
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-08-22 11:23
こんにちは。

引用:

ステイさんの書き込み (2005-08-22 02:11) より:

ただ、書式が日付だとYYYY/MM/DDで取得されてしまいます。
Excelを開いたときに、YYYY/M/Dで表示されている状態で取得できません。
YYYY/MM/DDはYYYY/MM/DDのままで、
YYYY/M/DはYYYY/M/Dのままで、
Javaで取得したいので、ここでつまづいてます。
(ExcelファイルをExcelアプリで開いたときに画面に表示されている状態)




セルの値を読み込んだ結果が日付型データだった場合に
セルの書式設定で定義された値を反映させてStringオブジェクトを生成したい。
といった感じでしょうか。
現状YYYY/MM/DDの形で取得されてしまうとのことですが、日付型で値を取得する
際のコード内で"yyyy/MM/dd"を固定指定していたりはしませんか?

どのような方法にしろ、最終的にPOIでセルの書式定義を取得する方法があれば、
要件を満たすことが出来るかと思いますが、私が見る限りではソースに改修を
入れないと無理そうな感じでした。。
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2005-08-22 11:23
# 私はPOIは全然詳しくないので、以下そのつもりで見てください。

値をどう取るか?、ではなく、
セルの書式情報(Excelの「表示形式」)をどう取るか?、
の問題のような気がしますが。
その上で、その書式情報に合わせてJavaでフォーマッティングする、とか。

Excelで開いたときにセルで表示されている値をそのまま取得する、っていうのはアプローチとして無理がないですか?

# masaさんとかぶった・・・

[ メッセージ編集済み 編集者: Cluster 編集日時 2005-08-22 11:25 ]
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2005-08-22 12:28
ここで言うPOIって、POIのHSSFコンポーネントの事ですか?
私は HSSFしか使ったことが無いで、これ以外の場合ですと参考にならないかもしれません。
HSSFでは日付のセルのデータの取得時に
HSSFCellクラスのgetDateCellValue()メソッドを使用します。
これは Date型を返すので、あとはこれをどう使う(表示する)かだと思います。
Java上で好みの書式に変換してやれば良いと思います。

> Excelにはどんな値が入ってくるかわかりませんし、
> 型(数値か文字列か日付か)もわかりませんし、

getCellType()メソッドで、数値か文字列かの区別はつきます。(但し日付は数値とみなされるようです)

> YYYY/MM/DDはYYYY/MM/DDのままで、
> YYYY/M/DはYYYY/M/Dのままで、
> Javaで取得したいので、

繰り返しになりますが取得はあくまでもDate型で行い、あとは表示の問題になるとおもいます。Excelと同じ表示にしたいのであれば、セルの書式を取得する必要があると思いますが、そういうメソッドがあったかどうか・・・?
(POIのAPIは結構充実しているので、それくらいある気がしますが確認していません)
ただ単に値を取得するよりも高度なプログラムになることは間違いないと思います。
ステイ
会議室デビュー日: 2005/08/02
投稿数: 11
投稿日時: 2005-08-22 13:03
masaさん、Clusterさん、Desmoさん、返信ありがとうございます。

引用:

Masaさんの書き込み より

セルの値を読み込んだ結果が日付型データだった場合に
セルの書式設定で定義された値を反映させてStringオブジェクトを生成したい。
といった感じでしょうか。

"yyyy/MM/dd"を固定指定していたりはしませんか?



そうです。まさしく、おっしゃるとおりの事を実践したいと考えております。
固定指定はしてないのですが、デフォルトでそういう書式になってしまうのかもしれないので、
見落としている部分があるかもしれません、もう一度、現ソースを見直します。


引用:

Clusterさんの書き込み より

値をどう取るか?、ではなく、
セルの書式情報(Excelの「表示形式」)をどう取るか?、
の問題のような気がしますが。

Excelで開いたときにセルで表示されている値をそのまま取得する、っていうのはアプローチとして無理がないですか?



まだJavaを始めて数週間で、以前にVBやExcel-VBAを使ったことがありまして、
同じようなことができるかと考えておりましたが、さすがにそうは簡単にいかないようですね。

僕も正直、一筋縄にはいかなそうな気が一週間くらい前から感じておりまして、
実はしばらく保留中にして棚上げしていた問題なのです。
ただユーザのことを考えると、この問題はなかなか妥協できない点ですので、
もう少しねばってみます。

引用:

Desmoさんの書き込み より

ここで言うPOIって、POIのHSSFコンポーネントの事ですか?

繰り返しになりますが取得はあくまでもDate型で行い、あとは表示の問題になるとおもいます。Excelと同じ表示にしたいのであれば、セルの書式を取得する必要があると思いますが、そういうメソッドがあったかどうか・・・?
(POIのAPIは結構充実しているので、それくらいある気がしますが確認していません)
ただ単に値を取得するよりも高度なプログラムになることは間違いないと思います。



そうです。HSSFコンポーネントのことです。
ただ単に値を取得するよりも、易しくはなさそうですが、
書式をとってくるところから考えはじめたいと思います。


皆様、思い出されたりしたことなどありましたら、引き続きご教授くださいませ。
以上、よろしくお願いいたします。


[ メッセージ編集済み 編集者: ステイ 編集日時 2005-08-22 13:05 ]
いっきゅう
大ベテラン
会議室デビュー日: 2004/04/04
投稿数: 153
お住まい・勤務地: 兵庫
投稿日時: 2005-08-22 13:37
HSSFCellからHSSFCellStyleを取得してHSSFDataFormatを取り出すことができます。
http://jakarta.apache.org/poi/apidocs/org/apache/poi/hssf/usermodel/HSSFDataFormat.html

APIを見ていけばどのメソッドかはお分かりになると思います。

ステイさんが要望しているところは
実際やるとshort型でどのタイプか取り出し、それを文字列に変換するのですが
POIではデフォルトに定義している分しか文字列に変換できないようです。
(Javadoc参照のこと)

とすると
YYYY/M/DやYYYY/MM/DDといった文字列は取り出せないので
POIでは難しいのではないでしょうか?

jcomやjacob?だったかなこのライブラリでActiveX経由のエクセル操作ならできそうで
環境は限定されますがこちらなら実現できるんでは、、

スキルアップ/キャリアアップ(JOB@IT)