|
|
@@ -0,0 +1,141 @@
|
|
|
+package com.zksy.utils;
|
|
|
+
|
|
|
+import com.alibaba.excel.EasyExcel;
|
|
|
+import com.alibaba.excel.write.metadata.WriteSheet;
|
|
|
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
|
|
|
+import com.alibaba.excel.write.metadata.style.WriteFont;
|
|
|
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
|
|
|
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.OutputStream;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+public class ExcelExportUtil {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通用 Excel 导出方法,只导出有 @ExcelProperty 注解的字段
|
|
|
+ * @param response HTTP 响应对象
|
|
|
+ * @param dataList 数据列表
|
|
|
+ * @param head 表头类型
|
|
|
+ * @param fileName 文件名
|
|
|
+ * @param sheetName 工作表名
|
|
|
+ * @param <T> 数据类型
|
|
|
+ * @return 导出成功返回 true,失败返回 false
|
|
|
+ */
|
|
|
+ public static <T> boolean exportExcel(HttpServletResponse response, List<T> dataList, Class<T> head,
|
|
|
+ String fileName, String sheetName) {
|
|
|
+ try {
|
|
|
+ // 设置响应头
|
|
|
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
|
+ response.setCharacterEncoding("UTF-8");
|
|
|
+ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
|
|
|
+
|
|
|
+ // 配置表头样式
|
|
|
+ WriteCellStyle headWriteCellStyle = new WriteCellStyle();
|
|
|
+ headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
|
|
|
+ WriteFont headWriteFont = new WriteFont();
|
|
|
+ headWriteFont.setFontHeightInPoints((short)12);
|
|
|
+ headWriteCellStyle.setWriteFont(headWriteFont);
|
|
|
+
|
|
|
+ // 配置内容样式
|
|
|
+ WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
|
|
|
+ contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
|
|
|
+
|
|
|
+ // 应用样式策略
|
|
|
+ HorizontalCellStyleStrategy horizontalCellStyleStrategy =
|
|
|
+ new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
|
|
|
+
|
|
|
+ // 获取输出流并写入 Excel 数据,使用指定的类作为表头,会自动过滤没有 @ExcelProperty 注解的字段
|
|
|
+ try (OutputStream outputStream = response.getOutputStream()) {
|
|
|
+ EasyExcel.write(outputStream, head)
|
|
|
+ .registerWriteHandler(horizontalCellStyleStrategy)
|
|
|
+ .sheet(sheetName)
|
|
|
+ .doWrite(dataList);
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ } catch (IOException e) {
|
|
|
+ // 记录异常日志
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 导出多 sheet 的 Excel 文件,只导出有 @ExcelProperty 注解的字段
|
|
|
+ * @param response HTTP 响应对象
|
|
|
+ * @param sheetDataList 多个 sheet 的数据列表
|
|
|
+ * @param fileName 文件名
|
|
|
+ */
|
|
|
+ public static void exportMultiSheetExcel(HttpServletResponse response,
|
|
|
+ List<SheetData<?>> sheetDataList,
|
|
|
+ String fileName) {
|
|
|
+ try {
|
|
|
+ // 设置响应头
|
|
|
+ response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
|
|
+ response.setCharacterEncoding("UTF-8");
|
|
|
+ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
|
|
|
+
|
|
|
+ // 配置表头样式
|
|
|
+ WriteCellStyle headWriteCellStyle = new WriteCellStyle();
|
|
|
+ headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
|
|
|
+ WriteFont headWriteFont = new WriteFont();
|
|
|
+ headWriteFont.setFontHeightInPoints((short)12);
|
|
|
+ headWriteCellStyle.setWriteFont(headWriteFont);
|
|
|
+
|
|
|
+ // 配置内容样式
|
|
|
+ WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
|
|
|
+ contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
|
|
|
+
|
|
|
+ // 应用样式策略
|
|
|
+ HorizontalCellStyleStrategy horizontalCellStyleStrategy =
|
|
|
+ new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
|
|
|
+
|
|
|
+ // 获取输出流并写入 Excel 数据
|
|
|
+ try (OutputStream outputStream = response.getOutputStream()) {
|
|
|
+ var excelWriter = EasyExcel.write(outputStream).registerWriteHandler(horizontalCellStyleStrategy).build();
|
|
|
+ try {
|
|
|
+ for (SheetData<?> sheetData : sheetDataList) {
|
|
|
+ WriteSheet writeSheet = EasyExcel.writerSheet(sheetData.getSheetName())
|
|
|
+ .head(sheetData.getHead()).build();
|
|
|
+ excelWriter.write(sheetData.getDataList(), writeSheet);
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ // 关闭 writer,释放内存
|
|
|
+ excelWriter.finish();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 内部类,用于存储 sheet 数据
|
|
|
+ */
|
|
|
+ public static class SheetData<T> {
|
|
|
+ private String sheetName;
|
|
|
+ private Class<T> head;
|
|
|
+ private List<T> dataList;
|
|
|
+
|
|
|
+ public SheetData(String sheetName, Class<T> head, List<T> dataList) {
|
|
|
+ this.sheetName = sheetName;
|
|
|
+ this.head = head;
|
|
|
+ this.dataList = dataList;
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getSheetName() {
|
|
|
+ return sheetName;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Class<T> getHead() {
|
|
|
+ return head;
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<T> getDataList() {
|
|
|
+ return dataList;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|