- PR -

Excelへの画像挿入について他

投稿者投稿内容
ひろし
会議室デビュー日: 2003/11/27
投稿数: 18
投稿日時: 2003-11-27 10:14
はじめまして。

早速ですが、サーバーに置いてあるExcelファイルに対して
指定したセルの上に画像ファイルを挿入することってできるのでしょうか?
Jakarta-POIのHSSFコンポーネントではセルに値をセットすることはできるようですが・・・

非常に困っているのでよろしくお願いします。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2003-11-27 10:51
引用:

指定したセルの上に画像ファイルを挿入することってできるのでしょうか?


Excelって、画像はセルとは無関係に位置指定して挿入されるものではありませんか?たまたまあるセルの上に置かれている、というだけで、どこのセルに挿入するとかそういう概念では無い気が。
ひろし
会議室デビュー日: 2003/11/27
投稿数: 18
投稿日時: 2003-11-27 11:03
おっしゃられるとおりですが、
見た目上このセルの上に挿入したいという意味でして、
ExcelのVBAで、
Sheet1.Range("b2").Activate
Sheet1.Pictures.Insert "c:\test\test.bmp"
というのを実行すると、B2のセルの左上に合わせてこの画像が挿入されます。
これと同じ動作をServletからできないでしょうか、という意味です。
上記コードを含んだマクロをJavaから実行できればそれでもよさそうですが、
現在調べているのは、Servletから直接画像挿入ができるかどうか、ということです。
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2003-11-27 13:29
引用:

見た目上このセルの上に挿入したいという意味でして、


それならば、

  1. 該当セルの左上の座標を取得
  2. 画像をその位置に挿入

とすれば良いですよね。
POIは使ったこと無いんですが、1.ならばそれぞれの行と列に対してorg.apache.poi.hssf.model.Sheet#getColumnWidthとorg.apache.poi.hssf.record.RowRecord#getHeightを使えば求められそうですね。
で、それらの値を元に画像のオブジェクトの挿入位置を指定すれば良いのではないでしょうか。
ひろし
会議室デビュー日: 2003/11/27
投稿数: 18
投稿日時: 2003-11-27 19:23
いろいろと試してみましたが、
やはり画像を扱うことはできないような感じです。

HSSFRow row = sheet.getRow(0);
 で1行目を掴まえて、
HSSFCell cell = row.getCell((short)0);
 で1行目の1列目のセル(つまり"A1")を掴まえて、
cell.setAsActiveCell();
 でこのセルをアクティブにして、
cell.setCellValue("ABC");
 で、そこに文字列をセット

というようなことはできるのですが、
この"ABC"という文字列の代わりに画像ファイルを
指定することはできないようです。
(セルに対して画像を設定するわけではないので当然なんですけど・・・)

直接できないのなら、Excel側に"画像を挿入するのマクロ"
を作ってそれをJavaから呼ぼうかと考えたのですが、
そのようなことはできないのでしょうか?
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2003-11-27 21:50
あの、だから「セルを指定してそこに画像挿入は出来ない」のであれば、「セルの左上隅の座標を指定してその位置に画像を挿入すればよいのでは?」と言ってるんですが、私の言いたいことが伝わってませんでしょうか?
多分、おっしゃることをそのまま素直に実現するPOIのAPIは無いのでしょうね。でも、私の言ってる方法では出来るのではありませんか?画像を挿入する部分が良く分からなかったので書きませんでしたが、特定のセルの左上の隅の座標なら、私の前の投稿で求め方は書きましたよね?
ひろし
会議室デビュー日: 2003/11/27
投稿数: 18
投稿日時: 2003-11-27 22:43
レスありがとうございます。

えーとまず、おばけさんがおっしゃられている
「座標を指定してその位置に画像を挿入する」という
その具体的な方法(どんなコンポーネントのどんなメソッドを使えば良いのか)
がわからなかったもので、しつこくPOIを調べておりました。
できればその方法を教えてもらえませんか?

それと、"getColumnWidth"と"getHeight"というのは
座標位置を取得するものではなく、
ある特定のセルの幅と高さを取得するものですよね。
ということは、例えば"E5"のセルの左上の位置を計算する場合は
「A〜Dの"getColumnWidth"の合計と1〜4の"getHeight"の合計を計算する」
ということを意味しているのでしょうか?

あまり理解できていなくて申し訳ないです。

[ メッセージ編集済み 編集者: ひろし 編集日時 2003-11-27 23:50 ]
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2003-11-27 23:59
引用:

えーとまず、おばけさんがおっしゃられている
「座標を指定してその位置に画像を挿入する」という
その具体的な方法(どんなコンポーネントのどんなメソッドを使えば良いのか)
がわからなかったもので、しつこくPOIを調べておりました。
できればその方法を教えてもらえませんか?


すみません、これは私も知らないです。というか、POIは名前は知っていましたが使ったことはありません。で、調べてから投稿すればよかったのですが、仕事中にチラッとAPIドキュメントを読んだ限りでは見つけられませんでした。いい加減なこと書いてしまってすみません。

いちおう日本語のサイトを見つけてもう一度調べたのですが、無さそうですね、、、どうやらPOIってFull featuredなAPIではないみたいです。移管したからCocoonでやってよ!みたいな記述もありますね。

引用:

それと、"getColumnWidth"と"getHeight"というのは
座標位置を取得するものではなく、
ある特定のセルの幅と高さを取得するものですよね。
ということは、例えば"E5"のセルの左上の位置を計算する場合は
「A〜Dの"getColumnWidth"の合計と1〜4の"getHeight"の合計を計算する」
ということを意味しているのでしょうか?


それは仰るとおりです。私が意図したのがまさにこれです。で、こちらもなんだか面倒なのでもう一度調べたのですが、やっぱりこうするしかなさそうです。

ところで、VBAをPure Javaのアプリから呼ぶのは難しいのではないでしょうか。推測ですが、JNI経由でOLEコンポーネントとか呼び出せば、、、できるのかもしれません。

# 思ったよりあんまり使えないのかな、、、って思いました。

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