Excelファイルを読み込む
最終更新日: 2020年6月12日
R8 | R9
Apache POI は Excel ファイルの内容(シート、セル)を読み書きすることのできるライブラリです。オープンソースで提供されており、Wagby に同梱されています。このライブラリを使って、アップロードされた Excel ファイルを読み込むプログラムを開発する方法を説明します。
参照する jar ファイルに commons-lang3.jar と poi.jar, poi-ooxml.jar を追加します。いずれも WagbyDesigner の WEB-INF/lib フォルダに含まれています。
Windows OS の場合:
Linux, Mac OS X の場合:
sample.xlsx というファイルを (WagbyDesignerに) アップロードした例を紹介します。
コンソールには次のようにシート名が表示されます。
読み込んだExcelファイルのシート名に対応した、空のモデルをリポジトリに生成してみます。
Wagby が提供する ModelInfo と RepositoryManager を利用します。ModelInfo は一つのモデルに関する設計情報を保持します。RepositoryManager は、リポジトリファイル(物理的なファイル、repository/trunk 以下に保存されるテキストファイル)を操作するクラスです。
参照するライブラリに j_xls2appschema.jar を追加します。(先頭が "j_" で始まる jar ファイルは、Wagby が提供するライブラリです。)
Windows OS の場合:
Linux, Mac OS の場合:
コンパイルが成功すると WEB-INF/classes フォルダ内に com/example/SampleConverterProcessor.class が生成されます。
インポートを実行すると、シートの数だけモデルが作成されます。この段階では、各モデルの中身(モデル項目)は空です。主キー項目もないためビルドするとエラーになります。ビルドはもう少しお待ちください。
モデル項目は ModelitemInfo クラスが管理します。この ModelitemInfo を使って、主キー項目を付与するように変更してみます。
まとめますと、モデルに関するリポジトリキー(と値)の格納には ModelInfo を、モデル項目に関するリポジトリキー(と値)の格納には ModelitemInfo クラスをそれぞれ用います。
コンパイル手順は前節の説明と同じです。ビルド後、実行すると一つの項目(主キー)だけのモデルが用意されていることがわかります。
Wagbyの設計情報(リポジトリ)はモデル毎に管理されます。さらにモデルに共通するもの(画面機能、メニュー、権限、帳票設定)と、モデル項目毎に設定されるもの(モデル項目詳細ダイアログで設定されるもの)に大別されます。
リポジトリキーの一覧表はこちらにあります。 しかしこの表をすべて設定する必要はありません。未設定の場合にはデフォルト値が適用されるようになっています。
必要なリポジトリキーを調べるために、WagbyDesignerのコンソールを活用してください。WagbyDesignerで何らかの設定を行うと、コンソールにリポジトリキーと値が表示されます。
例えば "画面 > ダウンロード画面 > 画面を作成する" を有効にしたとき、次のようなメッセージが表示されます。
このメッセージから、リポジトリキーは
モデル項目の一括設定を使うと、項目に設定できるリポジトリキーを閲覧することができます。
次のファイルにデフォルト値が格納されています。
repository/trunk/jfcDesignerTemplateModel/jfcDesignerTemplateModel.txt
repository/trunk/jfcDesignerTemplateModelitem/jfcDesignerTemplateModelitem/templateItem/templateItem.txt
ここまで説明したソースコード全体を示します。
Excelファイルを読み込む
package jp.jasminesoft.jfc.tools.repository.converter.excel;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import jp.jasminesoft.jfc.tools.repository.converter.ConvertProcessorBase;
public class ExcelConverterProcessor extends ConvertProcessorBase {
private Workbook workbook;
@Override
public void init(Map<String, String> environment, List<String> messageList) throws IOException {
super.init(environment, messageList);
String filename = environment.get("filename");
if (StringUtils.isBlank(filename)) {
messageList.add("[ERROR] No file is specified.");
return;
}
try {
workbook = WorkbookFactory.create(new FileInputStream(filename));
} catch (Exception e) {
workbook = null;
throw new IOException(e.getMessage());
}
if (debug) {
System.out.println("environment="+environment);
}
}
@Override
public void process() {
if (workbook == null) return;
int sheetSize = workbook.getNumberOfSheets();
for (int sheetIndex = 0; sheetIndex < sheetSize; sheetIndex++) {
Sheet sheet = workbook.getSheetAt(sheetIndex);
String sheetName = sheet.getSheetName();
if (debug) {
System.out.println("[Debug] sheetName="+sheetName);
}
}
}
}
コンパイル
javac -cp .;classes;lib\j_util.jar;lib\commons-lang3.jar;lib\poi.jar;lib\poi-ooxml.jar -d classes src\com\example\SampleConverterProcessor.java
javac -cp .:classes:lib/j_util.jar:lib/commons-lang3.jar:lib/poi.jar:lib/poi-ooxml.jar -d classes src/com/example/SampleConverterProcessor.java
実行例
...
environment={filename=/Users/joe/Desktop/test/Wagby-8.1.2/wagbydesigner/temp/RepositoryConervter1914110958805521156.xlsx, debug=true, ...}
[Debug] sheetName=顧客
ModelInfoクラス
package com.example;
...
import jp.jasminesoft.jfc.tools.repository.RepositoryManager;
import jp.jasminesoft.jfc.tools.xls2appschema.ModelInfo;
...
public class SampleConverterProcessor extends ConvertProcessorBase {
...
@Override
public void process() {
...
int menuorderBase = 100000; // 起点
int countOfMenu = 0;
try {
int sheetSize = workbook.getNumberOfSheets();
for (int sheetIndex = 0; sheetIndex < sheetSize; sheetIndex++) {
Sheet sheet = workbook.getSheetAt(sheetIndex);
String sheetName = sheet.getSheetName();
if (debug) {
System.out.println("[Debug] sheetName="+sheetName);
}
String modelId = "model" + (sheetIndex+1);
ModelInfo minfo = createModelInfo(modelId, sheetName, sheetName);
Map<String, String> modelInfoMap = minfo.getModelInfoMap();
//検索画面への遷移をメニューに配置する
modelInfoMap.put("action/@menurefShowlist", "true");
// 検索画面と一覧表示を同一画面で扱う
modelInfoMap.put("model/@presentationShowListOnescreen", "true");
int myMenuOrder = menuorderBase + countOfMenu * 100;
// 検索機能をメニューに用意する
modelInfoMap.put("action/@menuorderSelect", String.valueOf(myMenuOrder));
modelInfoMap.put("model/@menuorder", String.valueOf(menuorderBase));
repman.getModelMap().put(modelId, minfo);
repman.saveModelMap(modelId);
countOfMenu++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
action/@menurefShowlist
と model/@presentationShowListOnescreen
を設定しています。コンパイル
javac -cp .;classes;lib\j_xls2appschema.jar;lib\j_util.jar;lib\commons-lang3.jar;lib\poi.jar;lib\poi-ooxml.jar -d classes src\com\example\SampleConverterProcessor.java
javac -cp .:classes:lib/j_xls2appschema.jar:lib/j_util.jar:lib/commons-lang3.jar:lib/poi.jar:lib/poi-ooxml.jar -d classes src/com/example/SampleConverterProcessor.java
実行
ModelitemInfoクラス
package com.example;
...
import jp.jasminesoft.jfc.tools.xls2appschema.ModelInfo;
import jp.jasminesoft.jfc.tools.xls2appschema.ModelitemInfo;
...
public class SampleConverterProcessor extends ConvertProcessorBase {
...
@Override
public void process() {
...
try {
int sheetSize = workbook.getNumberOfSheets();
for (int sheetIndex = 0; sheetIndex < sheetSize; sheetIndex++) {
Sheet sheet = workbook.getSheetAt(sheetIndex);
...
int lineNumber = 1;
// モデル項目
String item = "pkey";
String label = "主キー";
Map<ModelitemInfo, String> modelitemInfoMap = minfo.getModelitemInfoMap();
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@label", item), label);
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@labelWithoutLayout", item), label);
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@name", item), item);
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@filter", item), "intFilter");
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@type", item), "number");
modelitemInfoMap.put(new ModelitemInfo("presentation/displayitem/@type", item), "numberformat");
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@primaryKey", item), "true");
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/notnull", item), "true");
modelitemInfoMap.put(new ModelitemInfo("model/primaryKey/@autoid", item), "true");
modelitemInfoMap.put(new ModelitemInfo("ref_model/@name", item), modelId);
modelitemInfoMap.put(new ModelitemInfo("ref_model/modelitem/@name", item), item);
modelitemInfoMap.put(new ModelitemInfo("ref_model/modelitem/@type", item), "number");
modelitemInfoMap.put(new ModelitemInfo("ref_model/modelitem/@primaryKey", item), "true");
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@__linenumber", item),
Integer.toString(lineNumber++));
repman.getModelMap().put(modelId, minfo);
repman.saveModelMap(modelId);
countOfMenu++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
model/modelitem/@__linenumber
をセットしてください。この値が未設定の項目を含むモデルは破損されたものとみなされます。コンパイルと実行
リポジトリキー
特定の機能に関するリポジトリキーを調べる (1) コンソールの利用
2018-11-xx 11:00:00 [DEBUG jp.jasminesoft.jfc.tools.repository.validator.QuickValidator validate] [QuickValidator] model1, model/@csvOutput=true
model/@csvOutput
で、値はtrue
が設定されることがわかります。
特定の機能に関するリポジトリキーを調べる (2) 一括設定の利用
特定の機能に関するリポジトリキーを調べる (3) デフォルト値の確認
モデル
モデル項目
ソースコード
package com.example;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import jp.jasminesoft.jfc.tools.repository.RepositoryManager;
import jp.jasminesoft.jfc.tools.xls2appschema.ModelInfo;
import jp.jasminesoft.jfc.tools.xls2appschema.ModelitemInfo;
import jp.jasminesoft.jfc.tools.repository.converter.ConvertProcessorBase;
public class SampleConverterProcessor extends ConvertProcessorBase {
private Workbook workbook;
@Override
public void init(Map<String, String> environment, List<String> messageList) throws IOException {
super.init(environment, messageList);
String filename = environment.get("filename");
if (StringUtils.isBlank(filename)) {
messageList.add("[ERROR] No file is specified.");
return;
}
try {
workbook = WorkbookFactory.create(new FileInputStream(filename));
} catch (Exception e) {
workbook = null;
throw new IOException(e.getMessage());
}
if (debug) {
System.out.println("environment="+environment);
}
}
@Override
public void process() {
if (workbook == null) return;
int menuorderBase = 100000; // 起点
int countOfMenu = 0;
try {
int sheetSize = workbook.getNumberOfSheets();
for (int sheetIndex = 0; sheetIndex < sheetSize; sheetIndex++) {
Sheet sheet = workbook.getSheetAt(sheetIndex);
String sheetName = sheet.getSheetName();
if (debug) {
System.out.println("[Debug] sheetName="+sheetName);
}
String modelId = "model" + (sheetIndex+1);
ModelInfo minfo = createModelInfo(modelId, sheetName, sheetName);
Map<String, String> modelInfoMap = minfo.getModelInfoMap();
//検索画面への遷移をメニューに配置する
modelInfoMap.put("action/@menurefShowlist", "true");
// 検索画面と一覧表示を同一画面で扱う
modelInfoMap.put("model/@presentationShowListOnescreen", "true");
// メニューならび
int myMenuOrder = menuorderBase + countOfMenu * 100;
modelInfoMap.put("action/@menuorderSelect", String.valueOf(myMenuOrder));
modelInfoMap.put("model/@menuorder", String.valueOf(menuorderBase));
int lineNumber = 1;
// モデル項目
String item = "pkey";
String label = "主キー";
Map<ModelitemInfo, String> modelitemInfoMap = minfo.getModelitemInfoMap();
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@label", item), label);
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@labelWithoutLayout", item), label);
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@name", item), item);
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@filter", item), "intFilter");
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@type", item), "number");
modelitemInfoMap.put(new ModelitemInfo("presentation/displayitem/@type", item), "numberformat");
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@primaryKey", item), "true");
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/notnull", item), "true");
modelitemInfoMap.put(new ModelitemInfo("model/primaryKey/@autoid", item), "true");
modelitemInfoMap.put(new ModelitemInfo("ref_model/@name", item), modelId);
modelitemInfoMap.put(new ModelitemInfo("ref_model/modelitem/@name", item), item);
modelitemInfoMap.put(new ModelitemInfo("ref_model/modelitem/@type", item), "number");
modelitemInfoMap.put(new ModelitemInfo("ref_model/modelitem/@primaryKey", item), "true");
modelitemInfoMap.put(new ModelitemInfo("model/modelitem/@__linenumber", item),
Integer.toString(lineNumber++));
repman.getModelMap().put(modelId, minfo);
repman.saveModelMap(modelId);
countOfMenu++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}