Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Spring响应下载excel文件_Javascript_Java_Excel_Spring_Jasper Reports - Fatal编程技术网

Javascript 如何使用Spring响应下载excel文件

Javascript 如何使用Spring响应下载excel文件,javascript,java,excel,spring,jasper-reports,Javascript,Java,Excel,Spring,Jasper Reports,我正在尝试使用Jasper Report 6.2.2下载excel文件 这是我的Spring控制器: @RequestMapping(value = "/downloadExcel", method = RequestMethod.POST) @ResponseBody public void downloadMyReportExcelFile(@RequestBody ExcelFilter excelFilter, HttpServletResponse response)

我正在尝试使用Jasper Report 6.2.2下载excel文件

这是我的Spring控制器:

@RequestMapping(value = "/downloadExcel", method = RequestMethod.POST)
    @ResponseBody
    public void downloadMyReportExcelFile(@RequestBody ExcelFilter excelFilter, HttpServletResponse response) {
        try {

            reportExportBo.downloadReportFile(response, excelFilter);


        } catch (Throwable e) {
            LOGGER.error("Unknown error at REST Service", e);
        }
    }
下面是我的下载报告文件方法代码:

    @Override
        public void downloadReportFile(HttpServletResponse response, ExcelFilter excelFilter) {

            List<myClassObject> myObjectList= objectRecordBo.myData(excelFilter);

            InputStream is = this.getClass().getClassLoader().getResourceAsStream("/my_reports.jrxml");

            ExcelExporter exporter = new ExcelExporter();

            String fileName = "my_exported_report.xls";

            JasperDesign jd = JRXmlLoader.load(is);
            JasperReport jr = JasperCompileManager.compileReport(jd);

            JasperPrint jprint = JasperFillManager.fillReport(jr, null, new JRBeanCollectionDataSource(myObjectList));

            response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

            JRXlsExporter xlsExporter = new JRXlsExporter();
            xlsExporter.setExporterInput(new SimpleExporterInput(jprint));
            xlsExporter.setExporterOutput(new SimpleOutputStreamExporterOutput(response.getOutputStream()));

            SimpleXlsReportConfiguration xlsReportConfiguration = new SimpleXlsReportConfiguration();
            xlsReportConfiguration.setOnePagePerSheet(false);
            xlsReportConfiguration.setRemoveEmptySpaceBetweenRows(true);
            xlsReportConfiguration.setDetectCellType(false);
            xlsReportConfiguration.setWhitePageBackground(false);
            xlsExporter.setConfiguration(xlsReportConfiguration);

            xlsExporter.exportReport();
调用downloadService方法后,我下载了excel,但它不可读

我错了什么

编辑:

顺便说一下,当我在html端使用时

<a style="float:right; " href="service/downloadExcel">{{ 'EXPORT_EXCEL' | translate}}</a>

Spring控制器是GET,没有任何@RequestBody,工作正常。但是我需要用JSON对象传递参数,所以我不能使用它。

我解决了我的问题

在JasperDesign之前,我首先设置响应的标题和内容类型

...
if (list != null && list.size() > 0) {
                response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
                response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

                JasperDesign jd = JRXmlLoader.load(reportStream);
                JasperReport jr = JasperCompileManager.compileReport(jd);
...
我还将我的ajax服务更新为

...
return $http.post(newUrl, paramData, {responseType: 'arraybuffer'}).then(function (response) {
            var blob = new Blob([response.data], {type:'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=UTF-8'});
....

感谢大家的帮助…

以下是另一个解决方案(javascript方面)可能对其他人有所帮助:

        var request = new XMLHttpRequest();
        request.open('POST', url, true); // update the url
        request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
        request.responseType = 'blob';

        var fileName = "simulation_results.xlsx"; // file name
        request.onload = function (e) {
            if (this.status === 200) {
                var blob = this.response;
                if (window.navigator.msSaveOrOpenBlob) {
                    window.navigator.msSaveBlob(blob, fileName);
                } else {
                    var downloadLink = window.document.createElement('a');
                    var contentTypeHeader = request.getResponseHeader("Content-Type");
                    downloadLink.href = window.URL.createObjectURL(new Blob([blob], {
                        type: contentTypeHeader
                    }));
                    downloadLink.download = fileName;
                    document.body.appendChild(downloadLink);
                    downloadLink.click();
                    document.body.removeChild(downloadLink);
                }
            }
        };
        request.send(JSON.stringify(data)); // request data

似乎是编码问题。请尝试将字符集添加到您的响应中。setContentType(“application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,charset=utf-8”);我添加了字符集,但结果相同。您可以尝试使用内容类型“application/vnd.ms excel”作为xls文件吗?我以前尝试过,但结果相同:)如果在文本编辑器或十六进制编辑器中打开文件,您可以添加输出开头的图片吗?
        var request = new XMLHttpRequest();
        request.open('POST', url, true); // update the url
        request.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
        request.responseType = 'blob';

        var fileName = "simulation_results.xlsx"; // file name
        request.onload = function (e) {
            if (this.status === 200) {
                var blob = this.response;
                if (window.navigator.msSaveOrOpenBlob) {
                    window.navigator.msSaveBlob(blob, fileName);
                } else {
                    var downloadLink = window.document.createElement('a');
                    var contentTypeHeader = request.getResponseHeader("Content-Type");
                    downloadLink.href = window.URL.createObjectURL(new Blob([blob], {
                        type: contentTypeHeader
                    }));
                    downloadLink.download = fileName;
                    document.body.appendChild(downloadLink);
                    downloadLink.click();
                    document.body.removeChild(downloadLink);
                }
            }
        };
        request.send(JSON.stringify(data)); // request data