在项目里面基本上,只要遇到报表或者数据表格都需要进行导出,每个页面写一个导出方法又太麻烦。经过多个项目的练手,我觉得需要把导出方法进行封装或者说模块化,这样无论是前端调用还是后端调用都只需要提供表头和数据,就可以进行excel的导出不必一个页面写一个导出。
只要是excel的导出必定有表头,数据内容,那么调用导出模块时只需要两种数组,①表头部分,②数据部分 表头和数据都是动态的 这样就实现了动态表头功能
请求示例
{
//表头
"table_name_head": [
{
"label": "经销商编码",
"key": "dealer_code"
},
{
"label": "经销商名称",
"key": "dealer_name"
},
{
"label": "创建人",
"key": "create"
},
{
"label": "地区",
"key": "region"
}
],
//excel数据
"data": [
{
"dealer_code": "5645343",
"dealer_name": "xxxxxx",
"create": "JNJX",
"region": "North"
}
]
}
模块使用了三个参数
ExcelUtil.exportExcel("excelTemplate",map,response);
excelTemplate //模板名称
map // 里面存在两个元素 表头数组 ,数据数组
response //HttpServletResponse
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
/**
* @PACKAGE_NAME: com.spike.util.controller
* @USER: spike
* @DATE: 2023/4/27 15:46
* @PROJECT_NAME: Springcolud_Spike
*/
@Slf4j
public class ExcelUtil {
/**
* 判断excel文件类型正则表达式
*/
private static final String IS_EXCEL = "^.+\\.(?i)((xls)|(xlsx))$";
/**
* 判断是否为 xls后缀版本的excel
*/
private static final String IS_XLS_EXCEL = "^.+\\.(?i)(xls)$";
/**
* 存放excel模板的目录
*/
private static final String CLASS_PATH = "templates/excel/";
/**
* 动态表头
*/
public static final String TABLE_NAME_HEAD = "table_name_head";
public static final String LABEL = "label";
public static final String KEY = "key";
public static void exportExcel(String execlTempleName, Map map, HttpServletResponse response) throws Exception {
ExcelUtil.ExcelTemplate excelTemplate = ExcelUtil.ExcelTemplate.init(execlTempleName + ".xlsx");
Workbook workbook = excelTemplate.getWorkbook();
Sheet sheetAt = workbook.getSheetAt(0);
//获取动态表头
if (map.get(TABLE_NAME_HEAD) == null || !(map.get(TABLE_NAME_HEAD) instanceof List)) {
log.info("动态标题格式异常,导出失败!");
return;
}
//动态表头
List
maven依赖
org.apache.poi
poi
3.17
org.apache.poi
poi-ooxml
3.17
导出模块使用的是模板填充 所以还需要在resources 下面添加空白的excel模板
新建一个excel文件作为模板即可
基本的导出模块已经完成 只需要把导出模块放在工具类中,在service中调用就可以了(也可以把接口放开直接让前端传动态表头和需要导出的数据),非常方便摸鱼