2010年3月27日土曜日

Excel2007でグラフ入りのxlsファイルを保存すると小さくなる

Excel2000形式(*.xls)で作ったグラフ入りのファイルをExcel2007で開いて保存するとグラフが小さくなる現象が発生。
色々試してみるとどうやら2007で保存をするだけでグラフのプロットエリアが一回り小さくなる様子。

色々調べてみた所マイクロソフトのサポートに以下のページがありました。

グラフのプロット エリアをサイズ変更される可能性があります、またはがシフトされる少し Excel 2007 でグラフの右部分に

自動翻訳みたいなので内容も若干おかしな日本語になっています。原因の部分も下のように変な文章になっています。

・ブックが、 Excel 97-2003年ブック (*.xls) ファイル形式で保存します。
・倍率が 100% 以外の設定に変更されるとブックを保存します。
・ブックは Excel 2007 と以前のバージョンの Excel の両方に、Excel 2007 ブックとして保存または。

もとになっているページを見てみると

・The workbook is saved in the Excel 97-2003 Workbook
(*.xls) file format.
The workbook is saved when the zoom setting is changed
  to a setting other than 100 percent.

・The workbook is alternately saved as an Excel 2007 workbook
 both in Excel 2007 and in an earlier version of Excel.

と、表示を100%以外で保存するとこの現象が起きる。と言った内容で書かれていました。

実際問題になっているファイルを見てみると表示倍率は80%でしたので100%に戻してみた所小さくなる現象はでなくなりました。
(微妙にレイアウトが変わってしまう場合があるようですが、
こちらはまた別で調べたいと思います)

取り合えず原因はわかったものの、Excel2000,2003,2007が混在している以上これからも起きうる問題です。パッチとかは出ないのでしょうか?



2010年3月26日金曜日

JasperReportsで四則演算

ACCESSのレポートで列AとBを足したい場合は非連結のテキストボックスを設けて

Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    テキストボックス = A + B
End Sub

とすればA+Bの計算結果をテキストボックスに表示する事が出来ましたが、
(式エディタは面倒なので使ってませんでした)
JasperReportsでやってみた所、うまくいかずはまりました。

まず、ACCESSと同じ感覚で以下の様にして

 $F{A} + $F{B}

レポートのコンパイルを行うとこんなエラーが

The operator + is undefined for the argument type(s) java.lang.Integer, java.lang.Integer

Integerでは + 演算子が使えないという内容でしたので今度は

 $F{A}.intValue() + $F{B}.intValue()

とした所

Cannot cast from int to Integer

というエラーに...

エラーの内容を元にWebで調べてみたのですが、英語での情報しかない上に、「データソースの段階で計算しておけばいいじゃない?」。というような内容であまり参考にはならずで、あきらめようとしていたのですが、どうやらJavaの文法が使えそうな気がしてきたので

Integer.valueOf($F{A}.intValue() + $F{B}.intValue())

の様にしてみた所うまく表示されるようになりました。
VariablesではIntegerのまま使えるのになぜ?という感じではありますが一応解決です。

2010年3月25日木曜日

Hibernateで ORDER BY *** IS NULL ASC を実現したい

MySQLでソート時にNULLを優先させたくない場合は

ORDER BY XXX IS NULL ASC, XXX ASC

と書く事で解決できますが、Hibernateに対応するAPIが見つかりませんでした。

Criteriaを使ってコードがすっきりしているのでSession#createSQLQuery()は使いたくなかったので以下の様にして無理やり実現してみたのですが、もっと簡単に出来ないものでしょうか?

List list
// createCriteria()内で検索条件を追加
Criteria criteriaA = createCriteria(session);
Criteria criteriaB = createCriteria(session);

// キーとなる XXX が Not Null なデータを取得
criteriaA.add(Expression.isNotNull("XXX"));
criteriaA.addOrder(Order.asc("XXX"));
list = criteriaA.list();

// キーとなる XXX が Null なデータを取得しcriteriaAの結果に追加
criteriaB.add(Expression.isNull("XXX"));
list.addAll(criteriaB.list());




2010年3月18日木曜日

障害発生時の画面キャプチャ取得

Robot#createScreenCapture()を使うと現在の画面キャプチャが取れるようなのでそれを画像として保存する処理を仮作成。

離れた事業所で運用しているシステムで障害が発生した場合、電話だけでは要領を得ないので主要な所にはVNCをインストールしてますが、障害が起きている状態で連絡が来るわけでもないので、例外発生時の画面キャプチャを残す事で少しは有力な情報が得られそう。

同じような用途で実行時の画面インスタンス情報もテキスト化する処理を作りたいが、なかなか時間が確保できない...


// 画面サイズの取得
GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
Rectangle rect = env.getMaximumWindowBounds();

// 画面キャプチャ
Robot robot = new Robot();
BufferedImage image = robot.createScreenCapture(rect);

// 取得したイメージを画像へ保存
Date date = new Date();
SimpleDateFormat dataFormat = (SimpleDateFormat)DateFormat.getDateInstance();
dataFormat.applyPattern("yyyyMMdd_HHmmss");
ImageIO.write(image, "gif", new File(dataFormat.format(date) + ".gif"));

2010年3月11日木曜日

Hibernate辞典購入

これまではHibernateをブログやホームページの解説を見ながら何とか使っていたのですが、先日アノテーションの設定で詰まってしまい、色々と情報を探していた所、Hibernate辞典にはそういった事も書いてあるみたいなのでamazonで購入。昨日着いたので早速見たのですが、最初の「01:Hibernateの基礎知識 」の部分を読んだだけでも十分勉強になる内容でした。

Hibernateを使い始めた頃、Hibernate辞典が内容も充実していていいという話を聞いていたのですが、近所の本屋にも置いて無く、また値段も地味に高いので躊躇していたのですが、もっと早く買っておくべきだったと思いました。


JFormattedTextFieldでの勘違い

以前の投稿でJFormattedTextFieldの値が削除できないと書いたが、ただの勘違いというか勉強不足だった。
NetBeansでJFormattedTextFieldを配置した場合にfocusLostBehaviorの値がデフォルトでCOMMIT_OR_REVERT になっているのでそこをPERSISTに変えれば空にした場合はそれが反映されるよう。

この場合はマスクに一致しない場合でもそれが残ってしまうのでInputVerifierを継承したクラスをセットして値のチェックを行う必要があるみたいなのですが、基礎部分を変に作りこんでしまったため、ここを直すと他にも影響が出てしまいそうですぐには直せないですが、早めにリファクタリングしないといけない所です。