【javascript】table特定行・列の固定、table列幅を可変
在庫の一覧、社員の一覧など、
webアプリケーションにて、HTMLのtableを用いて実装する事が多い。
以下のプラグインを適用し、多少のコードを記述するだけで
機能を拡張することが出来る。
行・列の固定
・fixed_midashi.js
①参照可能なパスにライブラリを配置し、参照する
<script src="${f:url('/js/fixed_midashi.js')}"></script>
②列を固定したい table に _fixedhead 属性を定義、 FixedMidashi.create() を呼び出す。
例)先頭1行と、先頭2列固定
<body onLoad="FixedMidashi.create();"> <table _fixedhead="rows:1; cols:2"> …
列幅の変更
・colResizable-1.6.min.js
①参照可能なパスにライブラリを配置し、参照する
<script src="${f:url('/js/colResizable-1.6.min.js')}"></script>
②列幅を可変にしたい table に任意の id を定義し、colResizable()にて初期化を行う。
<table id="sample"> …
$(function(){ $("#sample").colResizable(); });
参考:colResizable – Resizable columns and tables
※両方のプラグインを使用しても、動作すること確認済。
【java】JasperReport + JaspersoftStudioでのPDF帳票出力 その2
前回の続き
目次
※今回は(3)、(4)、(5)まで
(1) JaspersoftStudioのインストール
(2) 関連ライブラリの設定
(3) レイアウト(.jrxml)ファイル作成
(4) PDFファイルへパラメータを出力する方法
(5) PDFファイルへJavaBeanを出力する方法
レイアウト(.jrxml)ファイル作成
Eclipseのパッケージエクスプローラ上、任意の場所に、テンプレートファイル(.jrxml)を作成
- [新規] > [その他]メニューから、 [Jaspersoft Studio] > Jasper Reportを選択。
- 帳票のテンプレートを選択(Blank A4でOK)、ファイル名をつけて、完了
- 作成したファイルを開くと、真っ白な状態の帳票ファイルが表示される。
表示項目の配置は、[パレット]を使用。
配置したい項目のタイプを[パレット]から選択し、ドラッグ&ドロップで配置する。
主に使用するのタイプは以下の2つのみ
・Static Text :タイトルなど、固定文言の表示に使用
・Text Field :名前、住所、金額などDBから取得してくる変動する値の表示に使用
※デザイン部分の設定方法は割愛
- 日本語をPDF出力したい場合
①作成したPDFの、対象項目を選択し右クリック > プロパティーの表示
②[拡張] > PDFを選択し、以下の値を設定する
・Pdf Embedded :フォントを埋め込むかどうか ⇒FALSE
・Pdf Encoding :エンコーディング ⇒UniJIS-UCS2-H (Japanese)
・Pdf font name :フォント名 ⇒HeiseiKakuGo-W5(ゴシック表記)/HeiseiMin-W3(明朝表記)
PDFファイルへパラメータを出力する方法
- 作成したPDFの、プロパティを表示(レイアウト上のなにもないところをクリックすると表示されます)
- Edit query, filter and sort options ボタンを選択
[パラメータ]タブ > [追加]を選択し、任意のパラメータ名、データ型を設定する
- 表示項目とパラメータを関連づける
例:Text Field
①Paletteビューから、Text Fieldをドラッグ&ドロップします
②ドロップしたTextFieldをダブルクリックし、Expression Editorダイアログを表示
③初期設定されているテキストを削除し、対象のパラメータを選択後、完了。
- java側の実装例
java側の実装サンプルは下記の様になる。
※テンプレートに設定したパラメータ名と同一の名称を指定すること。
// 帳票レイアウト(.jrxml)ファイル配置パス private static final String JRXML_FILE_PATH = "/WEB-INF/jrxml/sample.jrxml"; public static void main(String[] args) throws Exception { // 帳票レイアウトをコンパイル ServletContext app = ServletContextUtil.getServletContext(); String path = app.getRealPath(JRXML_FILE_PATH); File pdf = new File(path); JasperReport jr = JasperCompileManager.compileReport(pdf.getPath()); // パラメータをセット HashMap<String, Object> parameters = new HashMap<String, Object>(); parameters.put("parameter", "パラメータ設定テスト"); JasperPrint jp = JasperFillManager.fillReport(jr, parameters); byte[] bytes = JasperExportManager.exportReportToPdf(jp); response.setContentType("application/pdf"); response.setContentLength(bytes.length); ServletOutputStream out = response.getOutputStream(); out.write(bytes); out.flush(); out.close(); } catch (Exception e) { ~ } }
PDFファイルへJavaBeanを出力する方法
- パラメータとなるクラスを作成する
/** 氏名 **/ private String name; /** 性別 **/ private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; }
- 作成したクラスを、テンプレートファイルに設定する
①作成したPDF、Edit query, filter and sort options ボタンを選択
②JavaBeanタブを選択し、クラスの参照ボタンを選択
③作成したクラスを選択(ビルドパスに作成したクラスが追加されている必要があります)
④パラメータとして使用したいフィールドを選択し、追加ボタンを選択
- 表示項目とパラメータを関連づける
例:Text Field
①Paletteビューから、Text Fieldをドラッグ&ドロップします
②ドロップしたTextFieldをダブルクリックし、Expression Editorダイアログを表示
③初期設定されているテキストを削除し、対象のフィールドを選択後、完了。
- java側の実装例
java側の実装サンプルは下記の様になる。
※テンプレートに設定したパラメータ名と同一の名称を指定すること。
// 帳票レイアウト(.jrxml)ファイル配置パス private static final String JRXML_FILE_PATH = "/WEB-INF/jrxml/sample.jrxml"; public static void main(String[] args) throws Exception { // 帳票レイアウトをコンパイル ServletContext app = ServletContextUtil.getServletContext(); String path = app.getRealPath(JRXML_FILE_PATH); File pdf = new File(path); JasperReport jr = JasperCompileManager.compileReport(pdf.getPath()); // パラメータをセット HashMap<String, Object> parameters = new HashMap<String, Object>(); parameters.put("parameter", "パラメータ設定テスト"); List<SampleDto > list = new ArrayList<SampleDto >(); // 作成したデータバインド用のクラスに値をセット SampleDto dto = new SampleDto(); dto.setName("テストさん"); dto.setSex("男性"); list.add(dto); JasperPrint jp = JasperFillManager.fillReport(jr, parameters, new JRBeanCollectionDataSource(list)); byte[] bytes = JasperExportManager.exportReportToPdf(jp); response.setContentType("application/pdf"); response.setContentLength(bytes.length); ServletOutputStream out = response.getOutputStream(); out.write(bytes); out.flush(); out.close(); } catch (Exception e) { ~ } }
【java】JasperReport + JaspersoftStudioでのPDF帳票出力
iReportのサポートが2015年末迄で終了となっていた、、
後継のJaspersoftStudioにてPDF出力を作成したので、詰まったとこ等メモ
■環境
windows7
Eclipse Luna 4.4.1
PostgreSQL 9.4
java 8
tomcat 8
Seasar2 Framework
○前提として
・既存WebアプリケーションにPDFの出力処理を組込む
・帳票の中身は、静的文言・画面入力値(パラメータ)・DB内容一覧(サブレポート)を含む
目次
※今回は(1)、(2)まで
(1) JaspersoftStudioのインストール
(2) 関連ライブラリの設定
(3) レイアウト(.jrxml)ファイル作成
(4) PDFファイルへパラメータを出力する方法
(5) PDFファイルへJavaBeanを出力する方法
JaspersoftStudioのインストール
- [ヘルプ] メニュー > [Eclipse マーケットプレース]
- [検索] テキスト ボックスに “Jaspersort Studio” と入力し、[実行] ボタンをクリック
- "Jaspersort Studio X.X.X"を選択し、インストール
- 指示に従い、進める
- インストール完了後、Eclipse の再起動が必要
レイアウトファイル(.jrxml)をEclipse上で編集可能になる
※注意 プラグインインストール後、なぜかBackSpaceキーがDeleteキーと同様な設定になっている。ウィンドウ > 設定 > 一般 > キー にて、下記の様に設定を戻せば直ります。
関連ライブラリの設定
Eclipseに下記の関連ライブラリを配置し、ビルドを通します。
- commons-beanutils-1.9.0.jar
- commons-collections-3.2.1.jar
- commons-digester-2.1.jar
- commons-logging-1.1.1.jar
- iText-2.1.7.jar
- iTextAsian.jar
- jasperreports-6.2.0.jar
- jasperreports-fonts-6.2.0.jar
- jasperreports-javaflow-6.2.0.jar
- commons-javaflow-20060411.jar
下記URLよりダウンロード可能
JasperReports® Library | Jaspersoft Community
★iTextについて
iText(JasperReportが依存するPDF出力用のライブラリ)の最新バージョンは5.5.0(2015/12/03 時点)
var5.0.0以降はAGPLv3 (使用したソースを公開する、もしくは有償ライセンスを購入しないと商用利用出来ないらしい)
気にせず使える最新が2.7.1、幸いJasperReport・JaspersoftStudioとのバージョン互換があったため、今回はこれを選択。
あと、日本語化用ライブラリ iTextAsian.jarの類似ライブラリ itext-ajian.jarはvar5.0.0以降対応。
※サポートが切れている為、公式サイトよりダウンロードは不可
【PostgreSQL】SQLパフォーマンス改善
重いSQLの判定方法
①実行計画の測定
調査したいクエリの先頭に、"EXPLAIN" / "EXPLAIN ANALYZE" を付けて実行
EXPLAIN SELECT * FROM …
※ANALYZEを付与すると、実際に実行し、実測値も出力される
※INSERT、UPDATE、DELETEのようなデータの変更を伴う問い合わせの実行計画を得たい場合には以下のように実行
(これで実際の更新は走らない)
BEGIN;
EXPLAIN ANALYZE …;
ROLLBACK;
②実行計画より、コストの高いクエリを特定
EXPLAINにより返却される結果の内、
(cost= xxx...yyy )の部分が実行時間に関わる
※xxx:最初の行が返されるまでの時間
※yyy:次の数字が全ての行が返されるまでの合計時間
CentOS 7にPostgreSQLサーバー構築
今回はインストールまで
- postgreSQLのインストール確認
[root@XXXXX ~]# psql --version
bash: psql: コマンドが見つかりません
- yumでインストール可能なバージョンを確認
[root@XXXXX ~]# yum list | grep postgresql
base、updatesセクションに、"exclude=postgresql*"を追加
[base]
…
exclude=postgresql* ←追加
[updates]
…
exclude=postgresql* ←追加
- rpmファイルインストール
[root@XXXXX ~]# yum localinstall http://yum.postgresql.org/9.4/redhat/rhel-6-x86_64/pgdg-centos94-9.4-1.noarch.rpm
- postgresql-server インストール
[root@XXXXX ~]# yum install postgresql94-server
※/var/lib/pgsql/9.4/data 配下に、ポスグレの全てのデータファイルが格納されるらしい。
- サーバー起動前に初期化する
service postgresql-9.4 initdb
- CentOS の起動時に、PostgrSQLサーバーを自動で起動(念の為)
[root@XXXXX ~]# chkconfig postgresql-9.4 on
- サーバー起動
[root@XXXXX ~]# service postgresql94-server start
【java】一時ファイルを使用しない、zipファイルダウンロード実装
データベースに登録されたバイナリ画像データを、zip化して出力するサンプル。
org.apache.tools.zip.ZipOutputStreamをjavax.servlet.ServletOutputStreamで
フィルタリングして作成することで、一時ファイルを作成せずに、
そのままレスポンスにファイルを流しこめる。
// 画像データの取得
バイナリデータのリスト dataList = getDataList();
// 日本語ファイル名対応
String encodFile = URLEncoder.encode(this.fileName, "UTF-8");
// ヘッダー情報設定
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-Type", "application/zip;charset=UTF-8");
response.setHeader("Content-disposition", "attachment; filename=\"" + encodFile + "\"; filename*=utf-8'ja'"
+ encodFile);
// ZIPファイルを書込む為の出力ストリームを、HTTPコンテンツ本体へのバイナリ出力として初期化する。
ZipOutputStream zipOutStream = new ZipOutputStream(response.getOutputStream());
zipOutStream.setEncoding("MS932");
// ファイル出力
try {
// zip作成
for(バイナリデータ imageRecord : バイナリデータのリスト) {
// 取得イメージを、ZIP書込み
ByteArrayOutputStream objBos;
objBos = new ByteArrayOutputStream(imageRecord.getImegeInfo().length);
objBos.write(imageRecord.getImegeInfo(), 0, imageRecord.getImegeInfo().length);
objBos.close();
// ZipOutputStreamにZipEntryを設定
ZipEntry objZe = new ZipEntry(fileName);
objZe.setMethod(ZipOutputStream.DEFLATED);
zipOutStream.putNextEntry(objZe);
// 取込イメージ情報を書込み
byte[] aryByt = objBos.toByteArray();
zipOutStream.write(aryByt, 0, aryByt.length);
// ZipEntryのクローズ
zipOutStream.closeEntry();
}
zipOutStream.close();
} catch (Exception e) {
//エラー処理
} finally {
if(zipOutStream != null) {
zipOutStream.close();
}
}