クラス POIUtil
java.lang.Object
org.opengion.fukurou.model.POIUtil
POI による、Excel/Word/PoworPoint等に対する、ユーティリティクラスです。
基本的には、ネイティブファイルを読み取り、テキストを取得する機能が主です。
Excel、Word、PowerPoint、Visio、Publisher からのテキスト取得が可能です。
- 変更履歴:
- 6.0.2.0 (2014/09/19) 新規作成, 6.2.0.0 (2015/02/27) パッケージ変更(util → model)
- 機能分類
- その他
- 導入されたバージョン:
- JDK7.0,
-
フィールドの概要
フィールド -
メソッドの概要
修飾子とタイプメソッド説明static void
activeWorkbook
(org.apache.poi.ss.usermodel.Workbook wkbook, boolean isCellDel) 指定の Workbook の全Sheetを対象に、空行を取り除き、全体をシュリンクします。static void
activeWorkbook
(org.apache.poi.ss.usermodel.Workbook wkbook, List<Integer> rowCntList) 指定の Workbook の全Sheetを対象に、実際の有効行と有効カラムを元に全体をシュリンクします。static void
autoCellSize
(org.apache.poi.ss.usermodel.Workbook wkbook, int maxColCount, int dataStRow) 全てのSheetに対して、autoSizeColumn設定を行います。static org.apache.poi.ss.usermodel.Workbook
createWorkbook
(File file) ファイルから、Workbookオブジェクトを新規に作成します。static void
excelReader1
(File file, TextConverter<String, String> conv) 引数ファイル(Excel)を、テキスト化します。static void
excelReader2
(File file, TextConverter<String, String> conv) 引数ファイル(Excel)を、テキスト化します。static String
引数ファイルを、POITextExtractor を使用してテキスト化します。static String
引数ファイル(Text)を、テキスト化します。static String
getCelKigo
(int rowNo, int colNo) Excelの行番号,列番号より、セル記号を求めます。static String
getCellMsg
(org.apache.poi.ss.usermodel.Cell oCell) セル情報を返します。static String[]
getNames
(org.apache.poi.ss.usermodel.Workbook wkbook) 名前定義一覧を取得します。static String
getNumericTypeString
(org.apache.poi.ss.usermodel.Cell oCell) セル値が数字の場合に、数字か日付かを判断して、対応する文字列を返します。static String[]
getSheetNames
(org.apache.poi.ss.usermodel.Workbook wkbook) シート一覧を、Workbook から取得します。static String[]
getStyleNames
(org.apache.poi.ss.usermodel.Workbook wkbook) 書式のスタイル一覧を取得します。static String
getValue
(org.apache.poi.ss.usermodel.Cell oCell) セルオブジェクト(Cell)から値を取り出します。static boolean
引数ファイルが、POI関連の拡張子ファイルかどうかを判定します。static boolean
isReadText
(File file) 引数ファイルが、textReader の読み取り対象となる拡張子ファイルかどうかを判定します。static boolean
引数ファイルが、処理対象となるテキスト関連の拡張子ファイルかどうかを判定します。static int[]
kigo2rowCol
(String kigo) Excelの行列記号を、行番号と列番号に分解します。static void
アプリケーションのサンプルです。static void
makeShapeColor
(org.apache.poi.xssf.usermodel.XSSFSimpleShape shape, int[] col) XSSFSimpleShapeオブジェクトにカラーを設定します。static void
makeShapeLink
(org.apache.poi.xssf.usermodel.XSSFSimpleShape shape, String url) XSSFSimpleShapeオブジェクトにリンクを設定します。static void
pdfReader1
(File file, TextConverter<String, String> conv) 引数ファイル(PDF)を、テキスト化します。static void
セルオブジェクト(Cell)に、値をセットします。static void
textReader
(File file, TextConverter<String, String> conv) 引数ファイル(Word,PoworPoint,Excel)を、TableModelHelper を使用してテキスト化します。static void
textReader
(File file, TextConverter<String, String> conv, String encode) 引数ファイル(Text)を、テキスト化します。
-
フィールド詳細
-
POI_SUFIX
POI対象サフィックス "ppt,pptx,doc,docx,xls,xlsx,xlsm"- 関連項目:
-
TXT_SUFIX
テキスト対象サフィックス "txt,csv,jsp,java,html,xml,css,js,json,py"- 関連項目:
-
-
メソッドの詳細
-
isPOI
引数ファイルが、POI関連の拡張子ファイルかどうかを判定します。 Excel、Word、PowerPoint、Visio、Publisher からのテキスト取得が可能です。 ファイルの拡張子が、"ppt,pptx,doc,docx,xls,xlsx,xlsm" の場合、true を返します。- パラメータ:
file
- 判定するファイル- 戻り値:
- POI関連の拡張子の場合、true
- 変更履歴:
- 6.2.3.0 (2015/05/01) POI関連の拡張子ファイルかどうかを判定
-
isText
引数ファイルが、処理対象となるテキスト関連の拡張子ファイルかどうかを判定します。 ファイルの拡張子が、"txt,csv,jsp,java,html,xml,css,js,json,py" の場合、true を返します。- パラメータ:
file
- 判定するファイル- 戻り値:
- テキスト関連の拡張子の場合、true
- 変更履歴:
- 8.5.0.0 (2023/04/21) 新規追加
-
isReadText
引数ファイルが、textReader の読み取り対象となる拡張子ファイルかどうかを判定します。 ファイルの拡張子が "ppt,pptx,doc,docx,xls,xlsx,xlsm"、"txt,csv,jsp,java,html,xml,css,js,json,py"、pdf の場合、true を返します。- パラメータ:
file
- 判定するファイル- 戻り値:
- テキスト関連の拡張子の場合、true
- 変更履歴:
- 8.5.0.0 (2023/05/12) 新規追加
-
extractor
引数ファイルを、POITextExtractor を使用してテキスト化します。 Excel、Word、PowerPoint、Visio、Publisher からのテキスト取得が可能です。 拡張子から、ファイルの種類を自動判別します。- パラメータ:
file
- 入力ファイル名- 戻り値:
- 変換後のテキスト
- 変更履歴:
- 6.0.2.0 (2014/09/19) 新規作成, 6.2.0.0 (2015/02/27) getText → extractor に変更, 8.0.0.0 (2021/07/31) ExtractorFactory → POIXMLExtractorFactory に変更
- このメソッドは、nullを返しません
-
extractor
引数ファイル(Text)を、テキスト化します。 ここでは、ファイルとエンコードを指定して、ファイルのテキスト全てを読み取ります。- パラメータ:
file
- 入力ファイルencode
- エンコード名- 戻り値:
- ファイルのテキスト
- 変更履歴:
- 6.2.2.0 (2015/03/27) 引数ファイル(Text)を、テキスト化。, 6.2.3.0 (2015/05/01) textReader → extractor に変更
-
textReader
引数ファイル(Text)を、テキスト化します。 ここでは、ファイルとエンコードを指定して、ファイルのテキスト全てを読み取ります。- パラメータ:
file
- 入力ファイルconv
- イベント処理させるI/Fencode
- エンコード名- 変更履歴:
- 6.2.2.0 (2015/03/27) 引数ファイル(Text)を、テキスト化。, 8.5.4.2 (2024/01/12) テキストのコメントに返す行番号に、+1 しておく。, 8.5.4.2 (2024/01/12) PMD 7.0.0 CloseResource 対応
-
textReader
引数ファイル(Word,PoworPoint,Excel)を、TableModelHelper を使用してテキスト化します。 ここでは、ファイル名の拡張子で、処理するメソッドを選別します。 拡張子が、対象かどうかは、#isPOI( File ) メソッドで判定できます。 TableModelHelper によるイベント処理できますが、TEXTというカラム名を持つ 表形式オブジェクトの形で処理されます。 また、内部的に、先頭に、# がある場合や、行データが存在しない場合は、 スキップされます。- パラメータ:
file
- 入力ファイルconv
- イベント処理させるI/F- 変更履歴:
- 6.2.3.0 (2015/05/01) 新規作成, 6.2.5.0 (2015/06/05) xls,xlsxは、それぞれ excelReader1,excelReader2 で処理します。, 8.5.0.0 (2023/04/21) txt,csv,jsp,java,xml,css,js は、UTF-8 固定で、textReader を呼び出す。, 8.5.0.0 (2023/05/12) pdfReader1 追加, 8.5.4.0 (2023/12/01) 拡張子無しの対応
-
excelReader1
引数ファイル(Excel)を、テキスト化します。 TableModelHelper を与えることで、EXCELデータをテキスト化できます。 ここでは、HSSF(.xls)形式を処理します。 シート名、セル、テキストオブジェクトをテキスト化します。- パラメータ:
file
- 入力ファイルconv
- イベント処理させるI/F- 関連項目:
- 変更履歴:
- 6.2.5.0 (2015/06/05) 新規作成
-
excelReader2
引数ファイル(Excel)を、テキスト化します。 TableModelHelper を与えることで、EXCELデータをテキスト化できます。 ここでは、ExcelModelを使用して、(.xlsx , .xlsm)形式を処理します。 シート名、セル、テキストオブジェクトをテキスト化します。- パラメータ:
file
- 入力ファイルconv
- イベント処理させるI/F- 関連項目:
- 変更履歴:
- 6.2.5.0 (2015/06/05) 新規作成, 6.3.1.0 (2015/06/28) TextConverterに、引数(cmnt)を追加, 6.3.9.0 (2015/11/06) Java 8 ラムダ式に変更
-
pdfReader1
引数ファイル(PDF)を、テキスト化します。 引数ファイル(PDF)を、pdfbox を使用してテキスト化します。- パラメータ:
file
- 入力ファイルconv
- イベント処理させるI/F- 変更履歴:
- 8.5.0.0 (2023/05/12) pdfReader1 追加, 8.5.4.2 (2024/01/12) PDFのページを直接開けるように、cmnt を変更する。
-
kigo2rowCol
Excelの行列記号を、行番号と列番号に分解します。 Excelの行列記号とは、A1 , B5 , AA23 などの形式を指します。 これを、行番号と列番号に分解します。例えば、A1→0行0列、B5→4行1列、AA23→22行26列 となります。 分解した結果は、内部変数の、rowNo と colNo にセットされます。 これらは、0 から始まる int型の数字で表します。 ①行-列形式 行列は、EXCELオブジェクトに準拠するため、0から始まる整数です。 0-0 ⇒ A1 , 1-0 ⇒ A2 , 0-1 ⇒ B1 になります。 ②EXCEL表記 EXCEL表記に準拠した、A1,A2,B1 の記述も処理できるように対応します。 なお、A1,A2,B1 の記述は、必ず、英字1文字+数字 にしてください。(A~Zまで) ③EXCELシート名をキーに割り当てるために、"SHEET" という記号に対応します。 rowNo = -1 をセットします。- パラメータ:
kigo
- Excelの行列記号( A1 , B5 , AA23 など )- 戻り値:
- 行と列の番号を持った配列([0]=行=ROW , [1]=列=COL)
- 変更履歴:
- 6.0.3.0 (2014/11/13) 新規作成, 6.2.6.0 (2015/06/19) 行-列形式と、SHEET文字列判定を採用。
- このメソッドは、nullを返しません
-
getValue
セルオブジェクト(Cell)から値を取り出します。 セルオブジェクトが存在しない場合は、null を返します。 それ以外で、うまく値を取得できなかった場合は、ゼロ文字列を返します。- パラメータ:
oCell
- EXCELのセルオブジェクト- 戻り値:
- セルの値
- 変更履歴:
- 3.8.5.3 (2006/08/07) 取り出し方法を少し修正, 5.5.1.2 (2012/04/06) フォーマットセルを実行して、その結果を再帰的に処理する。, 6.0.3.0 (2014/11/13) セルフォーマットエラー時に、RuntimeException を throw しない。, 6.4.2.0 (2016/01/29) StringUtil#ogStackTrace(Throwable) を、ThrowUtil#ogStackTrace(String,Throwable) に置き換え。, 6.5.0.0 (2016/09/30) poi-3.15 対応(Cell.CELL_TYPE_XXXX → CellType.XXXX), 7.0.0.0 (2018/10/01) 警告:[deprecation] CellのgetCellTypeEnum()は推奨されません (POI4.0.0), 7.3.0.0 (2021/01/06) フォーマットエラー時に、エラーメッセージ取得でもエラーになる。, 8.0.0.0 (2021/07/31) FORMULA処理のエラー対応(出来るだけ…), 8.1.2.3 (2022/05/20) 計算式の計算を行う。, 8.5.0.0 (2023/04/21) セルフォーマット処理エラー時には、スタックトレースは出さずに計算式を返す。, 8.5.5.1 (2024/02/29) switch式の使用
-
setValue
セルオブジェクト(Cell)に、値をセットします。 セルオブジェクトが存在しない場合は、何もしません。 引数は、文字列で渡しますが、セルの形式に合わせて、変換します。 変換がうまくいかなかった場合は、エラーになりますので、ご注意ください。- パラメータ:
oCell
- EXCELのセルオブジェクトval
- セットする値- 変更履歴:
- 6.3.9.0 (2015/11/06) 新規追加, 6.5.0.0 (2016/09/30) poi-3.15 対応(Cell.CELL_TYPE_XXXX → CellType.XXXX), 7.0.0.0 (2018/10/01) 警告:[deprecation] CellのgetCellTypeEnum()は推奨されません (POI4.0.0), 7.3.0.0 (2021/01/06) setCellType( CellType.BLANK )(Deprecated) → setBlank() (poi-4.1.2), 8.5.5.1 (2024/02/29) switch文にアロー構文を使用
-
getNumericTypeString
セル値が数字の場合に、数字か日付かを判断して、対応する文字列を返します。- パラメータ:
oCell
- EXCELのセルオブジェクト- 戻り値:
- 数字の場合は、文字列に変換した結果を、日付の場合は、"yyyyMMddHHmmss" 形式で返します。
- 変更履歴:
- 3.8.5.3 (2006/08/07) 新規追加, 5.5.7.2 (2012/10/09) HybsDateUtil を利用するように修正します。, 6.3.1.0 (2015/06/28) ExcelStyleFormat を使用します。
-
autoCellSize
public static void autoCellSize(org.apache.poi.ss.usermodel.Workbook wkbook, int maxColCount, int dataStRow) 全てのSheetに対して、autoSizeColumn設定を行います。 重たい処理なので、ファイルの書き出し直前に一度だけ実行するのがよいでしょう。 autoSize設定で、カラム幅が大きすぎる場合、現状では、 初期カラム幅のmaxColCount倍を限度に設定します。 ただし、maxColCount がマイナスの場合は、無制限になります。- パラメータ:
wkbook
- 処理対象のWorkbookmaxColCount
- 最大幅を標準セル幅の何倍にするかを指定。マイナスの場合は、無制限dataStRow
- データ行の開始位置。未設定時は、-1- 変更履歴:
- 6.0.2.0 (2014/09/19) 新規作成, 6.8.2.4 (2017/11/20) rowObj のnull対策(poi-3.17)
-
activeWorkbook
指定の Workbook の全Sheetを対象に、空行を取り除き、全体をシュリンクします。 この処理は、#saveFile( String ) の直前に行うのがよいでしょう。 ここでは、Row を逆順にスキャンし、Cellが 存在しない間は、行を削除します。 途中の空行の削除ではなく、最終行からの連続した空行の削除です。 isCellDel=true を指定すると、Cellの末尾削除を行います。 有効行の最後のCellから空セルを削除していきます。 表形式などの場合は、Cellのあるなしで、レイアウトが崩れる場合がありますので 処理が不要な場合は、isCellDel=false を指定してください。- パラメータ:
wkbook
- 処理対象のWorkbookisCellDel
- Cellの末尾削除を行うかどうか(true:行う/false:行わない)- 関連項目:
- 変更履歴:
- 6.0.2.0 (2014/09/19) 新規作成, 6.0.2.3 (2014/10/10) CellStyle の有無も判定基準に含めます。, 6.0.2.5 (2014/10/31) Cellの開始、終了番号が、マイナスのケースの対応, 6.5.0.0 (2016/09/30) poi-3.15 対応(Cell.CELL_TYPE_XXXX → CellType.XXXX), 7.0.0.0 (2018/10/01) 警告:[deprecation] CellのgetCellTypeEnum()は推奨されません (POI4.0.0), 8.0.1.0 (2021/10/29) CellStyle は not null になったための修正
-
activeWorkbook
public static void activeWorkbook(org.apache.poi.ss.usermodel.Workbook wkbook, List<Integer> rowCntList) 指定の Workbook の全Sheetを対象に、実際の有効行と有効カラムを元に全体をシュリンクします。 ※ 現在、唯一LibreOfficeでのみ、xslx 変換できますが、有効行とカラムが シュリンクされず、無駄な行とカラムが存在します。 これは、xsl で出力されたファイルから有効な値を取得して、xslxに適用させるための 機能で、本来きちんとした有効範囲の xslx が生成されれば、不要な処理です。 引数のListオブジェクトに従って、無条件に処理を行います。- パラメータ:
wkbook
- 処理対象のWorkbook // * @param rcList シートごとの有効行の配列リストrowCntList
- シートごとの有効行の配列リスト // * @see #getLastRowCellNum( Workbook )- 関連項目:
- 変更履歴:
- 8.0.1.0 (2021/10/29) 全Sheetを対象に、実際の有効行と有効カラムを取得, 8.0.3.0 (2021/12/17) シート毎の行数Listに変更。
-
createWorkbook
ファイルから、Workbookオブジェクトを新規に作成します。- パラメータ:
file
- 入力ファイル- 戻り値:
- Workbookオブジェクト
- 変更履歴:
- 6.0.2.3 (2014/10/10) 新規作成, 6.2.0.0 (2015/02/27) ファイル引数を、String → File に変更, 7.0.0.0 (2018/10/01) poi-4.0.0 例外InvalidFormatExceptionは対応するtry文の本体ではスローされません
- このメソッドは、nullを返しません
-
getSheetNames
シート一覧を、Workbook から取得します。 取得元が、Workbook なので、xls , xlsx どちらの形式でも取り出せます。 EXCEL上のシート名を、配列で返します。- パラメータ:
wkbook
- Workbookオブジェクト- 戻り値:
- シート名の配列
- 変更履歴:
- 6.0.2.3 (2014/10/10) 新規作成
-
getNames
名前定義一覧を取得します。 EXCEL上に定義された名前を、配列で返します。 ここでは、名前とFormulaをタブで連結した文字列を配列で返します。 Name オブジェクトを削除すると、EXCELが開かなくなったりするので、 取りあえず一覧を作成して、手動で削除してください。 なお、名前定義には、非表示というのがありますので、ご注意ください。 ◆ 非表示になっている名前の定義を表示にする EXCEL VBA マクロ http://dev.classmethod.jp/tool/excel-delete-name/ Sub VisibleNames() Dim name For Each name In ActiveWorkbook.Names If name.Visible = False Then name.Visible = True End If Next MsgBox "すべての名前の定義を表示しました。", vbOKOnly End Sub ※ EXCEL2010 数式タブ→名前の管理 で、複数選択で、削除できます。 ただし、非表示の名前定義は、先に表示しないと、削除できません。 ◆ 名前の一括削除 EXCEL VBA マクロ http://komitsudo.blog70.fc2.com/blog-entry-104.html Sub DeleteNames() Dim name On Error Resume Next For Each name In ActiveWorkbook.Names If Not name.BuiltIn Then name.Delete End If Next MsgBox "すべての名前の定義を削除しました。", vbOKOnly End Sub- パラメータ:
wkbook
- Workbookオブジェクト- 戻り値:
- 名前定義(名前+TAB+Formula)の配列
- 変更履歴:
- 6.0.2.3 (2014/10/10) 新規作成, 7.0.0.0 (2018/10/01) 警告:[deprecation] WorkbookのgetNameAt(int)は推奨されません (POI4.0.0)
- このメソッドは、nullを返しません
-
getStyleNames
書式のスタイル一覧を取得します。 EXCEL上に定義された書式のスタイルを、配列で返します。 書式のスタイルの名称は、CellStyle にメソッドが定義されていません。 実クラスである HSSFCellStyle にキャストして使用する 必要があります。(XSSFCellStyle にも名称を取得するメソッドがありません。) ※ EXCEL2010 ホームタブ→セルのスタイル は、一つづつしか削除できません。 マクロは、開発タブ→Visual Basic で、挿入→標準モジュール を開き テキストを張り付けてください。 実行は、開発タブ→マクロ で、マクロ名を選択して、実行します。 最後は、削除してください。 ◆ スタイルの一括削除 EXCEL VBA マクロ http://komitsudo.blog70.fc2.com/blog-entry-104.html Sub DeleteStyle() Dim styl On Error Resume Next For Each styl In ActiveWorkbook.Styles If Not styl.BuiltIn Then styl.Delete End If Next MsgBox "すべての追加スタイルを削除しました。", vbOKOnly End Sub ◆ 名前の表示、削除、スタイルの削除の一括実行 EXCEL VBA マクロ Sub AllDelete() Call VisibleNames Call DeleteNames Call DeleteStyle MsgBox "すべての処理を完了しました。", vbOKOnly End Sub- パラメータ:
wkbook
- Workbookオブジェクト- 戻り値:
- 書式のスタイル一覧
- 変更履歴:
- 6.0.2.3 (2014/10/10) 新規作成
- このメソッドは、nullを返しません
-
getCellMsg
セル情報を返します。 エラー発生時に、どのセルでエラーが発生したかの情報を取得できるようにします。- パラメータ:
oCell
- EXCELのセルオブジェクト- 戻り値:
- セル情報の文字列
- 変更履歴:
- 6.0.2.0 (2014/09/19) 新規作成, 6.0.3.0 (2014/11/13) セル情報を作成する時に、値もセットします。, 6.2.2.0 (2015/03/27) celKigo を求めるロジック変更, 6.3.1.0 (2015/06/28) rowNo(行番号)も引数に取るようにします。
-
getCelKigo
Excelの行番号,列番号より、セル記号を求めます。 行番号は、0から始まる数字ですが、記号化する場合は、1から始まります。 Excelの列記号とは、A,B,C,…,Z,AA,AB,…,ZZ,AAA,AAB,… と続きます。 つまり、アルファベットだけの、26進数になります。(ゼロの扱いが少し特殊です) 列番号は、0から始まる数字で、0=A,1=B,2=C,…,25=Z,26=AA,27=AB,…,701=ZZ,702=AAA,703=AAB,… EXCELの行列記号にする場合は、この列記号に、行番号を、+1して付ければよいだけです。 (※ 列番号に+1するのは、内部では0から始まる列番号ですが、表示上は1から始まります)- パラメータ:
rowNo
- 行番号(0,1,2,…)colNo
- 列番号(0,1,2,…)- 戻り値:
- Excelの列記号(A1,B2,C3,…)
- 変更履歴:
- 6.2.2.0 (2015/03/27) celKigo を求めるロジック変更, 6.3.1.0 (2015/06/28) rowNo(行番号)も引数に取るようにします。
-
makeShapeLink
XSSFSimpleShapeオブジェクトにリンクを設定します。 処理の簡素化のために、url引数が null の場合は、何もせず処理を終了します。- パラメータ:
shape
- XSSFSimpleShapeオブジェクトurl
- リンク文字列- 変更履歴:
- 8.1.0.1 (2022/01/07) テキストベースのリンク作成
-
makeShapeColor
XSSFSimpleShapeオブジェクトにカラーを設定します。 処理の簡素化のために、col引数が null の場合は、何もせず処理を終了します。 col配列は、[0]:red [1]:blue [2] green です。 ※ カラーの設定を、XSSFSimpleShape#setFillColor(int,int,int) で行うと、XSLXファイルが 壊れるようです。POIが対応できていないのか、カラー化設定方法を間違っているのか…- パラメータ:
shape
- XSSFSimpleShapeオブジェクトcol
- 色配列- 変更履歴:
- 8.1.0.1 (2022/01/07) テキストベースのカラー作成
-
main
アプリケーションのサンプルです。 入力ファイル名 は必須で、第一引数固定です。 第二引数は、処理方法で、-ALL か、-LINE を指定します。何も指定しなければ、-ALL です。 第三引数を指定した場合は、Encode を指定します。 Usage: java org.opengion.fukurou.model.POIUtil 入力ファイル名 [処理方式] [エンコード] -A(LL) ・・・ ALL 一括処理(初期値) -L(INE) ・・・ LINE 行単位処理 -S(heet) ・・・ Sheet名一覧 -N(AME) ・・・ NAME:名前定義 -C(ellStyle) ・・・ CellStyle:書式のスタイル- パラメータ:
args
- コマンド引数配列- 変更履歴:
- 6.0.2.0 (2014/09/19) 新規作成, 6.2.3.0 (2015/05/01) パラメータ変更、textReader → extractor に変更, 6.2.4.2 (2015/05/29) 引数判定の true/false の処理が逆でした。, 6.3.9.0 (2015/11/06) Java 8 ラムダ式に変更, 8.5.5.1 (2024/02/29) switch文にアロー構文を使用
-