「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:2
昨日:0
総数:3121
現在:5


JooReportsのどこかのイベントでマクロを駆動させたい

ページOpenOffice.org FAQの登録ページ
投稿者Y.Tanabe
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2006-11-08 17:27:02 (水)
OS
依存するページfaq/3/304
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

faq/3/304の問題に付随して、表の内部のフォントサイズを文字数に応じて動的に変更するマクロを埋め込み、それをJooReportsのどこかのイベントで駆動させたいのですが、このイベント駆動がうまくいきません。
これが出来れば、マクロで色々組み込んでおいて、あらゆるスタイルの変更がプログラムと別の次元でいじれると思うのですが。
どなたかご存知の方はご教授ください。


上記課題の補足です。

Y.Tanabe (2006-11-08 19:03:18 (水))

サンプルとして使っているマクロは以下の通りです。
Writerのドキュメント内に内在する表のセルないのフォントを一律6ポイントにするサンプルです。

	REM  *****  BASIC  *****
	
	Sub AutoFontResize
	
	rem ----------------------------------------------------------------------
	rem define variables
	dim table   as object
	rem ----------------------------------------------------------------------
	rem get access to the document
	
	Dim textTables as object
	Dim cellNames
	Dim Cell as object
	Dim CellCursor as object
	Dim I as Integer
	Dim J as Integer
	
	tables = ThisComponent.TextTables
	
	For I = 0 to tables.count - 1
	table = tables(I)
	cellNames = table.getCellNames()
	For J = 0 to UBound(CellNames)
		Cell = Table.getCellByName(CellNames(J))
		CellCursor = Cell.createTextCursor
		CellCursor.gotoEnd(True)
		rem ---CellCursor.CharWeight = com.sun.star.awt.FontWeight.BOLD
		CellCursor.CharHeightAsian = 6
		rem ---CellCursor.paraAdjust = com.sun.star.style.ParagraphAdjust.RIGHT
	Next
	Next
	end sub

上記コードにはrem文で余計なコードがありますが、要は全て6ポイントにしてしまおうというマクロです。

問題は、このマクロを、JooReportsでしかるべきデータを${data}に埋め込んだ後にPDFにコンバートして出力する流れの中で起動させたいのです。
それが出来れば、テンプレートのodtファイルがいかなるフォントサイズであろうとも、PDFでは6ポイントになっているはずです。

上記の問題が解決すれば、エクセルなどにある「自動的にフォントサイズを縮小して全体を表示」という機能をJooReportsと合わせて利用できると思うのです。

すごく、良いアイデアだと思うのですが、どなたかご教授いただければと思います。

マクロの埋め込みとイベント

はにゃ? (2006-11-08 19:36:04 (水))

ツール - メニュー - カスタマイズ - イベント - 「ドキュメントを開く」
イベントに、マクロを割り当てて設定の保存先はドキュメントにします。

そのファイルをテンプレートとして使用します。
このとき、
JooConverter の

package net.sf.jooreports.openoffice.converter;

OpenOfficeDocumentConverter.java および StreamOpenOfficeDocumentConverter.java
でメソッド loadAndExport 内で ファイルを開いた後エクスポートされている
ようですが、ここでファイルが「読み込み専用」で開かれています。

property("ReadOnly", Boolean.TRUE),

ここを修正しないと、JooConverter で変換するときにマクロで変更できません。

さらに、マクロなどで loadComponentFromURL でマクロを含むファイルを
開くと、マクロが実行されません。
「マクロのセキュリティレベル」を低にしても実行されないようです。
そこで、開くときのオプションに

MacroExecutionMode
com.sun.star.document.MacroExecMode.ALWAYS_EXECUTE_NO_WARN

などを設定してやる必要があります。

最後にもうひとつ、どうやって回避すればいいのかよくわからないのですが、
マクロなどで、ドキュメントを開いてすぐにエクスポートすると、
「ドキュメントを開く」イベントでマクロを呼び出してドキュメントを変更しているにもかかわらず、
変更されていない状態で保存されたりすることがあります。
Hidden にせずに見ていると実際には変更されているにもかかわらずです。

変更されない例

はにゃ? (2006-11-08 19:49:12 (水))

最後のは Java では起きないかもしれません。
OOo Basic および BeanShell ではおきますが、
Java で外部からだとわかりません。

バージョンによるコードの違い

Y.Tanabe (2006-11-09 18:19:25 (木))

上記、非常に参考になりました。早速調査しました結果・・・

jooconverter-2.1rc1では
property("ReadOnly", Boolean.TRUE),
がありますが、jooreports-2.0rc1では
当該コードがありませんでした。(Hiddenのみでした)

私は諸般の理由によりjooreports-2.0rc1を使う必要がありまして、ReadOnlyとして開いていないと思われますのでご指摘の通りに

・「ドキュメントを開く」イベントに、マクロを割り当て
・「マクロのセキュリティレベル」を低に設定

とした後、JavaからOpenOfficeDocumentConverterのconvertを実行した時点でマクロがイベント駆動してくれるはずなのですが。だめでした。

おそらく、「最後にもうひとつ、」でご指摘の通りなのだと思います。
すると、予想される原因は、マクロのイベント駆動とマクロの完了を待ってくれずにコンバートのコードが実行されているのではないでしょうか。
loadAndExportのコード内でマクロの実行完了を待って、つまり、synchronized する必要があると思います。

以上、調査と考察でした。是非、本件の更なるご教授賜りますようお願いします。

マクロのセキュリティ

はにゃ? (2006-11-09 18:51:35 (木))

OOo のマクロのセキュリティを低いに設定しても、
なぜかほかのマクロなどから loadComponentFromURL で開いた
ファイルのマクロは実行されません。そのため、
ファイルを開く際に MacroExecutionMode
を指定して実行可能にする必要があります。
http://api.openoffice.org/docs/common/ref/com/sun/star/document/MacroExecMode.html
の値を指定します。Hidden の指定のときに値を追加します。

信頼されたソース

はにゃ? (2006-11-09 19:00:41 (木))

マクロのセキュリティで信頼されたソースにパスを追加しても、
メニューから開いたドキュメントはマクロが実行されるのに対して、
OOoBasic から MacroExecutionMode を設定せずに開いたファイルでは
マクロが実行できませんでした。

設定ファイルをいじればどうにかなるんでしょうか…

連投ですが、

はにゃ? (2006-11-09 19:20:05 (木))

マクロをドキュメントのライブラリではなく、OOo のアプリケーションライブラリ
に保存したものを「ドキュメントを開く」イベントに割り当てると、
MacroExecutionMode を
com.sun.star.document.MacroExecMode.NEVER_EXECUTE に設定して開いても、
マクロが実行されました。マクロがドキュメント中にないためのようです。

アプリケーションライブラリのマクロなら、マクロ等で開いたドキュメント
からでも設定なしでイベント駆動できるようです。

アプリケーションライブラリのマクロが良いですね

Y.Tanabe (2006-11-09 22:41:56 (木))

まだ、試していませんが、アプリケーションライブラリのマクロでやればいけそうな気がします。早速、明日、試してみようと思います。ご教授ありがとうございます。
MacroExecutionModeの指定をJooReportsのrc1でするには、ソースをいじる必要があるのですが、それは避けたかったので、「アプリケーションライブラリのマクロ」がベストのような気がします。また、私の場合、全てのファイルに統一的に適用したいマクロであるため、ファイルそれぞれにマクロを保存する手間も省けてすこぶる良いようにおもいます。

お名前:
題名: