2016-03-15 4 views
0

Я пытался использовать Apache poi XWPF для создания документа Word. Внутри документа я пытался создать несколько вложенных таблиц в определенной ячейке таблицы.Как вставить таблицу в XWPFTableCell

Я использую свой код и успешно создал одну таблицу в одной ячейке таблицы. Но когда я пытался создать больше таблицы в этой конкретной ячейке, существует точка ошибки в мой код произнося «java.lang.IndexOutOfBoundsException:»

 XWPFTableRow tableRowFive = table.createRow(); 
     cell = tableRowFive.getCell(0); 

     paragraph = cell.getParagraphs().get(0); 
     XWPFRun run1 = paragraph.createRun(); 
     run1.setText("Brief facts:"); 

     XWPFParagraph paragraph2 = cell.addParagraph(); 
     XWPFRun run2 = paragraph2.createRun(); 
     XWPFRun run3 = paragraph2.createRun(); 
     run2.setText("COMPLAINANT"); 
     run3.setText("test"); 
     XWPFParagraph paragraph3 = cell.addParagraph(); 
     run2 = paragraph3.createRun(); 
     run3 = paragraph3.createRun(); 
     run2.setText("tst"); 
     run3.setText("test2"); 

     XmlCursor cursor = cell.getParagraphs().get(0).getCTP().newCursor(); 
     //add the nested Table1 
     XWPFTable nestedTable = cell.insertNewTbl(cursor); 
     XmlCursor cursor2 =cell.getParagraphs().get(1).getCTP().newCursor(); 
     //add the nested Table2 
     XWPFTable nestedTable2 = cell.insertNewTbl(cursor2); 
     XmlCursor cursor3 =cell.getParagraphs().get(2).getCTP().newCursor(); 
     //add the nested Table3 
     XWPFTable nestedTable3 = cell.insertNewTbl(cursor3); 

ошибка происходит в последнем создании таблицы. Для вложенных таблиц 1 и таблицы 2 создание в порядке. но последнее создание таблицы «XWPFTable nestedTable3 = cell.insertNewTbl (cursor3);» сообщает мне об ошибках

java.lang.IndexOutOfBoundsException: Index: 5, Size: 3 
at java.util.ArrayList.add(ArrayList.java:367) 
at org.apache.poi.xwpf.usermodel.XWPFTableCell.insertNewTbl(XWPFTableCell.java:319) 
at com.ncs.crimes2.briefingnote.command.BriefingNoteCommand.generateWord(BriefingNoteCommand.java:476) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at com.ncs.iframe.base.ejb.command.BaseCommand.execute(Unknown Source) 
at com.ncs.iframe.base.ejb.command.server.CommandServer.executeCommand(Unknown Source) 
at com.ncs.iframe.base.ejb.command.CommandExecutor.execute(Unknown Source) 
at com.ncs.iframe.base.ejb.command.CommandExecutor.execute(Unknown Source) 
at com.ncs.iframe.base.ejb.command.action.BaseCommandAction.executeCommand(Unknown Source) 
at com.ncs.crimes2.base.Crimes2Action.executeCommandAction(Crimes2Action.java:177) 
at com.ncs.crimes2.base.Crimes2Action.executeCommand(Crimes2Action.java:106) 
at com.ncs.iframe.extensions.action.BaseFlowCommandAction.execute(BaseFlowCommandAction.java:260) 
at com.ncs.crimes2.base.Crimes2Action.execute(Crimes2Action.java:61) 
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484) 
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274) 
at com.ncs.crimes2.base.Crimes2RequestProcessor.process(Crimes2RequestProcessor.java:67) 
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) 
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820) 
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227) 
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125) 
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300) 
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) 
at com.ncs.crimes2.base.filter.ParamFilter.doFilter(ParamFilter.java:42) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) 
at com.ncs.crimes2.base.filter.SessionValidFilter.doFilter(SessionValidFilter.java:87) 
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:56) 
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715) 
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681) 
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) 
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277) 
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183) 
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454) 
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209) 
at weblogic.work.ExecuteThread.run(ExecuteThread.java:178) 
+1

вы можете добавить полную трассировку стека исключений на этот вопрос? – centic

+0

@centic Я обновил сообщение об ошибке. Посмотрите, ясно ли это. Спасибо – rex

+0

Похоже, что курсор, который вы передаете в insertNewTbl, неправильно построен, я бы посмотрел, как он построен, может быть, он хранится от предыдущего вызова и, следовательно, не применим для текущего объекта XWPFTableCell? – centic

ответ

0

Может быть, вы должны использовать cursor.toNextSibling() вместо того, чтобы создать новый пункт и новый курсор:

public static void main(String[] args) throws Exception { 
    FileOutputStream out = new FileOutputStream(new File("word.docx")); 
    XWPFDocument document = new XWPFDocument(); 

    XWPFTable tableOne = document.createTable(2,2); 
    XWPFTableRow tablerow = tableOne.getRow(0); 
    tablerow.getCell(0).setText("Test"); 
    tablerow.getCell(1).setText("Test"); 

    tablerow = tableOne.getRow(1); 
    tablerow.getCell(0).setText("Test"); 

    XWPFParagraph paragraph = tablerow.getCell(1).getParagraphs().get(0); 
    XmlCursor cursor = paragraph.getCTP().newCursor(); 
    XWPFTable tableTwo = tablerow.getCell(1).insertNewTbl(cursor); 

    tablerow = tableTwo.createRow(); 
    tablerow.createCell().setText("aaaaa"); 
    tablerow.createCell().setText("bbbbb"); 
    tablerow = tableTwo.createRow(); 
    tablerow.getCell(0).setText("cccc"); 
    tablerow.getCell(1).setText("dddd"); 

    tablerow = tableOne.getRow(1); 
    cursor.toNextSibling(); 
    XWPFTable tableThree = tablerow.getCell(1).insertNewTbl(cursor); 

    tablerow = tableThree.createRow(); 
    tablerow.createCell().setText("eeee"); 
    tablerow.createCell().setText("ffff"); 
    tablerow = tableThree.createRow(); 
    tablerow.getCell(0).setText("gggg"); 
    tablerow.getCell(1).setText("hhhh"); 

    document.write(out); 
    out.close(); 

} 
+0

Является ли второй 'tablerow = tableOne.getRow (1);' действительно нужен? – golimar

Смежные вопросы