Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

文档模版循环合并时报错 #85

Closed
wanglichao1 opened this issue Jul 19, 2018 · 4 comments
Closed

文档模版循环合并时报错 #85

wanglichao1 opened this issue Jul 19, 2018 · 4 comments
Labels

Comments

@wanglichao1
Copy link

2018-07-19 10:06:40.907 ERROR 4176 --- [io-11111-exec-9] com.deepoove.poi.policy.RenderPolicy : merge docx error

org.apache.xmlbeans.XmlException: Unable to parse xml bean
at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:179)
at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:137)
at org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody$Factory.parse(Unknown Source)
at com.deepoove.poi.NiceXWPFDocument.merge(NiceXWPFDocument.java:442)
at com.deepoove.poi.policy.DocxRenderPolicy.render(DocxRenderPolicy.java:52)
at com.deepoove.poi.render.RenderAPI.render(RenderAPI.java:139)
at com.deepoove.poi.XWPFTemplate.render(XWPFTemplate.java:154)
at cn.com.open.face2face.web.ClazzController.exportStudentStudyResult(ClazzController.java:815)
at cn.com.open.face2face.web.ClazzController$$FastClassBySpringCGLIB$$3708a.invoke()
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:667)
at cn.com.open.face2face.web.ClazzController$$EnhancerBySpringCGLIB$$52d593d2.exportStudentStudyResult()
at sun.reflect.GeneratedMethodAccessor617.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:45005)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:111)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at cn.com.open.face2face.web.filter.JWTAuthenticationFilter.doFilter(JWTAuthenticationFilter.java:53)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:347)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:263)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:96)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:40002)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:677)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1468)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.xml.sax.SAXParseException: 元素类型 "xml-fragment" 必须由匹配的结束标记 "" 终止。
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1472)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1749)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2967)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
at org.apache.poi.util.DocumentHelper.readDocument(DocumentHelper.java:150)
at org.apache.poi.POIXMLTypeLoader.parse(POIXMLTypeLoader.java:176)
... 110 common frames omitted

@Sayi
Copy link
Owner

Sayi commented Jul 19, 2018

建议给个单元测试,附上模板。

@wanglichao1
Copy link
Author

wanglichao1 commented Jul 19, 2018

方法
public static void main(String[] args) throws Exception {

    String report="{\"courseList\":[{\"rowData\":[{\"text\":\"12月6日(星期三)\"},{\"text\":\"08:00-02:34\"},{\"text\":\"课程需要改\"},{\"text\":\"专家\\n\"}],\"style\":{\"align\":{}}},{\"rowData\":[{\"text\":\"12月7日(星期四)\"},{\"text\":\"10:19-01:23\"},{\"text\":\"课程2\"},{\"text\":\"专家2\\n\"}],\"style\":{\"align\":{}}},{\"rowData\":[{\"text\":\"12月8日(星期五)\"},{\"text\":\"08:01-08:02\"},{\"text\":\"课程4\"},{\"text\":\"专家\\n\"}],\"style\":{\"align\":{}}}],\"clazz\":\"班级2\"}";
    String detail = "[{\"studentCount\":0,\"introspection\":\"\",\"teacherName\":\"专家\",\"satisfied\":0,\"teacherWorkPlace\":\"\",\"cheatUsers\":\"\",\"signUserCount\":0,\"ordinary\":0,\"absenceUsers\":\"\",\"absenteeismUsers\":\"\",\"leaveMessages\":\"\",\"signRate\":0,\"courseName\":\"课程需要改\",\"notSatisfied\":0,\"verySatisfied\":0,\"submitCount\":0,\"location\":\"\",\"teacherTitle\":\"\",\"clazzName\":\"班级2\",\"courseTime\":\"12月6日(星期三) 08:00-02:34\"},{\"studentCount\":0,\"introspection\":\"\",\"teacherName\":\"专家2\",\"satisfied\":0,\"teacherWorkPlace\":\"\",\"cheatUsers\":\"\",\"signUserCount\":0,\"ordinary\":0,\"absenceUsers\":\"\",\"absenteeismUsers\":\"\",\"leaveMessages\":\"\",\"signRate\":0,\"courseName\":\"课程2\",\"notSatisfied\":0,\"verySatisfied\":0,\"submitCount\":0,\"location\":\"\",\"teacherTitle\":\"\",\"clazzName\":\"班级2\",\"courseTime\":\"12月7日(星期四) 10:19-01:23\"},{\"studentCount\":187,\"introspection\":\"\",\"teacherName\":\"专家\",\"satisfied\":0,\"teacherWorkPlace\":\"\",\"cheatUsers\":\"\",\"signUserCount\":0,\"ordinary\":0,\"absenceUsers\":\"\",\"absenteeismUsers\":\"\",\"leaveMessages\":\"\",\"signRate\":0,\"courseName\":\"课程4\",\"notSatisfied\":0,\"verySatisfied\":0,\"submitCount\":0,\"location\":\"\",\"teacherTitle\":\"\",\"clazzName\":\"班级2\",\"courseTime\":\"12月8日(星期五) 08:01-08:02\"}]";


    ObjectMapper mapper=new ObjectMapper();
    Map<String, Object> data =mapper.readValue(report,Map.class);
    List<Map> list=mapper.readValue(detail,List.class);
    String temp = "e:\\course-report.docx";
    String test = "e:\\course-report-detail.docx";
    String outfile = "e:\\out.docx";

    DocxRenderData segment = new DocxRenderData(new File(test), list);
    data.put("courseDetail", segment);
    XWPFTemplate template = XWPFTemplate.compile(temp);
    FileOutputStream out = new FileOutputStream(outfile);
    template.render(data).write(out);
    out.flush();
    out.close();
    template.close();
}

https://opensxb.oss-cn-beijing.aliyuncs.com/resource/test/course-report-detail.docx

https://opensxb.oss-cn-beijing.aliyuncs.com/resource/test/course-report.docx

@Sayi
Copy link
Owner

Sayi commented Jul 19, 2018

的确是个BUG,下个版本会修复。
目前临时的办法是在course-report-detail.docx末尾加个换行试试。

@Sayi
Copy link
Owner

Sayi commented Aug 2, 2018

1.3.1版本已解决。

@Sayi Sayi closed this as completed Aug 2, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants