无法使用Ajax下载打开Excel文件

问题描述 投票:0回答:1

在控制器中,我正在读取以逗号分隔的字符串缓冲区并使用 apache poi 库,生成 Excel 内容。我将 Excel 内容发送到 Ajax 调用,让浏览器下载 Excel 文件。我可以下载该文件,但是当我在 Excel 中打开它时,它出错了。

控制器代码:

    import org.springframework.http.HttpHeaders;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    
    @RestController
    public class ExcelController {
    
        @PostMapping("/downloadExcel")
        public ResponseEntity<Object> downloadExcel(@RequestBody StringBuffer csvData) throws IOException {
            byte[] excelContent = generateExcelContent(csvData);
    
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", "example.xlsx");
    
            return ResponseEntity.ok()
                    .headers(headers)
                    .body(excelContent);
        }
    
        private byte[] generateExcelContent(StringBuffer csvData) throws IOException {
            Workbook workbook = new XSSFWorkbook();
            Sheet sheet = workbook.createSheet("Sheet1");
    
            // Sample data for demonstration purposes
            csvData.append("Name,Age,Country\n");
            csvData.append("John,25,USA\n");
            csvData.append("Alice,30,Canada\n");
            csvData.append("Bob,22,UK\n");
    
            String[] lines = csvData.toString().split("\n");
            for (int i = 0; i < lines.length; i++) {
                Row row = sheet.createRow(i);
                String[] values = lines[i].split(",");
                for (int j = 0; j < values.length; j++) {
                    Cell cell = row.createCell(j);
                    cell.setCellValue(values[j]);
                }
            }
    
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            workbook.write(outputStream);
    
            // Ensure the workbook and outputStream are properly closed
            workbook.close();
            outputStream.close();
    
            return outputStream.toByteArray();
        }
    }

Ajax代码:

    $.ajax({
    url: '/downloadExcel',
    type: 'POST',
    success: function(data, textStatus, jqXHR) {
        var blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });

        var link = document.createElement('a');
        link.href = window.URL.createObjectURL(blob);
        link.download = 'example.xlsx';
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.error('Error downloading Excel file:', textStatus, errorThrown);
    }
});

当我尝试打开文件时出现 Excel 错误:

我们发现“example.xlsx”中的某些内容存在问题。你想要我们吗 尝试尽可能多地恢复?如果你相信这个消息的来源 工作簿单击“是”或“否”

单击“是”

Excel 无法打开文件“example.xlsx”,因为文件格式或 文件扩展名无效。验证该文件未被 已损坏并且文件扩展名与文件格式匹配。

注意:我检查了控制器中生成的 Excel 文件,看看是否可以下载并打开该文件而不发送到 Ajax,以确保服务器端以正确的格式生成文件。我能够下载并打开文件 Excel。不知何故,文件在使用 AJAX 时会被损坏。请帮忙,因为我是 AJAX 新手。谢谢你

java ajax spring spring-mvc apache-poi
1个回答
0
投票

你为什么要尝试将二进制流下载到 JavaScript 中? JavaScript 无法读取 Excel - 您想将浏览器的控制权传递给 Excel/类似的,不是吗?我认为你可能把这个问题过于复杂化了。

如果您希望 Web 应用程序向用户展示某种方式从您的服务器下载电子表格内容,然后在 Excel 中打开它,您只需创建如下内容:

<form action="/downloadExcel" method="POST">
      <input type="submit" value="Open in Excel">
</form>
© www.soinside.com 2019 - 2024. All rights reserved.