- PR -

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

投稿者投稿内容
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-08-22 13:52
こんにちは。

引用:

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

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




私が先ほど調べた内容をメモしておきます。
ご参考までに。

書式情報はHSSFCellStyle.getDataFormat()と結びついている。
ただし、ここで返される値はshort値。
このshort値はHSSFWorkBook-WorkBook-formats-FormatRecord
インスタンスのfield_1_index_codeと結びついているようだ。
FormatRecordとして登録されているレコードならば、
HSSFDataFormat format = book.createDataFormat();
format.getFormat(style.getDataFormat());
のようなコードで値を取得出来る。

ただし、FormatRecordはユーザ定義として新規に書式が登録さ
れた場合などにしか作成されず、(完全な条件は未確認)エク
セルが元々持つ"平成9年3月4日"などの書式は、ファイルでは
なくアプリケーションが持つ情報のようだ。
従ってコード内で取得することは出来なそうな気がしたが、POI
ではそのようなデフォルトの書式情報をHSSFDataFormat内で固定
値として管理しているっぽい。
デフォルト値はここから取得出来るのかー。と思ったら、英語版
の内容がそのままハードコードされている。

この中身を日本語版のエクセルアプリが持つ書式情報とマッチす
るよう書き換えてあげれば、うまく動作させることが出来そう。
ただし、「日本語版のエクセルアプリが持つ書式情報」と対応す
るshort値を何に設定してあげればいいのか分からないので×。

YYYY/M/D、
YYYY/MM/DD
の2つの書式だけを対応させてあげればいいのなら、short値を調
べて独自の変換マップを持ったクラスを作成してあげれば、対応
できるかもしれない。
ステイ
会議室デビュー日: 2005/08/02
投稿数: 11
投稿日時: 2005-08-22 16:48
いっきゅうさん、返信ありがとうございます。

引用:

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

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

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



僕も自分なりに調べていくうちに上記の方法に行き着きました。

上記の方法を試みたところ、
『yyyy/M/d h:m:s』形式でExcelでは表示されていても、
Javaで取得しようとすると『m/d/yy h:mm』で書式が取れてしまいます。

また、小文字のmで"月"も"分"も取れてしまうと、
Javaで日付フォーマットを変換しても、どちらも"分"になってしまいます。

いっきゅうさんの予想通り、この方法では難しいようです。
(この2つの壁をクリアできたらいけるのでしょうけど・・・)

引用:

いっきゅうさんの書き込み (2005-08-22 13:37) より:

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



いっきゅうさんのおっしゃる通り、
やはりPOIでは限界があるのでしょうか・・・
もう少し、調べてみます。

皆様、ご存知の方がいらっしゃいましたら、教えてください。
ステイ
会議室デビュー日: 2005/08/02
投稿数: 11
投稿日時: 2005-08-22 16:49
masaさんへ

かなり突っ込んだ内容を教えてくださって、ありがとうございます。

投稿内容を熟読します。


[ メッセージ編集済み 編集者: ステイ 編集日時 2005-08-22 17:20 ]
ステイ
会議室デビュー日: 2005/08/02
投稿数: 11
投稿日時: 2005-08-22 21:54
こんばんは。
お世話になっております。

引用:

masaさんの書き込み (2005-08-22 13:52) より:

この中身を日本語版のエクセルアプリが持つ書式情報とマッチす
るよう書き換えてあげれば、うまく動作させることが出来そう。
ただし、「日本語版のエクセルアプリが持つ書式情報」と対応す
るshort値を何に設定してあげればいいのか分からないので×。

2つの書式だけを対応させてあげればいいのなら、short値を調
べて独自の変換マップを持ったクラスを作成してあげれば、対応
できるかもしれない。



実践してみました。
上手くいきそうです。
ただ、やはり、
「日本語版のエクセルアプリが持つ書式情報」と対応するshort値
という大きな壁が立ちはだかってしまいます。
やはり、ここからは自力で、調べだす以外ないでしょうか?
かなり前進してるとは思うのですが、まだ先は長そうです。

本当はYYYY/MM/DDとYYYY/M/Dの2種類だけではなく、
想定できる全ての書式を拾うことが目標なのですが、
あまりに作業時間がかかるようだと、別途代替案を考えねばなりません。
(最終目標は、Excelに表示されてる値を
Javaプログラム内のString型で取得することです。)

もし、
「日本語版のエクセルアプリが持つ書式情報」と対応するshort値
を知ってらっしゃる方がいらっしゃいましたら、それに関する情報をお持ちの方が
いらっしゃったらご教授願えませんか?
もしくは、それ以外の方法でもかまいません。
厚かましいとは思いますが、よろしくお願いいたします。

僕は、引き続き、この書式取得の方法で、
自力で少しずつ対応する値を導いていこうと考えております。

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


[ メッセージ編集済み 編集者: ステイ 編集日時 2005-08-22 21:56 ]
masa
大ベテラン
会議室デビュー日: 2005/05/11
投稿数: 108
投稿日時: 2005-08-22 23:05
こんばんは。

引用:

ステイさんの書き込み (2005-08-22 21:54) より:
本当はYYYY/MM/DDとYYYY/M/Dの2種類だけではなく、
想定できる全ての書式を拾うことが目標なのですが、
あまりに作業時間がかかるようだと、別途代替案を考えねばなりません。
(最終目標は、Excelに表示されてる値を
Javaプログラム内のString型で取得することです。)

もし、
「日本語版のエクセルアプリが持つ書式情報」と対応するshort値
を知ってらっしゃる方がいらっしゃいましたら、それに関する情報をお持ちの方が
いらっしゃったらご教授願えませんか?



発見しました^-^ っhttp://sc.openoffice.org/excelfileformat.pdf
これの160、161ページですね。
書式には条件文みたいなことも書けてしまうので、最終目標の達成は
なかなか難しいかと思いますが、制限をつけることが許されるならば
ある程度のレベルまでは持っていけそうな気がしてきました。

頑張ってくださいね
ステイ
会議室デビュー日: 2005/08/02
投稿数: 11
投稿日時: 2005-08-23 09:21
おはようございます。
masaさん、ありがとうございます。
リンク先、拝見しました。これは、すごいですね!!

引用:

masaさんの書き込み (2005-08-22 23:05) より:
こんばんは。

発見しました^-^ っhttp://sc.openoffice.org/excelfileformat.pdf
これの160、161ページですね。
書式には条件文みたいなことも書けてしまうので、最終目標の達成は
なかなか難しいかと思いますが、制限をつけることが許されるならば
ある程度のレベルまでは持っていけそうな気がしてきました。

頑張ってくださいね



早速、コードに反映させてみます。
本当にありがとうございます。

PS.検索のコツとか情報集めるコツってありましたら教えてくださいませ。

ステイ
会議室デビュー日: 2005/08/02
投稿数: 11
投稿日時: 2005-08-24 12:22
masaさん、Clusterさん、Desmoさん、いっきゅうさん

ご教授いただきまして、本当にありがとうございました。
おかげさまで、条件を満たすことで解決ができそうです。

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