コバティが指摘したように、使用できます
<worksheet idx="0">
しかし、完全を期すために、同様の問題がありましたが、実行時にシート名を指定する必要がありました(ユーザーが選択したExcelファイルのシートのリストから選択し、Apache POIを介してシート名を読み取ります)。これは、Web サイトの JXLS Reader の例を使用して少し変更することで実現しました。
それ以外の:
final XLSReader reader = ReaderBuilder.buildFromXML(xmlInputStream);
Apache Digester setSubstitutor を使用して、このメソッドのコピーを少し変更して使用します (残念ながら、ReaderBuilder では、代入子をパラメーターとして渡すことはできません...)。
final XLSReader reader = buildFromXML(xmlInputStream, sheetName);
...
public static XLSReader buildFromXML(final InputStream xmlStream, final String sheetName)
throws IOException, SAXException {
final Digester digester = new Digester();
// hier geschieht die Substituierung des Tabellenblattnamens -
// der Rest der Methode entspricht dem Original
substituteSheetName(sheetName, digester);
digester.setValidating(false);
digester.addObjectCreate("workbook", "org.jxls.reader.XLSReaderImpl");
digester.addObjectCreate("workbook/worksheet", "org.jxls.reader.XLSSheetReaderImpl");
digester.addSetProperties("workbook/worksheet", "name", "sheetName");
digester.addSetProperties("workbook/worksheet", "idx", "sheetIdx");
digester.addSetNext("workbook/worksheet", "addSheetReader");
digester.addObjectCreate("*/loop", "org.jxls.reader.XLSForEachBlockReaderImpl");
digester.addSetProperties("*/loop");
digester.addSetNext("*/loop", "addBlockReader");
digester.addObjectCreate("*/section", "org.jxls.reader.SimpleBlockReaderImpl");
digester.addSetProperties("*/section");
digester.addSetNext("*/section", "addBlockReader");
digester.addObjectCreate("*/mapping", "org.jxls.reader.BeanCellMapping");
digester.addSetProperties("*/mapping");
digester.addCallMethod("*/mapping", "setFullPropertyName", 1);
digester.addCallParam("*/mapping", 0);
digester.addSetNext("*/mapping", "addMapping");
digester.addObjectCreate("*/loop/loopbreakcondition", "org.jxls.reader.SimpleSectionCheck");
digester.addSetNext("*/loop/loopbreakcondition", "setLoopBreakCondition");
digester.addObjectCreate("*/loopbreakcondition/rowcheck", "org.jxls.reader.OffsetRowCheckImpl");
digester.addSetProperties("*/loopbreakcondition/rowcheck");
digester.addSetNext("*/loopbreakcondition/rowcheck", "addRowCheck");
digester.addObjectCreate("*/rowcheck/cellcheck", "org.jxls.reader.OffsetCellCheckImpl");
digester.addSetProperties("*/rowcheck/cellcheck");
digester.addCallMethod("*/rowcheck/cellcheck", "setValue", 1);
digester.addCallParam("*/rowcheck/cellcheck", 0);
digester.addSetNext("*/rowcheck/cellcheck", "addCellCheck");
return (XLSReader) digester.parse(xmlStream);
}
private static void substituteSheetName(final String sheetName, final Digester digester) {
// set up the variables the input xml can reference
final Map<String, Object> vars = new HashMap<String, Object>();
vars.put("sheetName", sheetName);
// map ${varname} to the entries in the var map
final MultiVariableExpander expander = new MultiVariableExpander();
expander.addSource("$", vars);
// allow expansion in both xml attributes and element text
final Substitutor substitutor = new VariableSubstitutor(expander);
digester.setSubstitutor(substitutor);
}
これで、JXLS Reader XML 構成で変数 sheetName を使用できるようになりました。
<worksheet name="${sheetName}">