在控制器中,我正在读取以逗号分隔的字符串缓冲区并使用 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 新手。谢谢你
你为什么要尝试将二进制流下载到 JavaScript 中? JavaScript 无法读取 Excel - 您想将浏览器的控制权传递给 Excel/类似的,不是吗?我认为你可能把这个问题过于复杂化了。
如果您希望 Web 应用程序向用户展示某种方式从您的服务器下载电子表格内容,然后在 Excel 中打开它,您只需创建如下内容:
<form action="/downloadExcel" method="POST">
<input type="submit" value="Open in Excel">
</form>