做项目的时候用poi向word模板写入数据,在前段用创建iframe的方式进行下载,结果下载的时候报错了。
错误信息如下:org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while saving the package : The part /docProps/core.xml fail to be saved in the stream with marshaller org.apache.poi.openxml4j.opc.internal.marshallers.ZipPackagePropertiesMarshaller@d5b0700
    at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:502)
    at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1467)
    at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:217)
    at com.hhwy.bjyps.meeting.controller.MeetingController.generateMeetingDoc(MeetingController.java:205)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
    at com.hhwy.framework.mvc.DispatchServlet.doDispatch(DispatchServlet.java:931)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    at com.hhwy.framework.mvc.DispatchServlet.doService(DispatchServlet.java:386)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at com.hhwy.sso.client.filter.SessionFilter.doFilter(SessionFilter.java:129)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:495)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:767)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1347)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:603)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211)
    at com.hhwy.framework.mvc.GlobalMethodHandlerExeptionResolver.resolveException(GlobalMethodHandlerExeptionResolver.java:82)
    at org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1167)
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1004)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:955)
    at com.hhwy.framework.mvc.DispatchServlet.doDispatch(DispatchServlet.java:931)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    at com.hhwy.framework.mvc.DispatchServlet.doService(DispatchServlet.java:386)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at com.hhwy.sso.client.filter.SessionFilter.doFilter(SessionFilter.java:129)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:495)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:767)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1347)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)代码在楼下:

解决方案 »

  1.   

    在网上看了很多帖子,都是说Jsp的,我前端页面没有写java代码。请各位大大帮忙看看,后端代码如下:       @RequestMapping(value = "/generateMeetingDoc", method = RequestMethod.GET)
        public void generateMeetingDoc(@RequestParam Map<String, String> params, HttpServletRequest req, HttpServletResponse res) {        OutputStream os = null;
            try {
                Meeting meeting = meetingService.getMeetingById(params.get("id"));
                String filePath = req.getServletContext().getRealPath("/")+File.separator+"template"+File.separator+"meetingNotice.docx";            String name = meeting.getName()+"(会议通知).docx";
                XWPFDocument doc = meetingService.generateMeetingDoc(meeting, filePath);
                boolean isMSIE = HttpUtils.isMSBrowser(req);//判断浏览器设置编码
                if (isMSIE) {
                    name = URLEncoder.encode(name, "UTF-8");
                } else {
                    name = new String(name.getBytes("UTF-8"), "ISO-8859-1");
                }
                res.reset();
                res.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
                res.setHeader("Content-disposition", "attachment;filename=\"" + name + "\"");
                os = res.getOutputStream();
                doc.write(os);
                os.flush();
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }public XWPFDocument generateMeetingDoc(Meeting meeting, String templateFile) {        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分");
            //处理参数
            Map<String, String> params = new HashMap<>();
            params.put("filePath", templateFile);
            params.put("${name}", meeting.getName());
        if(meeting.getReviewTime() != null) {
            params.put("${time}", sdf.format(meeting.getReviewTime()));
        } else {
            params.put("${time}", "");
        }
        if(StringUtils.isNotBlank(meeting.getMeetingroom())) {
            params.put("${place}", dao.findById(meeting.getMeetingroom(), DictItem.class).getItemName());
        } else {
            params.put("${place}", "");
        }        User user = dao.findById(meeting.getContacts(), User.class);
            if(ConfigHelper.getConfig("unit.jj").equals(user.getOrgId())) {
                params.put("${special}", "(技经)");
            } else if(ConfigHelper.getConfig("unit.zz").equals(user.getOrgId())) {
                params.put("${special}", "(技术)");
            } else {
                params.put("${special}", "");
            }
            params.put("${userDept}", user.getOrgIdName());
            params.put("${userName}", user.getUserName());
            params.put("${userTel}", user.getMobile());        String proList = "";
            for(int i=1; i<=meeting.getProList().size(); i++) {
                proList += i + "." + meeting.getProList().get(i-1).getName()+"\n\t";
            }        params.put("${projectList}", proList);
            params.put("${agenda}", meeting.getAgenda());
            params.put("${attendUnit}", meeting.getAttendUnit());
            params.put("${aquirement}", meeting.getAquirement());
            return getDoc(params);
        }    private XWPFDocument getDoc(Map<String, String> params) {
            try {
                XWPFDocument document = new XWPFDocument(new FileInputStream(new File(params.get("filePath"))));
                params.remove("filePath");
                Iterator<XWPFParagraph> itPara = document
                        .getParagraphsIterator();
                while (itPara.hasNext()) {
                    XWPFParagraph paragraph = itPara.next();
                    String text = paragraph.getText();
                    for (Entry<String, String> entry : params.entrySet()) {
                        if (StringUtils.isNotBlank(entry.getValue())) {
                            text = text.replace(entry.getKey(), entry.getValue());
                        } else {
                            text = text.replace(entry.getKey(), "");
                        }
                    }                List<XWPFRun> runs = paragraph.getRuns();
                    for (int i = 0; i < runs.size(); i++) {
                        if (runs.get(i) != null) {
                            runs.get(i).setText("", 0);
                            //将所有的XWPFRun都置空
                        }
                        if (i == 0) {
                            runs.get(i).setText(text, 0); //将第一个XWPFRun的值存整个XWPFParagraph的字符串
                        }
                    }
                }
                return document;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    前段采用两种方式,一种创建iframe下载,一种使用window.open()方式下载,    window.open()的方式不会报错,创建iframe的方式会报错。但是为了体验好,不想使用window.open()的方式。下面是前段的代码,烦请各位大大帮忙查查是什么问题//生成会议通知文件
            issue:function(btn,params){
                var main = this;
                main.formEditData43448(btn,params);
                /*var elemIF = document.createElement("iframe");
                elemIF.src = basePath+"meeting/generateMeetingDoc?id="+main.putData.id;
                elemIF.style.display = "none";
                console.log(elemIF.src)
                document.body.appendChild(elemIF);*/
                window.open(basePath+"meeting/generateMeetingDoc?id="+main.putData.id);
            }
      

  2.   

    一般连着用response.getOutputStream();和response.getWriter()会报getOutputStream() has already been called for this response这个错误。(MeetingController.java:205)205行是哪一行??
      

  3.   

    doc.write(os);是这个。 我没找到哪里还调用了response.getWriter();
      

  4.   

    doc.write(os);是这个。 我没找到哪里还调用了response.getWriter();
    把 public void generateMeetingDoc改为 public String generateMeetingDoc最后return null试试。
      

  5.   

    doc.write(os);是这个。 我没找到哪里还调用了response.getWriter();
    把 public void generateMeetingDoc改为 public String generateMeetingDoc最后return null试试。这个我之前试过...没用...