Spring Boot+AngularJS匯出excel

大浪中航行發表於2016-09-06

這次在專案開發中,需要實現考題匯出,由於本專案是使用Spring Boot+AngularJs的開發模式,原來那種表單式的請求方式不是很便捷,以下是基於AngularJs非同步請求的程式碼。


首先是JS程式碼

function exportExam() {
            $http({
                url: url + "export",
                responseType: 'arraybuffer'
            }).success(function (res) {
                var blob = new Blob([res], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;"});
                //var blob = new Blob([res], {type: "application/octet-stream"});  這種型別的轉換同樣可行
                saveAs(blob, "考題資訊.xlsx");
            });
        }

這裡需要注意三點:1、要在http的請求中將responseType設定為‘arraybuffer’型別,因為後臺會將生成的excel轉換成Byte陣列並傳送到前臺

    2、經過博主測試,Blob的型別為以上兩種都可以

    3、為了更好的相容瀏覽器,我們在這裡使用了saveAs方法,這個方法是file-saver這個外掛提供的



後臺程式碼

public byte[] export(Integer[] idlist, int[] isoutput,
            String[] title) throws IOException {
        Map model = new HashMap();
        model.put("excelName", "考題資訊.xlsx");
        model.put("sheetName", "sheet1");
        model.put("title", title);

        if (idlist == null || idlist.length == 0)
            model.put("list", repo.findAll());
        else {
            List<Integer> ids = new ArrayList<Integer>();
            for (int i = 0; i < idlist.length; i++)
                ids.add(idlist[i]);
            model.put("list", repo.findAll(ids));
        }

        model.put("isoutput", isoutput);

        XSSFWorkbook book = new XSSFWorkbook();

        XSSFSheet sheet = book.createSheet(model.get("sheetName").toString());
        XSSFRow header = sheet.createRow(0);

        // 產生標題列
        int j = 0;
        for (int i = 0; i < title.length; i++) {
            if (isoutput[i] == 1) header.createCell(j++).setCellValue(title[i]);
        }
        int rowNum = 1;
        for (Exam exam : (List<Exam>) model.get("list")) {
            j = 0;
            XSSFRow row = sheet.createRow(rowNum++);
            if (isoutput[0] == 1) {
                row.createCell(j).setCellValue(exam.getTest());
                j++;
            }
            if (isoutput[1] == 1) {
                row.createCell(j).setCellValue(exam.getOp1());
                j++;
            }
            if (isoutput[2] == 1) {
                row.createCell(j).setCellValue(exam.getOp2());
                j++;
            }
            if (isoutput[3] == 1) {
                row.createCell(j).setCellValue(exam.getOp3());
                j++;
            }
            if (isoutput[4] == 1) {
                row.createCell(j).setCellValue(exam.getOp4());
                j++;
            }
            if (isoutput[5] == 1) {
                row.createCell(j).setCellValue(exam.getAnswer());
                j++;
            }
            if (isoutput[6] == 1) {
                row.createCell(j).setCellValue(exam.getTotal());
                j++;
            }
            if (isoutput[7] == 1) {
                row.createCell(j).setCellValue(exam.gettotalCorrect());
                j++;
            }
            if (isoutput[8] == 1) {
                row.createCell(j).setCellValue(
                        (double) exam.gettotalCorrect() / exam.getTotal());
                j++;
            }
        }

        ByteArrayOutputStream output = new ByteArrayOutputStream();
        book.write(output);
        byte[] b = output.toByteArray();
        return b;
    }

由於這部分程式碼經過各種修改,還沒有整理好,這裡大概說下思路。首先上半部分是查詢後臺資料並生成xlsx檔案,也就是book物件;然後book.write方法將book轉化為ByteArraryOutputStream,由於非同步請求是通過Json來與前臺互動的,因此不能直接傳輸ByteArraryOutputStream,所以有將它轉換為byte陣列。


以上是主要程式碼,經測試,該檔案匯出功能在Chrome、IE、獵豹瀏覽器中都能正常匯出。

相關文章