我正在使用JXLS XLSReader读取Microsoft Excel文件。
这是我的配置文件的副本:
<?xml version="1.0" encoding="ISO-8859-1"?>
<workbook>
<worksheet name="staff_acme">
<loop startRow="1" endRow="1" items="VECIDataHolder" var="vdh" varType="gov.noaa.nsd.model.data.dataholders.VECIDataHolder">
<section startRow="1" endRow="1">
<mapping row="1" col="0">vdh.person_id</mapping>
<mapping row="1" col="1">vdh.fullname</mapping>
<mapping row="1" col="2">vdh.noaa_email_address</mapping>
<mapping row="1" col="3">vdh.emergency_email_address</mapping>
<mapping row="1" col="4">vdh.emergency_cell</mapping>
<mapping row="1" col="5">vdh.emergency_sms</mapping>
</section>
<loopbreakcondition>
<rowcheck offset="0">
<cellcheck offset="0"/>
</rowcheck>
</loopbreakcondition>
</loop>
</worksheet>
</workbook>
我的用户一直在更改工作表的名称,这使JXLS错过了。
有没有办法告诉JXLS只读第一张纸而不管第一张纸的名字是什么?我在Google上找不到任何内容,但如果可以,请随时发布链接
非常感谢
答案 0 :(得分:1)
来自jxls页面:
从版本1.0.2开始,jxls-reader支持按索引映射工作表。如果您不知道工作表的名称,这可能很方便。
只需使用
<worksheet idx="0">
而不是
<worksheet name="sheetName">
答案 1 :(得分:0)
我联系了开发者。他说这个功能还不存在。他会考虑将它放在未来的版本中。
作为一种解决方法,他建议使用POI API读取工作簿以查找工作表名称。然后使用正确的工作表名称更新内存中的XML配置并将其提供给ReaderBuilder,或者在没有XML但使用API调用的情况下构建配置。
HTH别人在谷歌搜索这个问题。答案 2 :(得分:0)
正如coberty所指出,你可以使用
<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);
}
现在我可以在JXLS Reader XML配置中使用变量sheetName:
<worksheet name="${sheetName}">