Как указал Коберти, вы можете использовать
<worksheet idx="0">
Но для полноты: у меня была аналогичная проблема, но мне нужно было указать имя листа во время выполнения (пользователь выбирает из списка листов выбранного пользователем файла Excel, читая имена листов через Apache POI). Я сделал это, используя пример 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);
}
Теперь я могу использовать переменную sheetName в XML-конфигурации JXLS Reader:
<worksheet name="${sheetName}">
person
user1439628
schedule
03.03.2016