正如指出的coberty可以使用
<worksheet idx="0">
但爲了完整起見:我也有類似問題,但我需要在運行時指定工作表名稱(用戶選擇s從用戶選擇的Excel文件的表格列表中讀取,通過Apache POI讀取表格名稱)。
相反的:
final XLSReader reader = ReaderBuilder.buildFromXML(xmlInputStream);
我用這個方法的一個副本,使用Apache沼氣池setSubstitutor變化不大(不幸的是,我通過使用從網站上JXLS讀者例子,改變了一點做到了這一點ReaderBuilder不允許傳遞一個substitutor作爲參數...):
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);
}
現在我可以使用變量SHEETNAME在JXLS閱讀器的XML配置:
<worksheet name="${sheetName}">