package com.example.demo.core.utils; import com.example.demo.model.ExcelData; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFColor; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder.BorderSide; import javax.servlet.http.HttpServletResponse; import java.awt.Color; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.List; public class ExcelUtils { /** * 使用浏览器选择路径下载 * @param response * @param fileName * @param data * @throws Exception */ public static void exportExcel(HttpServletResponse response, String fileName, ExcelData data) throws Exception { // 告诉浏览器用什么软件可以打开此文件 response.setHeader("content-Type", "application/vnd.ms-excel"); // 下载文件的默认名称 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xls", "utf-8")); exportExcel(data, response.getOutputStream()); } public static int generateExcel(ExcelData excelData, String path) throws Exception { File f = new File(path); FileOutputStream out = new FileOutputStream(f); return exportExcel(excelData, out); } private static int exportExcel(ExcelData data, OutputStream out) throws Exception { XSSFWorkbook wb = new XSSFWorkbook(); int rowIndex = 0; try { String sheetName = data.getName(); if (null == sheetName) { sheetName = "Sheet1"; } XSSFSheet sheet = wb.createSheet(sheetName); rowIndex = writeExcel(wb, sheet, data); wb.write(out); } catch (Exception e) { e.printStackTrace(); } finally { //此处需要关闭 wb 变量 out.close(); } return rowIndex; } private static int writeExcel(XSSFWorkbook wb, Sheet sheet, ExcelData data) { int rowIndex = 0; writeTitlesToExcel(wb, sheet, data.getTitles()); rowIndex = writeRowsToExcel(wb, sheet, data.getRows(), rowIndex); autoSizeColumns(sheet, data.getTitles().size() + 1); return rowIndex; } /** * 设置表头 * * @param wb * @param sheet * @param titles * @return */ private static int writeTitlesToExcel(XSSFWorkbook wb, Sheet sheet, List<String> titles) { int rowIndex = 0; int colIndex = 0; Font titleFont = wb.createFont(); //设置字体 titleFont.setFontName("simsun"); //设置粗体 titleFont.setBoldweight(Short.MAX_VALUE); //设置字号 titleFont.setFontHeightInPoints((short) 14); //设置颜色 titleFont.setColor(IndexedColors.BLACK.index); XSSFCellStyle titleStyle = wb.createCellStyle(); //水平居中 titleStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); //垂直居中 titleStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); //设置图案颜色 titleStyle.setFillForegroundColor(new XSSFColor(new Color(182, 184, 192))); //设置图案样式 titleStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND); titleStyle.setFont(titleFont); setBorder(titleStyle, BorderStyle.THIN, new XSSFColor(new Color(0, 0, 0))); Row titleRow = sheet.createRow(rowIndex); titleRow.setHeightInPoints(25); colIndex = 0; for (String field : titles) { Cell cell = titleRow.createCell(colIndex); cell.setCellValue(field); cell.setCellStyle(titleStyle); colIndex++; } rowIndex++; return rowIndex; } /** * 设置内容 * * @param wb * @param sheet * @param rows * @param rowIndex * @return */ private static int writeRowsToExcel(XSSFWorkbook wb, Sheet sheet, List<List<Object>> rows, int rowIndex) { int colIndex; Font dataFont = wb.createFont(); dataFont.setFontName("simsun"); dataFont.setFontHeightInPoints((short) 14); dataFont.setColor(IndexedColors.BLACK.index); XSSFCellStyle dataStyle = wb.createCellStyle(); dataStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); dataStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); dataStyle.setFont(dataFont); setBorder(dataStyle, BorderStyle.THIN, new XSSFColor(new Color(0, 0, 0))); for (List<Object> rowData : rows) { Row dataRow = sheet.createRow(rowIndex); dataRow.setHeightInPoints(25); colIndex = 0; for (Object cellData : rowData) { Cell cell = dataRow.createCell(colIndex); if (cellData != null) { cell.setCellValue(cellData.toString()); } else { cell.setCellValue(""); } cell.setCellStyle(dataStyle); colIndex++; } rowIndex++; } return rowIndex; } /** * 自动调整列宽 * * @param sheet * @param columnNumber */ private static void autoSizeColumns(Sheet sheet, int columnNumber) { for (int i = 0; i < columnNumber; i++) { int orgWidth = sheet.getColumnWidth(i); sheet.autoSizeColumn(i, true); int newWidth = (int) (sheet.getColumnWidth(i) + 100); if (newWidth > orgWidth) { sheet.setColumnWidth(i, newWidth); } else { sheet.setColumnWidth(i, orgWidth); } } } /** * 设置边框 * * @param style * @param border * @param color */ private static void setBorder(XSSFCellStyle style, BorderStyle border, XSSFColor color) { style.setBorderTop(border); style.setBorderLeft(border); style.setBorderRight(border); style.setBorderBottom(border); style.setBorderColor(BorderSide.TOP, color); style.setBorderColor(BorderSide.LEFT, color); style.setBorderColor(BorderSide.RIGHT, color); style.setBorderColor(BorderSide.BOTTOM, color); } }