導出excel之SXSSFWorkbook多sheet頁導出封裝


SXSSFWorkbook多sheet頁面導出模板配置:

{
    "excelName":"導出測試",
    "sheets":[
        {
            "sheetName":"測試頁1",
            "headers":[
                {
                    "key":"itemId",
                    "name":"ID"
                },{
                    "key":"itemName",
                    "name":"Name"
                },{
                    "key":"itemCode",
                    "name":"Code"
                }
            ]
        },{
            "sheetName":"測試頁2",
            "headers":[
                {
                    "key":"itemId",
                    "name":"ID"
                },{
                    "key":"category",
                    "name":"Category"
                },{
                    "key":"uom",
                    "name":"Uom"
                }
            ]
        }
    ]


}

導出代碼封裝:

import org.apache.commons.collections.MapUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.IOUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;


/**
 * @Auther: 
 * @Date: 201
 * @Description:
 */

public class ExcelExporter {
    private static final Logger LOGGER = LoggerFactory.getLogger(ExcelExporter.class);
    public static final String EXCEL_NAME = "excelName";
    public static final String DEFAULT_EXCEL_NAME = "數據導出";
    public static final String HEADERS = "headers";
    public static final String LINES = "lines";
    public static final String HEADER_DATA = "headerData";
    public static final String SHEET_DATA = "sheetData";
    public static final String LINE_DATA = "lineData";
    public static final String SHEETS = "sheets";
    public static final String SHEET_NAME = "sheetName";
    public static final String KEY = "key";
    public static final String NAME = "name";

    /**
     *
     * @param request
     * @param response
     * @param data  導出數據
     * @param styleTemplateService 模板服務類
     * @param styleTemplateCode  模板編碼
     * @param sourceFileName 文件名,可以為空
     * @throws Exception
     */
    public static void export(HttpServletRequest request, HttpServletResponse response, Map<String, Object> data, IStyleTemplateService styleTemplateService,String styleTemplateCode,String sourceFileName) throws Exception {
        Map<String, Object> config = styleTemplateService.getExportConfig(styleTemplateCode);
        String fileName = sourceFileName!=null?sourceFileName:MapUtils.getString(config, ExcelExporter.EXCEL_NAME, ExcelExporter.DEFAULT_EXCEL_NAME);
        setExcelHeader(response, request, fileName);


        List<Map<String, Object>> exportSheets = (List<Map<String, Object>>) config.get(SHEETS);

        // 創建一個工作簿
        // 處理07版本,但是適用於大數據量,導出之后數據不會占用內存
        SXSSFWorkbook workbook = new SXSSFWorkbook();
        String sheetName;
        String sheetData;
        SXSSFSheet sheet;
        List<Map<String, String>> headers;
        List<Map<String, Object>> lines;
        if (CollectionUtils.isNotEmpty(exportSheets)) {
            for (Map<String, Object> exportSheet : exportSheets) {
                //獲取sheet名
                sheetName = String.valueOf(exportSheet.get(SHEET_NAME));
                // 創建一個工作表sheet
                sheet = workbook.createSheet(sheetName);
                //獲取列名頭
                headers = (List<Map<String, String>>) exportSheet.get(HEADERS);
                //初始化頁簽頭
                initHeader(workbook, sheet, headers);
                //
                sheetData = String.valueOf(exportSheet.get(SHEET_DATA));
                //獲取各行數據
                lines = (List<Map<String, Object>>) data.get(sheetData);
                createTableRows(lines, headers, sheet);
                autoAllSizeColumn(sheet, headers.size());
            }
        }

        exportExcel(workbook, response.getOutputStream());
    }

    /**
     * 初始化表頭信息
     */

    private static void initHeader(SXSSFWorkbook sxssfWorkbook, Sheet sheet, List<Map<String, String>> headers) {
        // 創建第一行
        Row row = sheet.createRow(0);
        Cell cell;
        if (CollectionUtils.isEmpty(headers)) {
            return;
        }
        for (int i = 0; i < headers.size(); i++) {
            cell = row.createCell(i);
            cell.setCellValue(headers.get(i).get(NAME));
            setCellStyle(cell, sxssfWorkbook);
        }
    }


    /**
     * 設置單元格樣式
     *
     * @param cell 單元格
     */

    private static void setCellStyle(Cell cell, SXSSFWorkbook sxssfWorkbook) {
        // 設置樣式
        CellStyle cellStyle = sxssfWorkbook.createCellStyle();
        //cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 設置字體居中
        // 設置字體
        Font font = sxssfWorkbook.createFont();
        font.setFontName("宋體");
        font.setBold(true);// 字體加粗
        font.setFontHeightInPoints((short) 13);

        cellStyle.setFont(font);
        cell.setCellStyle(cellStyle);
    }

    /**
     * @param datas  數據,每一個map都是一行
     * @param header key[i]代表從map中獲取keys[i]的值作為第i列的值,如果傳的是null默認取表頭
     */

    private static void createTableRows(List<Map<String, Object>> datas, List<Map<String, String>> header, Sheet sheet) {
        if (CollectionUtils.isEmpty(datas) || CollectionUtils.isEmpty(header)) {
            return;
        }
        for (int i = 0, length_1 = datas.size(); i < length_1; i++) {
            // 創建行(從第二行開始)
            Map<String, Object> data = datas.get(i);
            Row row = sheet.createRow(i + 1);
            Cell cell;
            for (int j = 0, length_2 = header.size(); j < length_2; j++) {
                // 單元格獲取map中的key
                cell = row.createCell(j);
                cell.setCellValue(MapUtils.getString(data, header.get(j).get(KEY), ""));
            }

        }
    }

    /**
     * 根據表頭自動調整列寬度
     *
     * @param sheet
     * @param columnSzie 列數
     */
    private static void autoAllSizeColumn(SXSSFSheet sheet, int columnSzie) {
        sheet.trackAllColumnsForAutoSizing();
        for (int i = 0; i < columnSzie; i++) {
            sheet.autoSizeColumn(i);
        }
    }

    /**
     * 設置http請求報文為下載文件
     *
     * @param response
     * @param request
     * @param fileName
     * @throws UnsupportedEncodingException
     **/
    private static void setExcelHeader(HttpServletResponse response, HttpServletRequest request, String fileName)
            throws UnsupportedEncodingException {

        String name = fileName + ".xlsx";
        String userAgent = request.getHeader("User-Agent");
        if (userAgent.contains("Firefox")) {
            name = new String(name.getBytes("UTF-8"), "ISO8859-1");
        } else {
            name = URLEncoder.encode(name, "UTF-8");
        }
        response.addHeader("Content-Disposition", "attachment; filename=\"" + name + "\"");
        response.setContentType("application/octet-stream" + ";charset=" + "UTF-8");
        response.setHeader("Accept-Ranges", "bytes");
    }

    /**
     * 將數據寫出到excel中
     *
     * @param outputStream
     */

    private static void exportExcel(SXSSFWorkbook workbook, OutputStream outputStream) {
        try {
            workbook.write(outputStream);
        } catch (IOException e) {
            LOGGER.error(" exportExcel error", e);
        } finally {
            IOUtils.closeQuietly(outputStream);
        }
    }
}

導出調用

導出結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM