Hutool導出Excel,導多個Sheet頁

重要方法

// 指定要寫出的 Sheet 頁
bigWriter.setSheet(sheet.getSheetName());

工具類

public class HuExcelUtils {
    
    /** 
     * 導出多個 Sheet 頁
     * @param response
     * @param sheetList 頁數據
     * @param fileName 文件名
     */
    public static void exportExcel(HttpServletResponse response, List<SheetDTO> sheetList, String fileName) {
        ExcelWriter bigWriter = ExcelUtil.getBigWriter();
        // 重命名第一個Sheet的名稱,不然會默認多出一個Sheet1的頁
        bigWriter.renameSheet(0, sheetList.get(0).getSheetName());
        for (SheetDTO sheet : sheetList) {
            // 指定要寫出的 Sheet 頁
            bigWriter.setSheet(sheet.getSheetName());
            Integer[] columnWidth = sheet.getColumnWidth();
            if (columnWidth == null || columnWidth.length != sheet.getFieldAndAlias().size()) {
                // 設置默認寬度 
                for (int i = 0; i < sheet.getFieldAndAlias().size(); i++) {
                    bigWriter.setColumnWidth(i, 25);
                }
            } else {
                // 設置自定義寬度 
                for (int i = 0; i < columnWidth.length; i++) {
                    bigWriter.setColumnWidth(i, columnWidth[i]);
                }
            }
            // 設置字段和別名
            bigWriter.setHeaderAlias(sheet.getFieldAndAlias());
            // 設置只導出有別名的字段
            bigWriter.setOnlyAlias(true);
            // 設置默認行高
            bigWriter.setDefaultRowHeight(18);
            // 設置凍結行
            bigWriter.setFreezePane(1);
            // 一次性寫出內容,使用默認樣式,強制輸出標題
            bigWriter.write(sheet.getCollection(), true);
            // 設置所有列爲自動寬度,不考慮合併單元格
//            bigWriter.autoSizeColumnAll();
        }
        
        ServletOutputStream out = null;
        try {
            //response爲HttpServletResponse對象
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            response.setHeader("Content-Disposition", 
                    "attachment;filename=" + 
                            URLEncoder.encode(fileName + DateUtil.today() + ".xlsx", "UTF-8"));
            out = response.getOutputStream();
            bigWriter.flush(out, true);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 關閉writer,釋放內存
            bigWriter.close();
        }
        //此處記得關閉輸出Servlet流
        IoUtil.close(out);
    }
}

/**
 * Excel - Sheet頁
 */
public class SheetDTO implements Serializable {

    private static final long serialVersionUID = 1L;
    
    /** sheet頁名稱 */
    private String sheetName;
    
    /** 字段和別名,如果使用這個,properties 和 titles可以不用處理 */
    private Map<String, String> fieldAndAlias;
    
    /** 字段 */
    private String[] properties;
    
    /** 標題/別名 */
    private String[] titles;
    
    /** 列寬 */
    private Integer[] columnWidth;
    
    /** 數據集 */
    private Collection<?> collection;

    public Map<String, String> getFieldAndAlias() {
        if (fieldAndAlias == null) {
            this.fieldAndAlias = new LinkedHashMap<String, String>();
            for (int i = 0; i < properties.length; i++) {
                fieldAndAlias.put(properties[i], titles[i]);
            }
        }
        return fieldAndAlias;
    }

    public void setFieldAndAlias(Map<String, String> fieldAndAlias) {
        this.fieldAndAlias = fieldAndAlias;
    }
	// 省略其他set get
}

// 示例Controller
public Class TestController {

    /**
     * 條件全部導出
     */
    @ResponseBody
    @RequestMapping("/export_all")
    public void export_all(HttpServletResponse response, PolicyCountSupplementDTO policyCountSupplementDTO) {
        
        List<SheetDTO> sheetList = new ArrayList<SheetDTO>();
        
        List<Map<String, Object>> listDatas = policyCountSupplementService
                .findPage(policyCountSupplementDTO, null).getListData();

        /** 明細 */
        List<Map<String, Object>> policyCountItems = policyCountService.findItemInfoList(idStr);
        List<Map<String, Object>> policyCountSupplements = policyCountSupplementService.findListByPolicyCountId(idStr);

        //返利流水主表
        ExcelMultiViewData excelMultiViewData1 = getExcelMultiViewData1("政策上賬導出", listDatas);
        SheetDTO sheet1 = new SheetDTO();
        sheet1.setTitles(excelMultiViewData1.getTitles());
        sheet1.setProperties(excelMultiViewData1.getProperties());
        sheet1.setSheetName(excelMultiViewData1.getSheetName());
        sheet1.setCollection(listDatas);
        sheetList.add(sheet1);
        
        //返利流水明細
        ExcelMultiViewData excelMultiViewData2 = getExcelMultiViewData2("政策上賬導出", policyCountItems);
        SheetDTO sheet2 = new SheetDTO();
        sheet2.setTitles(excelMultiViewData2.getTitles());
        sheet2.setProperties(excelMultiViewData2.getProperties());
        sheet2.setSheetName(excelMultiViewData2.getSheetName());
        sheet2.setCollection(policyCountItems);
        sheetList.add(sheet2);
        
        // 特殊增補明細
        ExcelMultiViewData excelMultiViewData3 = getExcelMultiViewData3("政策上賬導出", policyCountSupplements);
        SheetDTO sheet3 = new SheetDTO();
        sheet3.setTitles(excelMultiViewData3.getTitles());
        sheet3.setProperties(excelMultiViewData3.getProperties());
        sheet3.setSheetName(excelMultiViewData3.getSheetName());
        sheet3.setCollection(policyCountSupplements);
        sheetList.add(sheet3);

        HuExcelUtils.exportExcel(response, sheetList, "政策上賬導出");
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章