From b4f7dbcf1771ba8bcd367ad87ade82a37f8aef9c Mon Sep 17 00:00:00 2001 From: mrz <17966059@qq.com> Date: Wed, 15 Apr 2020 17:04:43 +0800 Subject: [PATCH] 后端导出excel --- pom.xml | 18 ++++++++++++++++++ src/main/java/com/tianbo/util/POI/ExportExcelUtil.java | 209 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 227 insertions(+), 0 deletions(-) create mode 100644 src/main/java/com/tianbo/util/POI/ExportExcelUtil.java diff --git a/pom.xml b/pom.xml index 33d42c1..93beca0 100755 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,24 @@ <version>1.18.10</version> <scope>compile</scope> </dependency> + <!-- excel导出--> + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi-ooxml</artifactId> + <version>4.1.0</version> + </dependency> + <dependency> + <groupId>org.apache.tomcat.embed</groupId> + <artifactId>tomcat-embed-core</artifactId> + <version>9.0.30</version> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.apache.tomcat.embed</groupId> + <artifactId>tomcat-embed-core</artifactId> + <version>9.0.30</version> + <scope>compile</scope> + </dependency> </dependencies> <build> diff --git a/src/main/java/com/tianbo/util/POI/ExportExcelUtil.java b/src/main/java/com/tianbo/util/POI/ExportExcelUtil.java new file mode 100644 index 0000000..606df40 --- /dev/null +++ b/src/main/java/com/tianbo/util/POI/ExportExcelUtil.java @@ -0,0 +1,209 @@ +package com.tianbo.util.POI; + + +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Iterator; +import java.util.List; + +/** + * @author: lucifer + * @description: Excel导出工具类 + */ +@Slf4j +public class ExportExcelUtil<T> { + /** + * excel ./xls后缀 + */ + public static final String EXTENSION_XLS = ".xls"; + + + /** + * excel ./xlsx后缀 + */ + public static final String EXTENSION_XLSX = ".xlsx"; + + /** + * 导出文件夹路径 + */ + public static final String EXCEL_PATH = "./upload/"; + + + + /** + * 兼容.xls和.xlsx格式 + * + * @param originalFilename + * @return + */ + private Workbook getWorkbook(String originalFilename) { + Workbook workbook = null; + if (originalFilename.endsWith(EXTENSION_XLS)) { + workbook = new HSSFWorkbook(); + } else if (originalFilename.endsWith(EXTENSION_XLSX)) { + workbook = new XSSFWorkbook(); + } + return workbook; + } + + + /** + * 导出 + * + * @param originalFilename + * @param sheetName + * @param headers + * @param columns + * @param lists + * @throws Exception + */ + public void export(String originalFilename, String sheetName, String[] headers, String[] columns, List<T> lists,HttpServletResponse response) throws Exception { + Workbook workbook = getWorkbook(originalFilename); + Sheet sheet = workbook.createSheet(sheetName); + sheet.setDefaultColumnWidth(15); + //设置表头样式 + CellStyle style = setHeaderStyle(workbook); + Row row = sheet.createRow(0); + for (int i = 0; i < headers.length; i++) { + Cell headerCell = row.createCell(i); + headerCell.setCellValue(headers[i]); + headerCell.setCellStyle(style); + } + Iterator<T> it = lists.iterator(); + int rowIndex = 0; + while (it.hasNext()) { + rowIndex++; + row = sheet.createRow(rowIndex); + T t = it.next(); + Field[] fields = t.getClass() + .getDeclaredFields(); + for (int i = 0; i < fields.length; i++) { + Field field = fields[i]; + String fieldName = field.getName(); + for (int j = 0; j < columns.length; j++) { + if (fieldName.equals(columns[j])) { + String getMethodName = "get" + + fieldName.substring(0, 1). + toUpperCase() + fieldName. + substring(1); + Class cls = t.getClass(); + Method getMethod = cls.getMethod( + getMethodName, new Class[]{}); + Object val = getMethod.invoke( + t, new Object[]{}); + String textVal; + if (null != val) { + textVal = val.toString(); + } else { + textVal = ""; + } + Cell cell = row.createCell(j); + cell.setCellValue(textVal); +// CellStyle cellStyle = setCellStyle(workbook, i); + cell.setCellStyle(style); + //单元格列宽设置 + sheet.autoSizeColumn(j); + sheet.setColumnWidth(j, sheet.getColumnWidth(j)*17/10 > 255 * 256 ? 255 * 256 : sheet.getColumnWidth(j)*17/10); + + log.info("i:===============" + i + ",j:================" + j + ",textVal:" + textVal); + } + } + } + } + String filename = sheetName + System.currentTimeMillis() + ".xls"; + //判断是否有文件夹,没有就创建 + File file = new File(EXCEL_PATH); + if (!file.exists()) { + file.mkdirs(); + } + String filepath = EXCEL_PATH + filename; + + + System.out.println("filepath:" + filepath); + FileOutputStream out = new FileOutputStream(filepath); + workbook.write(out); + out.close(); + + downloadExcel(filepath, response); + } + + /** + * 设置表头样式 + * + * @param workbook + * @return + */ + private CellStyle setHeaderStyle(Workbook workbook) { + CellStyle cellStyle = workbook.createCellStyle(); + //水平居中 + cellStyle.setAlignment(HorizontalAlignment.CENTER_SELECTION); + //垂直居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + //设置边框 + cellStyle.setBorderTop(BorderStyle.THIN); + cellStyle.setBorderRight(BorderStyle.THIN); + cellStyle.setBorderBottom(BorderStyle.THIN); + cellStyle.setBorderLeft(BorderStyle.THIN); + //设置字体 + Font cellFont = workbook.createFont(); + cellFont.setBold(true); + cellStyle.setFont(cellFont); + return cellStyle; + } + + /** + * 设置单元格样式 + */ + private CellStyle setCellStyle(Workbook workbook, int i) { + CellStyle cellStyle = workbook.createCellStyle(); + //奇数列 左对齐 + if ((i & 1) != 1) { + cellStyle.setAlignment(HorizontalAlignment.LEFT); + } else { + //水平居中 + cellStyle.setAlignment(HorizontalAlignment.CENTER_SELECTION); + } + //垂直居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + //设置边框 + cellStyle.setBorderTop(BorderStyle.THIN); + cellStyle.setBorderRight(BorderStyle.THIN); + cellStyle.setBorderBottom(BorderStyle.THIN); + cellStyle.setBorderLeft(BorderStyle.THIN); + //设置字体 + Font cellFont = workbook.createFont(); + cellFont.setFontName("仿宋_GB2312"); + cellStyle.setFont(cellFont); + return cellStyle; + } + + + /** + * 下载 + */ + public static void downloadExcel(String filepath, HttpServletResponse response) + throws IOException { + File file = new File(filepath); + String fileName = file.getName(); + response.setContentType("application/vnd.ms-excel;charset=utf-8"); + response.addHeader("Content-Transfer-Encoding", "binary"); + response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("UTF-8"), "ISO8859-1")); + response.setCharacterEncoding("utf-8"); + InputStream fis = new BufferedInputStream(new FileInputStream(file)); + byte[] b = new byte[fis.available()]; + fis.read(b); + response.getOutputStream().write(b); + fis.close(); + log.info("导出完毕"); + } + +} + + -- libgit2 0.24.0