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); } } }
導出調用
導出結果: