接着上篇文章 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 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 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 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> 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);
* @param sheetName sheet名称数组 如:new String[] {"人员信息","家庭信息",...};
* @param objectClass 对象名称数组 如:new String[] {"PersonnelInfo","EducatInfo",...};
* @param goalName 文件名称
* @return 文件存储地址
* @throws Exception
*/
public String exportExcelManeySheet(Map
下面看下调用过程,超简单
public static void main(String[] args) throws Exception {
ExportExcelOrWord ex=new ExportExcelOrWord();
/*//离场证明
Map map = new HashMap();
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 map = new HashMap();
List
说明一下,后面一个方法是多sheet导出的方式,多sheet导出easypoi的方法存在大坑,单条数据可以导出多条不行需要重新实现,过于复杂这里使用一个简单的用实体类直接导出多sheet,更多详细的方法请参考源码,其实比较调用都比较简单拼接参数容易遇坑,各位请注意
哦,对了,带图片的需要注意一下,需要设置参数(这里简单设置几个属性,其它请自行根据需求设置)
还有个就是多sheet导出时的样式自定义的问题(个人这里只设置了头部样式),上面其实有用到就下面图中标注的
下面给出这个样式类,大家可以自行扩展