poi输出word报错,getOutputStream() has already been called for this response

April_Java 2017-05-17 10:44:52
做项目的时候用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)

代码在楼下:
...全文
1592 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
April_Java 2017-05-17
  • 打赏
  • 举报
回复
引用 4 楼 pany1209 的回复:
[quote=引用 3 楼 April_Java 的回复:] [quote=引用 2 楼 pany1209 的回复:] 一般连着用response.getOutputStream();和response.getWriter()会报getOutputStream() has already been called for this response这个错误。。。。(MeetingController.java:205)205行是哪一行??

doc.write(os);
是这个。 我没找到哪里还调用了response.getWriter();[/quote] 把 public void generateMeetingDoc改为 public String generateMeetingDoc最后return null试试。。。。[/quote] 这个我之前试过...没用...
李德胜1995 2017-05-17
  • 打赏
  • 举报
回复
引用 3 楼 April_Java 的回复:
[quote=引用 2 楼 pany1209 的回复:] 一般连着用response.getOutputStream();和response.getWriter()会报getOutputStream() has already been called for this response这个错误。。。。(MeetingController.java:205)205行是哪一行??

doc.write(os);
是这个。 我没找到哪里还调用了response.getWriter();[/quote] 把 public void generateMeetingDoc改为 public String generateMeetingDoc最后return null试试。。。。
April_Java 2017-05-17
  • 打赏
  • 举报
回复
引用 2 楼 pany1209 的回复:
一般连着用response.getOutputStream();和response.getWriter()会报getOutputStream() has already been called for this response这个错误。。。。(MeetingController.java:205)205行是哪一行??

doc.write(os);
是这个。 我没找到哪里还调用了response.getWriter();
李德胜1995 2017-05-17
  • 打赏
  • 举报
回复
一般连着用response.getOutputStream();和response.getWriter()会报getOutputStream() has already been called for this response这个错误。。。。(MeetingController.java:205)205行是哪一行??
April_Java 2017-05-17
  • 打赏
  • 举报
回复
在网上看了很多帖子,都是说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);
        }

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧