使用Java和Jasper生成Excel文件

我不确定问题是什么,但是我正在使用Java和Jasper生成一个excel文件,我想立即以xlsx格式将文件下载到客户端站点,但文件正在以.xhtml扩展名进行下载。 我需要做什么? 我正在使用JSF。

这是我的方法:

public void generateOutStandingDCReportXLS() { Connection conn = null; try { conn = db.getDbConnection(); Map parameters = new HashMap(); ClassLoader classLoader = getClass().getClassLoader(); InputStream logourl = classLoader.getResourceAsStream("/com/bi/jrxml/simba_logo.jpg"); InputStream stainurl = classLoader.getResourceAsStream("/com/bi/jrxml/coffee_stain.png"); parameters.put("logo", logourl); parameters.put("stain", stainurl); InputStream url = classLoader.getResourceAsStream("/com/bi/jrxml/Outstanding_DC.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport(url); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, conn); ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext(); String path = (String) ctx.getAttribute("reportdir"); File f = new File(path); if (!f.exists()) { f.mkdirs(); } String reportDestination = f.getAbsolutePath() + "/OutStanding_DC_Report" + ".xlsx"; //This is generated Correctly File xlsFile = new File(reportDestination); JRXlsxExporter Xlsxexporter = new JRXlsxExporter(); Xlsxexporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); Xlsxexporter.setParameter(JRExporterParameter.OUTPUT_FILE, xlsFile); Xlsxexporter.exportReport();//File is generated Correctly FileInputStream fis = new FileInputStream(new File(reportDestination)); HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); IOUtils.copy(fis, response.getOutputStream()); response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename=" + "OutStanding_DC_Report" + ".xlsx"); //This is downloaded as .xhtml response.flushBuffer(); fis.close(); } catch (JRException asd) { System.out.println(asd.getMessage()); } catch (IOException asd) { System.out.println(asd.getMessage()); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException asd) { System.out.println(asd.getMessage()); } } } 

服务器端的文件使用正确的扩展名,但下载的文件的扩展名为.xhtml。

IOUtils.copy()之前调用setContentType()IOUtils.copy()

一旦你调用response.getOutputStream()头部被发送。

斯坦利,你还面临同样的问题吗? 如果是的话尝试设置下面的string

 response.setContentType() application/vnd.openxmlformats-officedocument.spreadsheetml.sheet 

 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 

代替

 application/vnd.ms-excel ie response.setContentType("application/vnd.ms-excel"); 

希望这会有所帮助。