권장(무료): ajax 동영상 튜토리얼
ajax를 사용하여 Excel 보고서 내보내기 [깨진 문제 해결] 참고로 구체적인 내용은 다음과 같습니다
Background
프로젝트에서 발생한 Excel 보고서를 내보내려는 시나리오입니다. 토큰 검증이 필요하기 때문에 a 태그를 사용할 수 없습니다. 페이지가 복잡하기 때문에 양식 제출을 사용할 수 없습니다. 처음에는 프런트엔드에서 ajax를 사용하고, 백엔드에서 스트림을 반환하고, 지정된 헤더를 정의하는 것이 고려되었습니다.
첫 번째 버전
메인 코드
Front-end
jquery의 ajax 사용
var queryParams = {"test":"xxx"}; var url = "xxx"; $.ajax({ type : "POST", //提交方式 url : url,//路径 contentType: "application/json", data: JSON.stringify(queryParams), beforeSend: function (request) { request.setRequestHeader("Authorization", "xxx"); }, success : function(result) { const blob = new Blob([result], {type:"application/vnd.ms-excel"}); if(blob.size < 1) { alert('导出失败,导出的内容为空!'); return } if(window.navigator.msSaveOrOpenBlob) { navigator.msSaveOrOpenBlob(blob, 'test.xls') } else { const aLink = document.createElement('a'); aLink.style.display = 'none'; aLink.href = window.URL.createObjectURL(blob); aLink.download = 'test.xls'; document.body.appendChild(aLink); aLink.click(); document.body.removeChild(aLink); } } });
Backend
easypoi 사용(easypoi 사용 방법은 Baidu를 참조하세요)
import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; @PostMapping(value = "/download") public void downloadList(@RequestBody Objct obj, HttpServletResponse response) { ...... List<Custom> excelList = new ArrayList<>(); // excel总体设置 ExportParams exportParams = new ExportParams(); // 指定sheet名字 exportParams.setSheetName("test"); Workbook workbook = ExcelExportUtil.exportExcel(exportParams, Custom.class, excelList); response.setContentType("application/vnd.ms-excel"); response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("test", "utf-8") + ".xls"); OutputStream outputStream = response.getOutputStream(); workbook.write(outputStream); outputStream.flush(); outputStream.close(); ...... }
테스트 결과
엑셀 정상적으로 내보낼 수 있는데 다운로드한 엑셀이 모두 깨져있습니다. 답변을 검색한 후 가능한 이유를 정리했습니다.
1. 문자 세트가 백엔드에 설정되지 않았거나, 스프링 프레임워크의 필터에 문자 세트가 균일하게 설정되어 있습니다.
2. ;
3. ajax에 request.responseType = "arraybuffer"를 추가해야 합니다.
지속적인 테스트를 거친 후에는 세 번째 지점으로 인해 발생해야 합니다. 하지만 jquery ajax에 추가한 후에도 여전히 작동하지 않으며, 잘못된 코드 문제를 해결할 수 없습니다.
두 번째 버전
메인 코드
프런트엔드, 네이티브 Ajax 사용. 백엔드는 변경되지 않습니다.
var xhr = new XMLHttpRequest(); xhr.responseType = "arraybuffer"; xhr.open("POST", url, true); xhr.onload = function () { const blob = new Blob([this.response], {type:"application/vnd.ms-excel"}); if(blob.size < 1) { alert('导出失败,导出的内容为空!'); return; } if(window.navigator.msSaveOrOpenBlob) { navigator.msSaveOrOpenBlob(blob, 'test.xls') } else { const aLink = document.createElement('a'); aLink.style.display = 'none'; aLink.href = window.URL.createObjectURL(blob); aLink.download = 'testxls'; document.body.appendChild(aLink); aLink.click(); document.body.removeChild(aLink); return; } } xhr.setRequestHeader("Authorization", "xxx"); xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(JSON.stringify(queryParams));
테스트 결과
다운받은 엑셀이 더 이상 깨지지 않고, 네이티브 Ajax에서 "arraybuffer"를 사용하는 것이 효과적입니다.
Summary
"arraybuffer" 이 매개변수는 Excel에서 잘못된 코드를 내보내는 원인이 됩니다. 그러나 이를 jquery의 ajax에 적용할 수 있는 방법은 없습니다.
위 내용은 Excel 보고서 내보내기의 Ajax 구현에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!