【추천 관련 글: ajax 동영상 튜토리얼】
ajax를 사용하여 엑셀 보고서 내보내기 [깨진 문제 해결] 참고로 구체적인 내용은 다음과 같습니다
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. 문자 세트가 백엔드에 설정되지 않았거나, 스프링 프레임워크의 필터에 문자 세트가 균일하게 설정되어 있습니다. 프론트엔드 페이지에 설정되어 있지 않습니다. ;
3. ajax에 request.responseType = "arraybuffer"를 추가해야 합니다.
두 번째 버전
메인 코드
프런트엔드, 네이티브 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"를 사용하는 것이 효과적입니다.관련 학습 권장사항:
위 내용은 Ajax로 Excel 보고서를 내보내는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!