001/*
002 * Copyright (c) 2009 The openGion Project.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
013 * either express or implied. See the License for the specific language
014 * governing permissions and limitations under the License.
015 */
016package org.opengion.hayabusa.io;
017
018import java.io.PrintWriter;
019import java.util.List;
020
021import org.opengion.hayabusa.db.DBTableModel;
022import org.opengion.fukurou.util.HybsEntry;
023
024/**
025 * DBTableModel インターフェース のオブジェクトをPrintWriter を用いて出力する為の共通インターフェースです。
026 *
027 * @og.group ファイル出力
028 *
029 * @version  4.0
030 * @author   Kazuhiko Hasegawa
031 * @since    JDK5.0,
032 */
033public interface TableWriter {
034
035        /** タブ項目区切り文字    */
036        String TAB_SEPARATOR = "\t";            // タブ項目区切り文字
037
038        /** カンマ項目区切り文字   */
039        String CSV_SEPARATOR = ",";                     // カンマ項目区切り文字  3.5.6.0 (2004/06/18)
040
041        /**
042         * DBTableModel から 各形式のデータを作成して PrintWriter に書き出します。
043         * このメソッドは、EXCEL 書き出し時に使用します。
044         *
045         * @og.rev 4.0.0.0 (2006/09/31) 新規追加
046         * @see #isExcel()
047         */
048        void writeDBTable() ;
049
050        /**
051         * DBTableModel から 各形式のデータを作成して PrintWriter に書き出します。
052         *
053         * @og.rev 3.5.4.3 (2004/01/05) 引数に PrintWriter を受け取るように変更します。
054         *
055         * @param       writer PrintWriterオブジェクト
056         */
057        void writeDBTable( final PrintWriter writer ) ;
058
059        /**
060         * DBTableModel をセットします。
061         *
062         * @og.rev 3.5.4.2 (2003/12/15) lang 引数も同時に設定します。
063         *
064         * @param       table   DBTableModelオブジェクト
065         * @param       lang    言語
066         */
067        void setDBTableModel( final DBTableModel table, final String lang ) ;
068
069        /**
070         * 内部の DBTableModel を返します。
071         *
072         * @return  DBTableModelオブジェクト
073         */
074        DBTableModel getDBTableModel() ;
075
076        /**
077         * DBTableModelの出力順をセットします。
078         * Label,Name,Size,Class,Data の各フィールドの頭文字のアルファベットで
079         * 出力順を設定します。
080         *
081         * ※ 7.2.6.1 (2020/07/17) H:Header(ヘッダー)属性追加
082         *
083         * @param   headerSequence 出力順 (LNSCD など)
084         */
085        void setHeaderSequence( final String headerSequence ) ;
086
087        /**
088         * DBTableModelの出力順を返します。
089         * Label,Name,Size,Class,Data の各フィールドの頭文字のアルファベットで
090         * 出力順を設定します。
091         *
092         * @return  出力順 (LNSCD など)
093         */
094        String getHeaderSequence() ;
095
096        /**
097         * データを書き込む場合の区切り文字をセットします。
098         * なお、このメソッドは、サブクラスによっては使用しない場合があります。
099         * もし、使用しないサブクラスを作成する場合は UnsupportedOperationException
100         * を throw するようにサブクラスで実装して下さい。
101         *
102         * @param   separator 区切り文字
103         */
104        void setSeparator( final String separator ) ;
105
106        /**
107         * DBTableModelのデータとして書き込むときに、追加モードで書き込むかどうか[true/false]を設定します。
108         *
109         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
110         *
111         * @param   flag 追加モードで書き込むかどうか[true:追加モード/false:通常モード]
112         */
113        void setAppend( final boolean flag ) ;
114
115        /**
116         * DBTableModelのデータとして書き込むときに、追加モードで書き込むかどうかを取得します。
117         *
118         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
119         *
120         * @return      追加モードで書き込むかどうか[true:追加モード/false:通常モード]
121         */
122        boolean isAppend() ;
123
124        /**
125         * DBTableModelのデータとして書き込むときのシート名を設定します。
126         * これは、EXCEL追加機能として実装されています。
127         *
128         * @og.rev 3.5.4.2 (2003/12/15) 新規追加
129         *
130         * @param   sheetName シート名
131         */
132        void setSheetName( final String sheetName ) ;
133
134        /**
135         * EXCEL雛型参考ファイルのシート名を設定します。
136         * これは、EXCEL追加機能として実装されています。
137         *
138         * EXCELファイルを書き出す時に、雛型として参照するシート名を指定します。
139         * これにより、複数の形式の異なるデータを順次書き出したり(appendモードを併用)する
140         * ことや、シートを指定して新規にEXCELを作成する場合にフォームを設定する事が可能になります。
141         * 初期値は、null(第一シート) です。
142         *
143         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
144         *
145         * @param   sheetName シート名
146         */
147        void setRefSheetName( final String sheetName ) ;
148
149        /**
150         * このクラスが、EXCEL対応機能を持っているかどうかを返します。
151         *
152         * EXCEL対応機能とは、シート名のセット、雛型参照ファイル名のセット、
153         * 書き込み元ファイルのFileオブジェクト取得などの、特殊機能です。
154         * 本来は、インターフェースを分けるべきと考えますが、taglib クラス等の
155         * 関係があり、問い合わせによる条件分岐で対応します。
156         *
157         * @og.rev 3.5.4.3 (2004/01/05) 新規追加
158         *
159         * @return      EXCEL対応機能を持っているかどうか
160         */
161        boolean isExcel() ;
162
163        /**
164         * 出力先ディレクトリとファイル名をセットします。
165         * これは、EXCEL追加機能として実装されています。
166         *
167         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
168         * @og.rev 6.0.2.0 (2014/09/19) ディレクトリとファイルを分けて管理します。
169         *
170         * @param   directory 出力先ディレクトリ名
171         * @param   filename  出力先ファイル名
172         */
173        void setFilename( final String directory , final String filename ) ;
174
175        /**
176         * EXCEL雛型参考ファイル名をセットします。(DIR + Filename)
177         * これは、EXCEL追加機能として実装されています。
178         *
179         * @og.rev 3.5.4.3 (2004/01/05) 新規作成
180         *
181         * @param   filename EXCEL雛型参考ファイル名
182         */
183        void setRefFilename( final String filename ) ;
184
185        /**
186         * 雛形のシート名を、そのまま使用する(true)か、新規、または、外部指定のシート名を使用する(false)を指定します。(初期値:false[外部指定のシート名を使用])。
187         *
188         * ※ Ver5では、追記モード時に、指定シートが存在した場合は上書きします(初期値:false[上書きしない])。5.9.12.1 (2016/09/09)
189         *    Ver6では、追記モード時に、雛形を指定できないため、雛形のシート名を、そのまま使用する(true)か、
190         *    新規、または、外部指定のシート名を使用する(false)を指定する属性になります。
191         *
192         * @og.rev 6.5.0.0 (2016/09/30) sheetOverwrite で、雛形シートの使用時に、元のシート名を使用します。
193         *
194         * @param   flag 元のシート名を使用するかどうか[true:使用する/false:新規、または、外部指定のシート名を使用]
195         */
196        void setSheetOverwrite( final boolean flag ) ;
197
198        /**
199         * EXCELで、出力処理の最後にセルの計算式の再計算をさせるシート名をCSV形式で指定します。
200         *
201         * @og.rev 6.5.0.0 (2016/09/30) recalcSheetName で、セル内の計算式を再計算させるシート名を指定。5.9.12.1 (2016/09/09)
202         *
203         * @param  sheet 対象シート名をCSV形式で指定
204         */
205        void setRecalcSheetName( final String sheet ) ;
206
207        /**
208         * EXCEL出力時のデフォルトフォント名を設定します。
209         * これは、EXCEL追加機能として実装されています。
210         *
211         * EXCELファイルを書き出す時に、デフォルトフォント名を指定します。
212         * フォント名は、EXCELのフォント名をそのまま使用してください。
213         * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontName( String )
214         * に設定されます。
215         * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_NAME です。
216         *
217         * @og.rev 3.8.5.3 (2006/08/07) 新規追加
218         *
219         * @param   fontName デフォルトフォント名
220         */
221        void setFontName( String fontName ) ;
222
223        /**
224         * EXCEL出力時のデフォルトフォントポイント数を設定します。
225         * これは、EXCEL追加機能として実装されています。
226         *
227         * EXCELファイルを書き出す時に、デフォルトポイント数を指定します。
228         * 内部的に、POI の org.apache.poi.hssf.usermodel.HSSFFont#setFontHeightInPoints( short )
229         * に設定されます。
230         * 初期値は、システムリソース の TABLE_WRITER_DEFAULT_FONT_POINTS です。
231         *
232         * @og.rev 3.8.5.3 (2006/08/07) 新規追加
233         *
234         * @param   point フォントポイント数
235         */
236        void setFontPoint( short point ) ;
237
238        /**
239         * 読み取り元ファイルのエンコード文字列を指定します。
240         * ファイルは、BufferedReader で受け取る為、本来は、エンコードは不要ですが、
241         * 固定長ファイルの読み取り時のバイトコード分割時に、指定のエンコードで
242         * 分割する必要があります。(例えば、半角文字は、Shift_JIS では、1バイト)
243         *
244         * @og.rev 3.5.4.5 (2004/01/23) 新規作成
245         *
246         * @param   enc ファイルのエンコード文字列
247         */
248        void setEncode( final String enc ) ;
249
250        /**
251         * 行番号情報を、出力する(true)/しない(false)を指定します。
252         *
253         * 通常のフォーマットでは、各行の先頭に行番号を出力します。
254         * これは、#NAME 属性を使用する場合には、必ず出力する必要があります。
255         * (#NAME 属性は、読み取り時には、必須です。)
256         * この、先頭の行番号が不要な場合(つまり、他のシステムへのデータ出力、
257         * このシステムでは、#NAME 属性が出力されないため、読み込みできません。)
258         * この行番号を出力しないようにできます。
259         * 初期値は、true(出力する) です。
260         *
261         * @og.rev 3.7.0.2 (2005/02/14) 新規追加
262         *
263         * @param   useNumber 行番号情報 [true:出力する/false:しない]
264         */
265        void setUseNumber( final boolean useNumber ) ;
266
267        /**
268         * パラメーターリストをセットします。
269         * 内部は、HybsEntry クラスを持っています。
270         * 引数が、null の場合は、何もしません。
271         *
272         * @og.rev 4.0.0.0 (2005/01/31) 新規追加
273         *
274         * @param       listParam       パラメーターリスト
275         */
276        void setParam( final List<HybsEntry> listParam ) ;
277
278        /**
279         * 出力先ファイルのカラム列を、外部(タグ)より指定します。
280         * ただし、指定のカラム名は、DBTableModel上に存在している必要があります。
281         *
282         * @og.rev 4.0.0.0 (2005/11/30) 新規追加
283         *
284         * @param   clms 出力先ファイルのカラム列(CSV形式)
285         */
286        void setColumns( final String clms ) ;
287
288        /**
289         * 書き込み対象外のカラム列を、外部(タグ)よりCSV形式で指定します。
290         *
291         * 指定するカラム名に対して、書き込み処理を行いません。
292         * ここで指定するカラム名は、検索したDBTableModel上に含まれる必要はありません。
293         * その場合は、ここでの指定は無視されます。
294         *
295         * @og.rev 6.1.0.0 (2014/12/26) omitNames 属性を追加
296         *
297         * @param   clms 書き込み対象外のカラム列(CSV形式)
298         */
299        void setOmitNames( final String clms ) ;
300
301        /**
302         * データの書き込み開始位置を設定します(初期値:0)。
303         *
304         * TAB区切りテキストやEXCEL等のデータの書き込みの開始位置を指定します。
305         * 属性名は、行を飛ばす処理ということで、readTable タグと同じ名称です。
306         * ファイルの先頭行が、0行としてカウントしますので、設定値は、読み飛ばす
307         * 件数になります。(1と指定すると、1件読み飛ばし、2行目から読み込みます。)
308         * 行の読み飛ばしと、カラムの読み飛ばし(columns)、refFileURL、refFilename、
309         * refSheetName とともに使用すれば、ある程度のレイアウト設定が可能です。
310         * なお、この機能は、TableWriter_Excel のみに実装します。
311         *
312         * @og.rev 5.7.9.0 (2014/08/08) 新規作成
313         *
314         * @param       skipRowCount 書き込み開始位置
315         */
316        void setSkipRowCount( int skipRowCount );
317
318        /**
319         * EXCEL出力時に、データを書き込んだ範囲に罫線を入れるかどうかを指定します。
320         *
321         * データを書き込んでEXCELを作成しても、ノーマルのセルに値がセットされている
322         * だけなので、ある程度加工が必要です。
323         * そこで、データのセットされたセルに罫線を入れることで、それなりのデータが
324         * 出力された感じになります。
325         * この設定と、useAutoCellSize="true" で、セルの幅を自動調整すれば、見栄えが良くなります。
326         * なお、この機能は、TableWriter_Excel のみに実装します。
327         *
328         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
329         *
330         * @param       useCellStyle 罫線を入れるかどうか(true:入れる/false:入れない)
331         * @see         #setUseAutoCellSize( boolean )
332         */
333        void setUseCellStyle( final boolean useCellStyle );
334
335        /**
336         * EXCEL出力時に、セルの幅をデータの幅に自動的に合わせるかどうかを指定します。
337         *
338         * データを書き込んでEXCELを作成しても、ノーマルのセルに値がセットされている
339         * だけなので、ある程度加工が必要です。
340         * そこで、データのセットされたセルの幅を自動調整することで、それなりのデータが
341         * 出力された感じになります。
342         * この設定と、useCellStyle="true" で、セルの罫線を自動設定すれば、見栄えが良くなります。
343         * なお、この機能は、TableWriter_Excel のみに実装します。
344         *
345         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
346         *
347         * @param       useAutoCellSize データの幅に自動的に合わせるかどうか(true:自動調整/false:何もしない)
348         * @see         #setUseCellStyle( boolean )
349         */
350        void setUseAutoCellSize( final boolean useAutoCellSize );
351
352        /**
353         * EXCEL出力時に、セルの有効範囲を設定するかどうかを指定します。
354         *
355         * セルの有効範囲というのは、EXCELでの 空行、空列の存在しない範囲を指します。
356         * 通常、空行でも、データとして残っている場合は、EXCELのセルオブジェクトは存在します。
357         * ここで、useActiveWorkbook="true" とすると、空行、空列を削除します。
358         *
359         * 雛形を使用した場合は、データより多めに設定した計算などは、この処理で
360         * 削除されますので、データサイズにフィットさせることができます。
361         * なお、この機能は、TableWriter_Excel のみに実装します。
362         *
363         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
364         *
365         * @param       useActiveWorkbook セルの有効範囲を設定するかどうか(true:設定する/false:そのまま)
366         */
367        void setUseActiveWorkbook( final boolean useActiveWorkbook );
368
369        /**
370         * EXCEL出力時に、シート変更するキーとなるカラム名を指定します(このカラムの値がシート名になります)。
371         *
372         * EXCEL帳票では、帳票雛形に、PAGE_BRAKE キーを設定しましたが、TableWriterでは、
373         * メモリ上のカラムの値が変更したときに、シート変更させることができます。
374         * このカラムの値がキーブレイクすると、新しいシートに書き出し始めます。
375         * シート名は、このカラムの値(キーブレイクする値)です。
376         *
377         * 雛形ファイルを使用する場合、雛形シートもキーブレイクに伴って、+1されます。
378         * つまり、雛形シートとデータシートは同時に変更されます。
379         * ただし、雛形シートは、最後の雛形シートで止まります。
380         * これは、雛形シートにヘッダー雛形とボディ雛形を用意しておき、最初のキーブレイクで
381         * ヘッダーからボディの書き込みにチェンジするイメージで使用できます。
382         * なお、この機能は、TableWriter_Excel のみに実装します。
383         *
384         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
385         *
386         * @param       pageBreakColumn シート変更するキーとなるカラム名を指定
387         * @see         #setFileBreakColumn( String )
388         */
389        void setPageBreakColumn( final String pageBreakColumn );
390
391        /**
392         * EXCEL出力時に、ファイル名を変更するキーとなるカラム名を指定します(このカラムの値がファイル名になります)。
393         *
394         * EXCEL帳票では、メモリ上のカラムの値が変更したときに、ファイル名を変更することができます。
395         * このカラムの値がキーブレイクすると、新しいファイルに書き出し始めます。
396         * ファイル名は、このカラムの値(キーブレイクする値)+ 元の出力ファイル名の拡張子(.xlsなど)です。
397         * この設定を使用する場合は、出力ファイル名は無視されますが、拡張子だけは使用されます。
398         *
399         * 雛形ファイルを使用する場合、雛形ファイルもキーブレイクに伴って、再利用されます。
400         * 例えば、pageBreakColumn と併用する場合、キーブレイクで雛形シートも最初から適用になります。
401         * なお、この機能は、TableWriter_Excel のみに実装します。
402         *
403         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
404         *
405         * @param       fileBreakColumn ファイル名を変更するキーとなるカラム名を指定
406         * @see         #setPageBreakColumn( String )
407         */
408        void setFileBreakColumn( final String fileBreakColumn );
409
410        /**
411         * EXCEL出力時に、Hyperlinkを作成するキーとなるカラム名と値となるカラム名を指定します。
412         *
413         * ここで、作成するハイパーリンクは、EXCELのシートに対するハイパーリンクです。
414         * それ以外のリンク(本当のURLやファイル等)のリンクは(今は)作成できません。
415         * ハイパーリンクを作成するには、①作成するカラム と ②作成する値 が必要です。
416         * このメソッドで設定するのは、「①:②」という形式でカラム名を指定します。
417         * ②がなければ、①と同じとします。
418         * ②の値のシートの存在有無は、無視します。ハイパーリンクを作成するシートを作成する前に
419         * ハイパーリンクを作成するケースが存在します。
420         * (例えば、各シートへのリンクを持った一覧を作成してから、明細の各シートを作成する様なケース)
421         * なお、この機能は、TableWriter_Excel のみに実装します。
422         *
423         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
424         *
425         * @param       hyperLinkColumn Hyperlinkを作成するキーとなるカラム名と値となるカラム名を指定
426         */
427        void setHyperLinkColumn( final String hyperLinkColumn ) ;
428
429        /**
430         * EXCEL出力時に、Sheet一覧を先頭Sheetに作成する場合のSheet名を指定します。
431         *
432         * これは、Workbook に含まれる Sheet 一覧を作成する場合に、利用可能です。
433         * なお、この機能は、TableWriter_Excel のみに実装します。
434         *
435         * @og.rev 6.0.2.0 (2014/09/19) 新規作成
436         *
437         * @param       sheetName EXCELファイルのシート名
438         */
439        void setAddTitleSheet( final String sheetName );
440
441        /**
442         * 書込処理でコードリソースのラベル変換を行うかどうかを指定します。
443         *
444         * コードリソースをそのままの値で出力すると、数字や記号になり何が書かれているのか
445         * 不明になります。
446         * これは、コードリソースをラベルに変換して出力するかどうかを指定します。
447         * 当然、コードはユニークですが、ラベルはユニークになるかどうか保障はされていませんので
448         * TableReader 系で読み込む場合には、リスクが発生します。
449         * また、TableReader 系で読み込む場合にも、ラベルからコードを求める逆変換を行うように、
450         * setUseRenderer メソッドで指定する必要があります。
451         *
452         * 従来は、TableWriter 系に、TableWriter_Renderer 系のクラスを作って対応していましたが、
453         * このメソッドの属性値のフラグで、制御します。
454         *
455         * @og.rev 5.2.1.0 (2010/10/01) 新規作成
456         *
457         * @param       useRenderer     コードリソースのラベル変換を行うかどうかを指定
458         */
459        void setUseRenderer( final boolean useRenderer ) ;
460
461        /**
462         * デバッグ情報を出力するかどうかを指定します。
463         *
464         * EXCELなどを書き出す場合、シートブレイクやファイルブレイク時の行番号が、検索時の行番号と
465         * 異なる為、エラー時の判定が難しくなります。
466         * そこで、どうしてもわからなくなった場合に備えて、デバッグ情報を出力できるようにします。
467         * 通常は使用しませんので、設定を無視します。
468         * 初期値は、false:デバッグ情報を出力しない です。
469         *
470         * @og.rev 6.1.0.0 (2014/12/26) デバッグ情報を出力するかどうかを指定
471         *
472         * @param       useDebug        デバッグ情報を出力するかどうかを指定
473         */
474        void setDebug( final boolean useDebug ) ;
475}