Prefacio: La ventaja de usar la plantilla de Excel para exportar Excel es que puede definir colores, formatos, etc. en la plantilla de antemano, lo cual es adecuado para escenarios donde el diseño de la plantilla es más flexible y complejo.
1. Agregar paquete de frasco
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.2.0</version>
</dependency>
2. Agregar herramientas
package com.xinke.sunshine_ebid.common.utils;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
public class EasyPoiUtils {
private EasyPoiUtils() {
}
public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
try {
fileName += ".xls";
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
response.setHeader("FileName", URLEncoder.encode(fileName, "utf-8"));
response.setHeader("Access-Control-Expose-Headers", "FileName");
workbook.write(response.getOutputStream());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static void downLoad2007Excel(String fileName, HttpServletResponse response, Workbook workbook) {
try {
fileName += ".xlsx";
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
response.setHeader("FileName", URLEncoder.encode(fileName, "utf-8"));
response.setHeader("Access-Control-Expose-Headers", "FileName");
workbook.write(response.getOutputStream());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static <T> void defaultExport(List<T> dataList, Class<?> clz, String fileName, HttpServletResponse response, ExportParams exportParams) {
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, clz, dataList);
if (workbook != null) {
downLoadExcel(fileName, response, workbook);
}
}
public static <T> void exportExcel(List<T> dataList, String title, String sheetName, Class<?> clz, String fileName, boolean isCreateHeader, HttpServletResponse response) {
ExportParams exportParams = new ExportParams(title, sheetName);
exportParams.setCreateHeadRows(isCreateHeader);
defaultExport(dataList, clz, fileName, response, exportParams);
}
public static <T> void exportExcel(List<T> dataList, String title, String sheetName, Class<?> clz, String fileName, HttpServletResponse response) {
defaultExport(dataList, clz, fileName, response, new ExportParams(title, sheetName));
}
private static void defaultExport(List<Map<String, Object>> dataList, String fileName, HttpServletResponse response) {
Workbook workbook = ExcelExportUtil.exportExcel(dataList, ExcelType.HSSF);
if (workbook != null) {
downLoadExcel(fileName, response, workbook);
}
}
public static void exportExcel(List<Map<String, Object>> dataList, String fileName, HttpServletResponse response) {
defaultExport(dataList, fileName, response);
}
public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> clz) {
if (StringUtils.isBlank(filePath)) {
return null;
}
ImportParams params = new ImportParams();
params.setTitleRows(titleRows);
params.setHeadRows(headerRows);
try {
return ExcelImportUtil.importExcel(new File(filePath), clz, params);
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> clz) {
if (file == null) {
return null;
}
ImportParams params = new ImportParams();
params.setTitleRows(titleRows);
params.setHeadRows(headerRows);
try {
return ExcelImportUtil.importExcel(file.getInputStream(), clz, params);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
3. Haz una plantilla
Incluya los parámetros que se reemplazarán con { {}} y use la forma de { {!fe: nombre de la colección t. nombre del parámetro 1 t. nombre del parámetro 2}} para recorrer el tipo establecido de datos transversales . Se pueden usar varias hojas y deben estar centrados o la configuración de color, etc. se puede modificar directamente en la plantilla
4. Aplicación de código
clase de colección
package com.xinke.sunshine_ebid.dal.entity;
import lombok.Data;
@Data
public class TestEntity {
private String name;
private String phone;
private String address;
}
capa de control
package com.xinke.sunshine_ebid.webapp;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import com.xinke.sunshine_ebid.common.utils.EasyPoiUtils;
import com.xinke.sunshine_ebid.service.TestService;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
@CrossOrigin
@RestController
@RequestMapping(value = "/Test")
public class TestController {
@Resource
private TestService testService;
/**
* 使用Excel模板导出excel表格
* @param response
* @throws Exception
*/
@GetMapping("/test")
public void test(HttpServletResponse response) throws Exception{
// 使用map来封装参数
Map<String, Object> map = testService.test();
// 模板路径
TemplateExportParams params = new TemplateExportParams("fileRecord/template/excel/test1.xlsx", true);
String fileName = "导出来的报表名称";
Workbook workbook = ExcelExportUtil.exportExcel(params, map);
workbook.setForceFormulaRecalculation(true);
EasyPoiUtils.downLoad2007Excel(fileName, response, workbook);
}
}
capa de lógica de negocios
package com.xinke.sunshine_ebid.service;
import com.xinke.sunshine_ebid.common.utils.CustomXWPFDocument;
import com.xinke.sunshine_ebid.common.utils.WordUtil;
import com.xinke.sunshine_ebid.dal.entity.TestEntity;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.poi.xwpf.usermodel.*;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class TestService {
public Map<String,Object> test() throws Exception{
// 封装参数
Map<String, Object> params = new HashMap<>();
params.put("date","2023年3月7日");
List<TestEntity> list = new ArrayList<>();
TestEntity test = new TestEntity();
test.setName("瓜");
test.setPhone("18888888888");
test.setAddress("PD");
list.add(test);
TestEntity test2 = new TestEntity();
test2.setName("瓜2");
test2.setPhone("1999999999");
test2.setAddress("PD2");
list.add(test2);
params.put("list",list);
return params;
}
}
5. prueba
localhost: puerto local /Prueba/prueba
Exportación exitosa