データ
あくまで帳票印刷の説明のための簡易な架空データです。実際のシステム開発中にテストデータとして作成したものが下敷きになっているので、使われていない部分や無駄な部分、解説では触れられていない部分もあります。
実際の現場で使えるほど作り込んてではいませんが、実際に動かしてみるためにはデータが必要なので、一応掲載しておきます。
まず構成です。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番までを掲載します。
国語 国語 公民 数学 数学 理科 理科 保健体育 保健体育 芸術 外国語 外国語 家庭 情報 番号 氏名 国語総合 現代文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行目は全員分の合計です。今回のプログラムでは使いません。歴史的な仕様です。
"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学期とその合計が入っているだけです。
57,79,36,172
所見(備考)
通知表の運用は、学校それぞれのやり方があります。今回用意したのは学期ごとに別々の所見を書いて発行するというものです。前の学期に書いたものを残して追記したければ、前のファイルに追記して名前を変えて保存するだけです。
実用ではプレビューのできるファイル作成プログラムを作成しました。
禁則処理のためのテス卜データです。プレビューを見ながら調整できますが、自動でやってくれる方がもちろん便利です。文章の性格上、句読点だけでよいと思います。一行ずつ処理していきますので、最初が通れぱあとはうまくいきます。途中のどこかで禁則がでてくることを期待して長文を書いてみます。一行も空いていない文章です。段落の字下げは自分で全角スぺースですね。
ファイル名は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のついたメソッドをコピーして追加するだけで動くと思います。お試しください。