SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaの標準機能だけで実現する帳票印刷

指定幅に文章を書くための追い出し禁則処理

Javaの標準機能だけで実現する帳票印刷 第7回

  • X ポスト
  • このエントリーをはてなブックマークに追加

データ

 あくまで帳票印刷の説明のための簡易な架空データです。実際のシステム開発中にテストデータとして作成したものが下敷きになっているので、使われていない部分や無駄な部分、解説では触れられていない部分もあります。

 実際の現場で使えるほど作り込んてではいませんが、実際に動かしてみるためにはデータが必要なので、一応掲載しておきます。

 まず構成です。1Jがホームルーム(学級)を示すIDです。

 成績はホームルーム全員分の表の形になっていて、番号、氏名が含まれています。

 出欠もホームルーム全員分の表の形ですが、番号も氏名もなく、数値のみです。

 授業日数は、全員に対して同じ値です。実際には転入転出の場合を考慮する必要がありますが省いています。

 所見は1人ずつ学期ごとに一ファイルに入れて用意します。

ファイル名 内容 形式
1J13.txt 1学期成績 タブ区切り
1J23.txt 2学期成績 タブ区切り
1J33.txt 3学期成績 タブ区切り
1J5.txt 学年成績 タブ区切り
1J4-7 1学期出欠 カンマ区切り
1J8-12 2学期出欠 カンマ区切り
1J1-3 3学期出欠 カンマ区切り
1J4-3 学年出欠 カンマ区切り
1JZDN 授業日数 カンマ区切り
161J01tsu3.txt 3学期所見  

成績データ

 1行目が教科名、2行目は科目名、3行目が単位数です。タブ区切りです。

 4行目から100点満点の20段階評価です。38人まで作りましたが、長い名前の例として入れた18番までを掲載します。

ファイル名:1J13.txt
 	 	国語	国語	公民	数学	数学	理科	理科	保健体育	保健体育	芸術	外国語	外国語	家庭	情報
番号	氏名	国語総合	現代文B	現代社会	数学Ⅰ	数学A	化学基礎	生物基礎	体育	保健	音楽Ⅰ	コミュニケーション英語Ⅰ	英語表現Ⅰ	家庭基礎	情報の科学
 	 	2	4	3	4	2	2	2	2	1	1	4	2	2	2
1	赤石 美緒	55	60	45	65	45	75	45	55	55	60	45	65	65	55
2	荒川 早織	50	55	90	30	45	90	75	75	95	65	65	75	45	100
3	石村 千尋	-3	-3	-3	-3	-3	-3	-3	-3	-3	-3	-3	-3	-3	-3
4	岩崎 桃子	50	55	55	55	60	20	95	95	45	45	65	50	45	75
5	太田 舞	65	60	95	75	65	70	20	15	 	65	85	75	95	65
6	小山内 真紀子	90	85	55	65	55	60	55	40	80	65	50	60	50	85
7	小山 美奈子	60	65	100	55	30	20	65	75	90	70	45	55	25	95
8	兼平 綾乃	50	55	60	55	55	45	95	20	55	45	75	65	65	60
9	北村 香奈	55	60	85	50	80	80	55	45	65	45	80	55	45	75
10	工藤 彩香	60	60	55	55	65	85	95	85	80	55	45	65	15	60
11	工藤 由佳	85	80	95	20	40	65	95	10	55	65	65	65	40	75
12	古川 香	55	60	95	85	95	55	55	45	65	55	60	75	45	95
13	小柳 真衣	70	75	55	50	55	95	65	75	95	65	30	65	20	55
14	齋藤 弥生	45	50	65	45	70	70	85	60	80	65	30	55	50	95
15	佐々木 詔子	55	60	95	45	25	65	60	55	60	55	75	65	95	55
16	佐藤 亜希	65	65	85	45	55	65	55	65	65	55	70	75	55	95
17	ショパン フレデリック	90	85	85	45	55	20	30	25	95	90	90	65	95	55
18	ファインマン リチャード	60	65	100	45	65	80	65	15	75	55	55	50	55	95
(......以下略....)

 他の学期は省略します。教科、科目、単位数、氏名は重複するデータとなります。学年は5段階の成績となります。

 3番の生徒は成績が出ていないことを表現しようと半角スペースとタブの繰り返しにしていました(「HRdata.java」で半角スペースを-3に変換して使用)が、CodeZineの表示幅の制限のために改行されて表示が乱れます。やむなく、成績を初めから-3としています。

出欠データ

 1行目が最終更新日時、2行目は行数や項目数の情報です。今回のプログラムでは使いません。

 3行目は全員分の合計です。今回のプログラムでは使いません。歴史的な仕様です。

ファイル名:1J4-7
"17/02/08_10:11:50"
"DIM=3 begin with 0 0 1",0,38,6
3,5,6,0,3,1
2,1,0,0,0,0
0,0,0,0,0,0
0,2,2,0,0,0
0,1,3,0,0,0
0,0,0,0,1,0
0,0,0,0,1,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,1,0,0,0,0
0,0,0,0,0,0
0,0,0,0,1,0
1,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
0,0,0,0,0,0
(......以下略....)

授業日数

 1、2、3学期とその合計が入っているだけです。

ファイル名:1JZDN
57,79,36,172

所見(備考)

 通知表の運用は、学校それぞれのやり方があります。今回用意したのは学期ごとに別々の所見を書いて発行するというものです。前の学期に書いたものを残して追記したければ、前のファイルに追記して名前を変えて保存するだけです。

 実用ではプレビューのできるファイル作成プログラムを作成しました。

ファイル名:161J02tsu3.txt

禁則処理のためのテス卜データです。プレビューを見ながら調整できますが、自動でやってくれる方がもちろん便利です。文章の性格上、句読点だけでよいと思います。一行ずつ処理していきますので、最初が通れぱあとはうまくいきます。途中のどこかで禁則がでてくることを期待して長文を書いてみます。一行も空いていない文章です。段落の字下げは自分で全角スぺースですね。

 ファイル名は2016年の 1Jの02番用のtsu(通知表用)3学期 という形式にしています。

  • 長い文ではワープロのように行がいっぱいになったら自動で改行します。元のデータが改行しているところでは無条件に改行します
  • 行を空けたければ改行を繰返します。段落の字下げをしたければ、全角空白を入れてください
  • 行数・全体の文字数の制限をしていません。長い文章、改行の多い文章は備考欄の枠から下へはみ出します
  • これらについては印刷プレビューで確認して修正してください

連載のまとめ

 Javaの標準機能だけで帳票印刷をする方法を説明してきました。再利用できるクラスも作成していますが、さまざまな機能を持ったツールを提供しようというのではありません。仕組みを理解して用途に合わせて拡張していくためのヒントを書いたつもりです。いろいろな要求を想像して多くなりましたが、自分に必要な機能だけ独立して使うことも可能です。

 解説したことを、回を追って書いておきます。

 Javaの標準機能だけで十分な解像度で文字や罫線を描画できることを紹介しました。(第1回)

 プリンタの選択、用紙サイズと印刷の向きの指定、余白の指定方法を紹介しました。(第2回)

 長形3号など封筒への印刷と、プリンタの検索と選択の方法を探ってみました。(第3回)

 均等割付・右寄せ・センタリングを簡単に扱うAdjustString.javaクラスを紹介しました。サロゲートペア対応です。(第4回)

 罫線の指定を簡単にするLinemm.javaクラスも紹介しました。(第4回)

 葉書宛名の住所印刷に使えるAfreString.javaクラスを紹介しました。改行候補文字を指定して指定幅に収まるように自動的に改行させます。(第5回)

 印刷プレビューの方法を詳しく書きました。特に複数のページをプレビューするためのMultiPageDialog.javaを紹介しました。MultiPageViewable.javaインターフェースを実装するクラスのインスタンスはこれでプレビュー可能です。(第5回)

 AdjustString.javaとAfreString.javaを縦書きに対応させた、AdjustStringV.javaとAfreStringV.javaを紹介しました。(第6回)

 縦書にするとハイフォンや長音符を回転させる必要があります。また数字も漢数字にしたくなるかもしれません。ExchChar.java で文字置換をします。(第6回)

 句読点などの追い出し禁則処理の機能をAdjustString.javaに追加しました。(第7回)

おすすめの設計法

 連載第5回の横書き葉書宛名PostcardsJushoHor.java、連載第6回の縦書き葉書宛名PostcardsJushoVer.java、連載第7回の通知表Tsuuchi.javaなどはMultiPageViewable.javaインターフェースを備えています。どれかを下敷きにデータを用意する部分を書いてmain部で呼び出し、書式部分はdrawPage()内を書き換えます。その他の部分はほとんどコピーしたままで使えると思います。

 もし1ページしかないものであれば、データをそのように作ればMultiPageDialog.javaは対応します。 もし、プレビューもいらないから簡単な方が良いというのなら、連載第4回のTsuuchi.javaを元に作ることができます。

 下記のプログラムを必要なものだけ、同一フォルダに置いてコンパイルすれば使えます。

クラス 機能 追加した機能
AdjustString.java 横の文字配置(第4回) 禁則拡張,姓名の均等拡張(第7回)
AfreString.java 横の自動改行(第5回)  
AdjustStringV.java 縦の文字配置(第6回)  
AfreStringV.java 縦の自動改行(第6回) Enx拡張(グリフのない縦線対策)(第6回)
ExchChar.java 縦書のための文字置換(第6回)  
Linemm.java 罫線描画(第4回)  
MultiPageDialog.java 複数頁プレビュー(第5回)  
MultiPageViewable.java 複数頁プレビューインターフェース(第5回)  

 追加した機能について付け加えておきます。

 禁則拡張は、縦書きのAdjustStringV.javaには付け加えていません。縦用に調整して付け加えることはそう難しくないでしょうが、句読点については文字の回転についても考える必要があります。長音符とハイフォンについてはExchChar.javaの拡張もする必要があります。住所では90度回転なければならない文字は限られていましたが、一般の文章では数が増えます。句読点や括弧などはUnicodeに回転した文字がありますが、必要になる文字を網羅しているかを確認するのは難しいかもしれません。

 姓名の均等拡張も縦書きではそのまま使えないかもしれません。

 Enx拡張(グリフのない縦線対策)はAfreStringV.javaのみの機能ですが、AdjustStringV.javaにも追加されていてもいいかもしれません。AfreStringV.java内のdrawTtoBEnx()など、末尾にEnxのついたメソッドをコピーして追加するだけで動くと思います。お試しください。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Javaの標準機能だけで実現する帳票印刷連載記事一覧

もっと読む

この記事の著者

安達 順一(アダチ ジュンイチ)

私立高校に理科・情報の教員として勤めていました。Linuxサーバー/クライアントの授業システムを作り、移動プロファイルで運用していました。教員用にもLinuxサーバーを用意し成績処理プログラムを書きました。情報の学校設定科目ではウェブページ制作とjavaのプログラミングの初歩の授業を作りました。情報...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/12119 2020/08/28 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング