2012-12-13 47 views
0

我正在使用JXLS XLSReader讀取Microsoft Excel文件。使用JXLS導入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只讀第一張紙,而不管第一張紙是什麼名?我找不到在谷歌任何東西,但如果你能請隨意張貼的鏈接

感謝很多

回答

0

我聯繫了開發商。他說這個功能還不存在。他會考慮把它放在未來的版本中。

作爲一種解決方法,他建議使用POI API讀取工作簿以找出工作表名稱。然後使用正確的表名稱更新內存中的XML配置並將其提供給ReaderBuilder,或者在不使用XML的情況下使用API​​調用來構建配置。

HTH別人在這個問題上用谷歌搜索。

1

從JXLS頁:

從版本1.0.2 JXLS閱讀器通過索引支持片材的映射。如果您不知道工作表的名稱,這可能很方便。

只需使用

<worksheet idx="0"> 

,而不是

<worksheet name="sheetName"> 
0

正如指出的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}"> 
相關問題