パッケージ org.opengion.fukurou.model

## クラス TableModelHelper

- java.lang.Object
- - org.opengion.fukurou.model.TableModelHelper

-     public class TableModelHelper
      extends Object

  EXCELやテキストファイルを、イベント方式に準拠して、読み込み処理を行います。 TableModelHelperイベントは、openGion形式のファイル読み取りに準拠した方法をサポートします。 ※ openGion形式のEXCEL/テキストファイルとは、#NAME 列に、カラム名があり、#で始まる レコードは、コメントとして判断し、読み飛ばす処理の事です。 このイベントクラスは、サブクラスを作成し、EXCEL関連の EventReader_XLS、EventReader_XLSX クラスや、EventReader_TEXT などのテキスト関連のクラスで、eventReader メソッドの引数に指定します。 EventReader_XLS と、EventReader_XLSX は、対象のEXCEL形式が異なりますが、実際は、 POIUtil#eventReader( String , TableModelHelper ) を使用すれば、拡張子に応じて使用するクラスを 選択します。
  変更履歴:
    6.0.3.0 (2014/11/13) 新規作成, 6.2.0.0 (2015/02/27) パッケージ変更(util → model),クラス名変更(ExcelReaderEvent → TableModelHelper)
  機能分類
    ファイル入力
  バージョン
    6.0
  作成者
    Kazuhiko Hasegawa
  導入されたバージョン:
    JDK7.0,

- - ### コンストラクタの概要

    コンストラクタ
    コンストラクタ | 説明
    --- | ---
    `TableModelHelper()` | デフォルトコンストラクター

  - ### メソッドの概要

    すべてのメソッド インスタンス・メソッド concreteメソッド
    修飾子とタイプ | メソッド | 説明
    --- | --- | ---
    `void` | `columnNames​(String[] names)` | カラム名配列がそろった段階で、イベントが発生します。
    `void` | `endFile​(File file)` | ファイルの読み取り終了時にイベントが発生します。
    `void` | `endSheet​(int shtNo)` | シートの読み取り終了時にイベントが発生します。
    `protected boolean` | `isDebug()` | デバッグ情報を出力するかどうか[true:する/false:しない]を取得します。
    `boolean` | `isNameSet()` | カラム名配列が、設定されたかどうか、返します。
    `protected boolean` | `isSkip​(int rowNo)` | rowNo を元に、この行をスキップするかどうか判定のイベントが発生します。
    `void` | `setConstData​(String constKeys, String constAdrs)` | 固定値となるカラム名(CSV形式)と、固定値となるアドレス(行-列,行-列...) or(A1,B3...)を設定します。
    `void` | `setDebug​(boolean useDebug)` | デバッグ情報を出力するかどうか[true:する/false:しない]を指定します。
    `void` | `setNames​(String clms, boolean useNumber)` | 外部からCSV形式のカラム名文字列を設定します。
    `void` | `setNullBreakClm​(String clm)` | ここに指定されたカラム列に NULL/ゼロ文字列 が現れた時点でSheetの読み取りを中止します。
    `void` | `setNullSkipClm​(String clm)` | ここに指定されたカラム列に NULL が現れたレコードは読み飛ばします。
    `void` | `setReadBreak​(boolean flag)` | 以降のデータを読み飛ばすかどうかを指定します(初期値:false)。
    `void` | `setSkipRowCount​(int count)` | 先頭データの読み飛ばし件数を設定します。
    `void` | `sheetSize​(int size)` | シート数のイベントが発生します。
    `boolean` | `startFile​(File file)` | ファイルの読み取り開始時にイベントが発生します。
    `boolean` | `startSheet​(String shtNm, int shtNo)` | シートの読み取り開始時にイベントが発生します。
    `protected void` | `value​(String line, int rowNo, char sepa)` | 読み取り状態の時に、rowNo にある行データを引数にイベントが発生します。
    `protected boolean` | `value​(String val, int rowNo, int colNo)` | 読み取り状態の時に、rowNo,colNo にあるセルの値を引数にイベントが発生します。
    `void` | `values​(String[] vals, int rowNo)` | row にあるセルのオブジェクト値がそろった段階で、イベントが発生します。

    - ### クラスから継承されたメソッド java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### コンストラクタの詳細

    - #### TableModelHelper

          public TableModelHelper()

      デフォルトコンストラクター
      変更履歴:
        6.4.2.0 (2016/01/29) PMD refactoring. Each class should declare at least one constructor.

  - ### メソッドの詳細

    - #### startFile

          public boolean startFile​(File file)

      ファイルの読み取り開始時にイベントが発生します。 新しいファイルの読み取り開始毎に、１回呼ばれます。 戻り値が、true の場合は、そのファイルの読み取りを継続します。 false の場合は、そのファイルの読み取りは行われません。 初期実装では、固定値設定処理を行っていますので、オーバーライドする場合は、 super.startFile(String,int) してください。 初期実装では、true を返します。
      パラメータ:
        `file` - 読み取りファイル
      戻り値:
        読取継続するか [true:継続/false:読取らない]
      変更履歴:
        6.2.0.0 (2015/02/27) 新規作成

    - #### endFile

          public void endFile​(File file)

      ファイルの読み取り終了時にイベントが発生します。 初期実装では、固定値設定処理を行っていますので、オーバーライドする場合は、 super.endFile(File) してください。
      パラメータ:
        `file` - 読み取りファイル
      変更履歴:
        6.0.3.0 (2014/11/13) 新規作成, 6.1.0.0 (2014/12/26) シートブレイク処理追加

    - #### startSheet

          public boolean startSheet​(String shtNm,
                                    int shtNo)

      シートの読み取り開始時にイベントが発生します。 ※ EXCEL関係以外の読み取りでは、このイベントは発生しません。 新しいシートの読み取り開始毎に、１回呼ばれます。 戻り値が、true の場合は、そのシートの読み取りを継続します。 false の場合は、そのシートの読み取りは行わず、次のシートまで イベントは発行されません。 初期実装では、固定値設定処理を行っていますので、オーバーライドする場合は、 super.startSheet(String,int) してください。 初期実装では、true を返します。
      パラメータ:
        `shtNm` - シート名
        `shtNo` - シート番号(0～)
      戻り値:
        読取継続するか [true:継続/false:読取らない]
      変更履歴:
        6.0.3.0 (2014/11/13) 新規作成

    - #### endSheet

          public void endSheet​(int shtNo)

      シートの読み取り終了時にイベントが発生します。 ※ EXCEL関係以外の読み取りでは、このイベントは発生しません。 #columnNames( String[] ) や、#values( String[] ,int ) などは、行の処理が完了した時点で イベントが呼ばれるため、一番最後のレコードの終了条件が判りません。 そこで、このイベントを呼ぶことで、シートの終了(=最終行の終了)処理を行うことができます。 引数のシート番号は、参考情報で、#startSheet( String,int ) で呼ばれたシート番号と 比較できるようにしています。 初期実装では、固定値設定処理を行っていますので、オーバーライドする場合は、 super.endSheet(int) してください。
      パラメータ:
        `shtNo` - シート番号(0～)
      変更履歴:
        6.0.3.0 (2014/11/13) 新規作成, 6.1.0.0 (2014/12/26) シートブレイク処理追加

    - #### value

          protected void value​(String line,
                               int rowNo,
                               char sepa)

      読み取り状態の時に、rowNo にある行データを引数にイベントが発生します。 ※ 主に、行データの読み込み処理で使用されるメソッドです。 このメソッドは、EventReader#eventReader( String , TableModelHelper )メソッドの 処理の過程で、設定されます。 このメソッドから、各種イベントが発行されます。 行データをセパレータで分解したのち、value( String ,int ,int ) メソッドを呼びます。 ただし、行データが、null、空文字列、#で始まる場合は、呼ばれません。
      パラメータ:
        `line` - 行データ
        `rowNo` - 行番号(0～)
        `sepa` - セパレータ
      変更履歴:
        6.2.0.0 (2015/02/27) 新規作成, 6.2.1.0 (2015/03/13) 先頭に、'0 が含まれる場合のセミコロンや、前後のダブルクオートは削除, 6.2.5.0 (2015/06/05) デバック時に１行単位に出力するのを止めます。, 7.1.0.0 (2020/01/27) セパレータ分割時にデータ分割されない場合は、エンコードエラーの可能性が高い。

    - #### value

          protected boolean value​(String val,
                                  int rowNo,
                                  int colNo)

      読み取り状態の時に、rowNo,colNo にあるセルの値を引数にイベントが発生します。 ※ 主に、EXCEL関係の読み取り処理で使用されるメソッドです。 このメソッドは、EventReader#eventReader( String , TableModelHelper )メソッドの 処理の過程で、設定されます。 このメソッドから、各種イベントが発行されます。 戻り値が、true の場合は、その行の読み取りを継続します。 false の場合は、その行の読み取りは行わず、次の行まで イベントは発行されません。 openGion での標準的な処理は、colNo==0 の時に、val の先頭が、# で 始まる場合は、その行はスキップします。 ここでの return は、#isSkip( int ) と逆になりますので、ご注意ください。 初期実装では、#NAME処理、行スキップ、行終了処理等を実行します。 オーバーライドする場合は、super.value(String,int,int) してください。
      パラメータ:
        `val` - 文字列値
        `rowNo` - 行番号(0～)
        `colNo` - 列番号(0～)
      戻り値:
        読み取りするかどうか(true:読み取りする/false:読み取りしない)
      関連項目:
        `isSkip( int )`
      変更履歴:
        6.0.3.0 (2014/11/13) 新規作成, 6.2.2.0 (2015/03/27) 先頭に、'0 が含まれる場合のセミコロンや、前後のダブルクオートは削除, 6.2.3.0 (2015/05/01) 行読み飛ばし nullSkipClm追加

    - #### isSkip

          protected boolean isSkip​(int rowNo)

      rowNo を元に、この行をスキップするかどうか判定のイベントが発生します。 ※ EXCEL関係の列毎にイベントが発生する場合の列処理をスキップするのが目的です。 行単位に読み込む場合や、行のループに入れても、意味はありません。 引数から、行のループに入れてしまいそうですが、行列のループに入れてください。 ※ 主に、EXCEL関係の読み取り処理で使用されるメソッドです。 このメソッドは、EventReader#eventReader( String , TableModelHelper )メソッドの 処理の過程で、設定されます。 このメソッドから、各種イベントが発行されます。 戻り値が、true の場合は、その行の読み取りをスキップします。 false の場合は、読み取り処理を継続します。 スキップ中は、行に関するイベントは発行されません。 値(val)を求める前に、行情報を入手し、スキップ中の現在行と同じ場合に、スキップ(=true)と判定します。 スキップ中かどうかは、#value( String,int,int ) で、判定します。 初期実装では、スキップ中 かつ 現在行と同じ行の場合、または、シートブレーク中の場合に、true を返します。
      パラメータ:
        `rowNo` - 行番号(0～)
      戻り値:
        スキップするかどうか(true:スキップする/false:スキップしない)
      関連項目:
        `value( String,int,int )`
      変更履歴:
        6.0.3.0 (2014/11/13) 新規作成, 6.1.0.0 (2014/12/26) シートブレイク処理追加

    - #### sheetSize

          public void sheetSize​(int size)

      シート数のイベントが発生します。 ※ EXCEL関係以外の読み取りでは、このイベントは発生しません。 処理の開始前に、シート数のイベントが発生します。 これを元に、処理するシート番号の選別が可能です。
      パラメータ:
        `size` - シート数
      変更履歴:
        6.1.0.0 (2014/12/26) シートの数のイベント

    - #### columnNames

          public void columnNames​(String[] names)

      カラム名配列がそろった段階で、イベントが発生します。 openGion での標準的な処理は、colNo==0 の時に、val の先頭が、#NAME で始まるレコードを、名前配列として認識します。 #value( String,int,int ) で、この #NAME だけは、継続処理されます。 その上で、#NAME レコードが終了した時点で、カラム名配列が完成するので そこで初めて、このメソッドが呼ばれます。(EXCEL関係の場合) 外部から設定する、#setNames( String , boolean ) 時も同様に呼ばれます。
      パラメータ:
        `names` - カラム名配列
      関連項目:
        `value( String,int,int )`, `setNames( String , boolean )`
      変更履歴:
        6.0.3.0 (2014/11/13) 新規作成

    - #### values

          public void values​(String[] vals,
                             int rowNo)

      row にあるセルのオブジェクト値がそろった段階で、イベントが発生します。 初期実装は、何もありません。
      パラメータ:
        `vals` - 文字列値の１行分の配列
        `rowNo` - 行番号(0～)
      変更履歴:
        6.0.3.0 (2014/11/13) 新規作成

    - #### setNames

          public void setNames​(String clms,
                               boolean useNumber)

      外部からCSV形式のカラム名文字列を設定します。 ※ イベント処理実行前の初期化処理です。 カラム名配列を、#NAME で始まるレコードではなく、外部から指定します。 ここで設定した場合、#columnNames( String[] )イベントも発生します。 null か、長さゼロのカラム名は、設定されません。
      パラメータ:
        `clms` - CSV形式のカラム名文字列
        `useNumber` - 行番号情報 [true:使用している/false:していない]
      関連項目:
        `columnNames( String[] )`
      変更履歴:
        6.1.0.0 (2014/12/26) カラム名配列設定の対応

    - #### isNameSet

          public boolean isNameSet()

      カラム名配列が、設定されたかどうか、返します。 カラム名配列は、#NAME で始まるレコードか、#setNames( String,boolean )メソッドを 使用して、外部から指定します。 カラム名配列が未設定の場合は、データもセットできないので、処理の最後の判定に使います。
      戻り値:
        カラム名配列が、設定されたかどうか(true:設定済み/false:未設定)
      関連項目:
        `setNames( String,boolean )`
      変更履歴:
        6.1.0.0 (2014/12/26) カラム名配列設定の対応

    - #### setReadBreak

          public void setReadBreak​(boolean flag)

      以降のデータを読み飛ばすかどうかを指定します(初期値:false)。 データを読み込む途中で、それ以降のデータを読み込む必要がなくなった場合に、 true に設定すると、以降のデータを今のシート/ファイルが終了するまで、スキップします。 例えば、読み込むべき必須カラムで判定する、nullBreakClm 機能を実現できます。 初期値は、false:読み飛ばさない です。
      パラメータ:
        `flag` - 以降のデータを読み飛ばすかどうか [true:読み飛ばす/false:読み飛ばさない]
      関連項目:
        `isSkip( int )`
      変更履歴:
        6.1.0.0 (2014/12/26) シートブレイク処理追加

    - #### setSkipRowCount

          public void setSkipRowCount​(int count)

      先頭データの読み飛ばし件数を設定します。 ※ イベント処理実行前の初期化処理です。 データの読み始めの行を指定します。 シート/ファイルの先頭行が、０行としてカウントしますので、設定値は、読み飛ばす 件数になります。(１と指定すると、１件読み飛ばし、２件目から読み込みます。) 読み飛ばしは、コメント行などは、無視しますので、実際の行数分読み飛ばします。 ＃NAME属性や、columns 属性は、読み飛ばし中でも処理対象行になります。
      パラメータ:
        `count` - 読み始めの初期値(0なら、読み飛ばしなし)
      変更履歴:
        6.1.0.0 (2014/12/26) Excel関係改善

    - #### setNullBreakClm

          public void setNullBreakClm​(String clm)

      ここに指定されたカラム列に NULL/ゼロ文字列 が現れた時点でSheetの読み取りを中止します。 これは、指定のカラムは必須という事を条件に、そのレコードだけを読み取る処理を行います。 複数Sheetの場合は、次のSheetを読みます。 Sheetが存在しない場合(通常のテキスト等)では、読み取り処理の終了になります。
      パラメータ:
        `clm` - カラム列
      変更履歴:
        6.2.0.0 (2015/02/27) 新規追加

    - #### setNullSkipClm

          public void setNullSkipClm​(String clm)

      ここに指定されたカラム列に NULL が現れたレコードは読み飛ばします。 例えば、更新対象カラムで、null の場合は、何もしない、などのケースで使用できます。 複数カラムの場合は、AND条件やOR条件などが、考えられるため、 カラムを一つにまとめて、指定してください。
      パラメータ:
        `clm` - カラム列
      変更履歴:
        6.2.3.0 (2015/05/01) 行読み飛ばし nullSkipClm追加

    - #### setConstData

          public void setConstData​(String constKeys,
                                   String constAdrs)

      固定値となるカラム名(CSV形式)と、固定値となるアドレス(行-列,行-列...) or(A1,B3...)を設定します。 ※ イベント処理実行前の初期化処理です。 アドレスは、EXCEL上の行-列か、EXCEL列のA1,B3 などの形式を、CSV形式で指定します。 行列は、EXCELオブジェクトに準拠するため、０から始まる整数です。 0-0 ⇒ A1 , 1-0 ⇒ A2 , 0-1 ⇒ B1 になります。 これにより、シートの一か所に書かれている情報を、DBTableModel のカラムに固定値として 設定することができます。 例として、DB定義書で、テーブル名をシートの全レコードに設定したい場合などに使います。 5.7.6.3 (2014/05/23) より、 ①EXCEL表記に準拠した、A1,A2,B1 の記述も処理できるように対応します。 なお、A1,A2,B1 の記述は、必ず、英字1文字＋数字 にしてください。(A～Zまで) EXCEL2007形式で列数が拡張されていますが、列数は制限しています。 ②処理中のEXCELシート名をカラムに割り当てるために、"SHEET" という記号に対応します。 6.2.0.0 (2015/02/27) より、 ③EXCEL以外では、"FILE","NAME","SUFIX" が使えます。(EXCEL時にも使えます。) NAME は、ファイル名から拡張子を取り除いた文字列になります。(AAA/BBB/CCC.xls → CCC) 例えば、sheetConstKeys="CLM,LANG,NAME" とし、sheetConstAdrs="0-0,A2,SHEET" とすると、 NAMEカラムには、シート名を読み込むことができます。 これは、内部処理の簡素化のためです。 ちなみに、EXCELのセルに、シート名を表示させる場合の関数は、下記の様になります。 =RIGHT(CELL("filename",$A$1),LEN(CELL("filename",$A$1))-FIND("]",CELL("filename",$A$1)))
      パラメータ:
        `constKeys` - 固定値となるカラム名(CSV形式)
        `constAdrs` - 固定値となるアドレス(行-列,行-列...) or(A1,B3...)
      変更履歴:
        5.5.8.2 (2012/11/09) 新規追加, 5.7.6.3 (2014/05/23) EXCEL表記(A2,B1等)の対応と、特殊記号(SHEET)の対応, 6.1.0.0 (2014/12/26) カラム名配列設定の対応

    - #### setDebug

          public void setDebug​(boolean useDebug)

      デバッグ情報を出力するかどうか[true:する/false:しない]を指定します。 EXCELなどを読み取る場合、シートマージで読み取ると、エラー時の行番号が、連番になるため、 どのシートなのか、判らなくなります。 そこで、どうしてもわからなくなった場合に備えて、デバッグ情報を出力できるようにします。 通常は使用しませんので、設定を無視します。 初期値は、false:デバッグ情報を出力しない です。
      パラメータ:
        `useDebug` - デバッグ出力するか [true:する/false:しない]
      変更履歴:
        6.2.0.0 (2015/02/27) デバッグ情報の出力するかどうか。新規追加

    - #### isDebug

          protected boolean isDebug()

      デバッグ情報を出力するかどうか[true:する/false:しない]を取得します。 EXCELなどを読み取る場合、シートマージで読み取ると、エラー時の行番号が、連番になるため、 どのシートなのか、判らなくなります。 そこで、どうしてもわからなくなった場合に備えて、デバッグ情報を出力できるようにします。
      戻り値:
        デバッグ出力 [true:する/false:しない]
      変更履歴:
        6.2.0.0 (2015/02/27) デバッグ情報の出力するかどうか。新規追加