接着上篇文章 Java根据模板导出Excel并生成多个Sheet 简单介绍下EasyPoi的使用,直接上代码吧
首先当然是先引入jar包了,看下图
其次,还是贴代码吧看实例,下面是根据模板导出的工具类,包含Excel和word
/**
* 导出Excel或Word文件
* @ClassName:ExportExcelOrWord
* @author leon
* @createDate 2018年11月26日 下午14:25:27
* @version v1.0
* @classRemarks TODO
*/
@Configuration
public class ExportExcelOrWord {
private static Logger logger = LoggerFactory.getLogger(ExportExcelOrWord.class);
//模板地址
@Value("${fileTemplateUrl}")
private String fileTemplateUrl="D:/";
//文件存储地址
@Value("${fileGoalUrl}")
private String fileGoalUrl="D:/export/";
/**
* 导出word数据(07版)
* @param params map数据集合
* @param fileName 模板名称
* @param goalName 文件名称
* @return 文件存储地址
* @throws Exception
*/
public String exportWord(Map<String, Object> params, String fileName, String goalName){
try {
fileName=fileTemplateUrl+fileName+".docx";
XWPFDocument doc = WordExportUtil.exportWord07(fileName, params);
// 判断文件存放地址是否存在,没有则创建
File savefile = new File(fileGoalUrl);
if (!savefile.exists()) {
logger.info("导出word数据时存储文件目录不存在,为您创建文件夹!");
savefile.mkdirs();
}
goalName=fileGoalUrl+goalName+".docx";
FileOutputStream fos = new FileOutputStream(goalName);
doc.write(fos);
fos.close();
} catch (Exception e) {
e.printStackTrace();
logger.error("导出word数据异常:"+e);
return null;
}
return goalName;
}
/**
* 按模板导出Excel数据
* @param params 数据
* @param fileName 模板名称
* @param goalName 文件名称
* @return 文件存储地址
* @throws Exception
*/
public String exportExcel(Map<String, Object> params, String fileName, String goalName){
try {
fileName=fileTemplateUrl+fileName+".xlsx";
TemplateExportParams templateUrl = new TemplateExportParams(fileName);
Workbook workbook = ExcelExportUtil.exportExcel(templateUrl, params);
// 判断文件存放地址是否存在,没有则创建
File savefile = new File(fileGoalUrl);
if (!savefile.exists()) {
logger.info("按模板导出Excel数据时存储文件目录不存在,为您创建文件夹!");
savefile.mkdirs();
}
goalName=fileGoalUrl+goalName+".xlsx";
FileOutputStream fos = new FileOutputStream(goalName);
workbook.write(fos);
fos.close();
}catch (IOException e) {
e.printStackTrace();
logger.error("按模板导出Excel数据异常:"+e);
return null;
}
return goalName;
}
/**
* 按模板导出Excel数据(支持文件流读取文件)
* @param params 数据
* @param fileName 模板名称
* @param goalName 文件名称
* @return 文件存储地址
* @throws Exception
*/
public String exportExcel(Map<String, Object> params, String fileName, String goalName,HttpServletResponse response){
try {
fileName=fileTemplateUrl+fileName+".xlsx";
TemplateExportParams templateUrl = new TemplateExportParams(fileName);
Workbook workbook = ExcelExportUtil.exportExcel(templateUrl, params);
// 判断文件存放地址是否存在,没有则创建
File savefile = new File(fileGoalUrl);
if (!savefile.exists()) {
logger.info("按模板导出Excel数据时存储文件目录不存在,为您创建文件夹!");
savefile.mkdirs();
}
//写文件流
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(goalName+".xlsx", "UTF-8"));
workbook.write(response.getOutputStream());
//写文件
goalName=fileGoalUrl+goalName+".xlsx";
FileOutputStream fos = new FileOutputStream(goalName);
workbook.write(fos);
fos.close();
}catch (IOException e) {
e.printStackTrace();
logger.error("按模板导出Excel数据异常:"+e);
return null;
}
return goalName;
}
/**
* 多sheet导出Excel数据 每个sheet对应一个map,
* key是sheet的NUM
* @param params 数据集合
* @param fileName 模板名称
* @param goalName 文件名称
* @return 文件存储地址
* @throws Exception
*/
public String exportExcelManeySheet(Map<Integer, Map<String, Object>> params, String fileName, String goalName){
try {
fileName=fileTemplateUrl+fileName+".xlsx";
TemplateExportParams templateUrl = new TemplateExportParams(fileName);
Workbook workbook = ExcelExportUtil.exportExcel(params, templateUrl);
// 判断文件存放地址是否存在,没有则创建
File savefile = new File(fileGoalUrl);
if (!savefile.exists()) {
logger.info("多sheet导出Excel数据的存储文件目录不存在,为您创建文件夹!");
savefile.mkdirs();
}
goalName=fileGoalUrl+goalName+".xlsx";
FileOutputStream fos = new FileOutputStream(goalName);
workbook.write(fos);
fos.close();
} catch (Exception e) {
e.printStackTrace();
logger.error("多sheet导出Excel数据异常:"+e);
return null;
}
return goalName;
}
/**
* 单Excel文件多sheet导出Excel数据(注意sheetMap的key需与对象数组中的对象名称一致)
* @param sheetMap map数据 如:sheetMap.put("PersonnelInfo",List<PersonnelInfo>);
* @param sheetName sheet名称数组 如:new String[] {"人员信息","家庭信息",...};
* @param objectClass 对象名称数组 如:new String[] {"PersonnelInfo","EducatInfo",...};
* @param goalName 文件名称
* @return 文件存储地址
* @throws Exception
*/
public String exportExcelManeySheet(Map<Object, Object> sheetMap,String[] sheetName,String[] objectClass,String goalName){
//判断参数是否为空
if (sheetName.length<1||objectClass.length<1||sheetMap==null||StringUtil.isNull(goalName)) {
return null;
}
try {
List<Map<String, Object>> sheetsList = new ArrayList<Map<String, Object>>() ;
for (int i = 0; i < sheetName.length; i++) {
//判断map和对象是否为空
if (StringUtil.isNull(objectClass[i]) &&sheetMap.get(objectClass[i]) == null) {
continue;
}
ExportParams exportParams = new ExportParams() ;
exportParams.setSheetName(sheetName[i]);
exportParams.setStyle(ExcelExportStyler.class);
Map<String, Object> exportMap = new HashMap<String, Object>();
exportMap.put("title",exportParams);
exportMap.put("entity",Class.forName("com.isoftstone.common.utils.excelUtil.entity."+objectClass[i]));
exportMap.put("data", sheetMap.get(objectClass[i]));
sheetsList.add(exportMap);
}
Workbook workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF) ;
// 判断文件存放地址是否存在,没有则创建
File savefile = new File(fileGoalUrl);
if (!savefile.exists()) {
logger.info("单Excel文件多sheet导出Excel数据的存储文件目录不存在,为您创建文件夹!");
savefile.mkdirs();
}
goalName=fileGoalUrl+goalName+".xls";
FileOutputStream fos = new FileOutputStream(goalName);
workbook.write(fos);
fos.close();
} catch (Exception e) {
e.printStackTrace();
logger.error("单Excel文件多sheet导出Excel数据异常:"+e);
return null;
}
return goalName;
}
/**
* 一个excel 创建多个sheet
* list 多个Map key title 对应表格
* Title key entity 对应表格对应实体
* key data Collection 数据
* @param list 数据集合
* @param goalName 文件名称
* @return
*/
public String exportExcel(List<Map<String, Object>> list, String goalName,HttpServletResponse response){
try {
Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
// 判断文件存放地址是否存在,没有则创建
File savefile = new File(fileGoalUrl);
if (!savefile.exists()) {
logger.info("按模板导出Excel数据时存储文件目录不存在,为您创建文件夹!");
savefile.mkdirs();
}
//写文件流
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(goalName+".xls", "UTF-8"));
workbook.write(response.getOutputStream());
//写文件
goalName=fileGoalUrl+goalName+".xls";
FileOutputStream fos = new FileOutputStream(goalName);
workbook.write(fos);
fos.close();
}catch (IOException e) {
e.printStackTrace();
logger.error("按模板导出Excel数据异常:"+e);
return null;
}
return goalName;
}
下面看下调用过程,超简单
public static void main(String[] args) throws Exception {
ExportExcelOrWord ex=new ExportExcelOrWord();
/*//离场证明
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "leon");
map.put("idNo", "436215688256556655");
map.put("adY", "2018");
map.put("adM", "11");
map.put("adD", "30");
map.put("leY", "2019");
map.put("leM", "11");
map.put("leD", "31");
map.put("serDept", "华南事业部");
map.put("serDate", "2018年 11月 28日— 2018年 11月 29日");
String url=ex.exportWord(map, "离场证明", "离场证明模板数据");
System.out.println("文件地址:"+url);*/
/*//工资清单(北京人车)/工资清单(其他)
Map<String, Object> map = new HashMap<String, Object>();
List<Map<String, Object>> listMap=new ArrayList<Map<String, Object>>();
for (int i = 0; i < 2; i++) {
Map<String, Object> mapIn = new HashMap<String, Object>();
mapIn.put("city", "深圳"+i);
mapIn.put("id", ""+i+1);
mapIn.put("userNo", "A007");
mapIn.put("surname", "Leon");
mapIn.put("email", "[email protected]");
listMap.add(mapIn);
}
map.put("maplist", listMap);//注意此处的maplist需要与文件模板中fe后面的maplist名称一致
String url=ex.exportExcel(map, "工资清单(其他)", "工资清单(其它)模板数据");
System.out.println("文件地址:"+url);*/
*/
//人员信息汇总
Map<Object, Object> sheetMap=new HashMap<Object, Object>();
List<RelatInfo> relatInfolist =new ArrayList<RelatInfo>();
for (int i = 0; i < 2; i++) {
RelatInfo relat=new RelatInfo();
relat.setUserNo("B002"+i);
relat.setSurname("Leon");
relat.setTelephone("1387561245"+i);
relatInfolist.add(relat);
}
List<WorkHistory> workHistorylist =new ArrayList<WorkHistory>();
for (int i = 0; i < 3; i++) {
WorkHistory work =new WorkHistory();
work.setUserNo("A001"+i);
work.setSurname("测试数据"+i);
work.setBeginDate("2018/11/28");
work.setEndDate("2018/11/28");
work.setPosition("老板");
work.setCorporateName("吹水无敌");
workHistorylist.add(work);
}
sheetMap.put("RelatInfo", relatInfolist);
sheetMap.put("WorkHistory", workHistorylist);
String url=ex.exportExcelManeySheet(sheetMap,new String[]{"工作经历","家庭信息"},new String[]{"RelatInfo","WorkHistory"},"D:/入场人员信息汇总-测试.xls");
System.out.println("文件地址:"+url);
}
说明一下,后面一个方法是多sheet导出的方式,多sheet导出easypoi的方法存在大坑,单条数据可以导出多条不行需要重新实现,过于复杂这里使用一个简单的用实体类直接导出多sheet,更多详细的方法请参考源码,其实比较调用都比较简单拼接参数容易遇坑,各位请注意
哦,对了,带图片的需要注意一下,需要设置参数(这里简单设置几个属性,其它请自行根据需求设置)
还有个就是多sheet导出时的样式自定义的问题(个人这里只设置了头部样式),上面其实有用到就下面图中标注的
下面给出这个样式类,大家可以自行扩展