easyEecel 导出
package com.xry.mis.biz.service;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
public interface ExcelService {
/**
* 最基本的的导出excel, 默认导出到第一个sheet
* @param response HttpServletResponse
* @param fileName 文件名
* @param data 要导出的数据
* @param clazz 对象类型
*/
<T> void simpleExport(HttpServletResponse response, String fileName, List<T> data, Class clazz);
/**
* 导出单据详情
* @param response
* @param head 单据头数据
* @param body 单据列表数据
* @param tplName excel模板名称
* @param clazz 对象类型
*/
<H, B> void exportBillDetail(HttpServletResponse response, H head, List<B> body, String tplName, Class clazz);
/**
* 导出单据详情
* @param response
* @param head 单据头数据
* @param body 单据列表数据
* @param body2 单据列表2数据
* @param tplName excel模板名称
* @param clazz 对象类型
*/
<H, B, B2> void exportBillDetail(HttpServletResponse response, H head, List<B> body, List<B2> body2, String tplName, Class clazz);
/**
* 导出单据详情
* @param response
* @param head 单据头数据
* @param body 单据列表数据
* @param body2 单据列表2数据
* @param body3 单据列表3数据
* @param tplName excel模板名称
* @param clazz 对象类型
*/
<H, B, B2, B3> void exportBillDetail(HttpServletResponse response, H head, List<B> body, List<B2> body2, List<B3> body3, String tplName, Class clazz);
}
package com.xry.mis.biz.service.impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.alibaba.excel.write.metadata.fill.FillWrapper;
import com.base.framework.ApplicationGlobals;
import com.base.framework.util.config.AppConfigHolder;
import com.xry.mis.biz.service.ExcelService;
import com.xry.mis.dao.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
解析
@Service(“excelService”)
public class ExcelServiceImpl implements ExcelService {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public <T> void simpleExport(HttpServletResponse response, String fileName, List<T> data, Class clazz) {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
//response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
try {
// 解决中文文件名乱码
fileName = URLEncoder.encode(fileName,"UTF-8");
} catch (UnsupportedEncodingException e) {
}
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
try {
EasyExcel.write(response.getOutputStream(), clazz).sheet(fileName).excludeColumnFiledNames(this.getExcludeColumnFiledNames()).doWrite(data);
} catch (IOException e) {
logger.error(e.getMessage());
}
}
private List<String> getExcludeColumnFiledNames() {
List<String> excludeColumnFiledNames = new ArrayList<>();
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) {
User user = (User) auth.getPrincipal();
// 不xxxxx
if (!user.isPurchasePrice()) {
excludeColumnFiledNames.addAll(Arrays.asList("purchasePrice", "nontaxPurchasePrice", "lastPurchasePrice"));
}
}
return excludeColumnFiledNames;
}
@Override
public <H, B> void exportBillDetail(HttpServletResponse response, H head, List<B> body, String tplName, Class clazz) {
this.exportBillDetail(response, head, body, null, tplName, clazz);
}
@Override
public <H, B, B2> void exportBillDetail(HttpServletResponse response, H head, List<B> body, List<B2> body2, String tplName, Class clazz) {
this.exportBillDetail(response, head, body, body2, null, tplName, clazz);
}
@Override
public <H, B, B2, B3> void exportBillDetail(HttpServletResponse response, H head, List<B> body, List<B2> body2, List<B3> body3, String tplName, Class clazz) {
tplName = tplName.concat(".xlsx");
// 从配置文件目录取更灵活
File templateFile = ApplicationGlobals.getRelativeFile(
AppConfigHolder.getString("export.excel.path", "excelTpl/").concat(tplName));
// String templateFileName = getClass().getResource("/").getPath().concat("excelTpl/").concat(tplName);
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=" + tplName);
try {
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), clazz).withTemplate(templateFile).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
// TODO: 过滤列头数据 writeSheet.setExcludeColumnFiledNames();
// 写表头数据
excelWriter.fill(head, writeSheet);
// 写列表数据,由于列表数据后面还有日期、操作员,所以必须 forceNewRow = true
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
// 如果模板存在多个list,要加前缀{前缀.xx},默认按a,b,c,d,e...往后排
if (body2 != null) {
// 如果有多个list 模板上必须有{前缀.xx} 这里的前缀就是 a,然后多个list必须用 FillWrapper包裹
excelWriter.fill(new FillWrapper("a", body), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("b", body2), fillConfig, writeSheet);
} else {
excelWriter.fill(body, fillConfig, writeSheet);
}
if (body3 != null) {
// 如果有多个list 模板上必须有{前缀.xx} 这里的前缀就是 b,然后多个list必须用 FillWrapper包裹
excelWriter.fill(new FillWrapper("c", body3), fillConfig, writeSheet);
}
excelWriter.finish();
} catch (IOException e) {
logger.error(e.getMessage());
}
}
}
/**
* 导出xxxxxxxx
* @param request
* @param response
*/
@ControllerLog(description=“导出xxxxxxxx”)
@RequestMapping(value = “/export”, method = RequestMethod.POST)
@ResponseBody
public void exportPcReturnManage(HttpServletRequest request, HttpServletResponse response) {
// 查询对应数据
QueryCondition qc = Spring3MvcUtil.createAntdVueQueryCondition(request);
qc.setParameter(“pcNumber”, request.getParameter(“pcNumber”));
List result = pcReturnManageService.getPcReturnManagePage(qc);
// 根据日期创建文件名
SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyyMMdd”);
String currentDate = dateFormat.format(new Date());
String fileName = “ReturnManage” + “-” + currentDate;
// 调用导出共通
excelService.simpleExport(response, fileName, result, PcReturnManage.class);
}
/**
* 导出xxxxxxx详情
* @param id
* @param response
*/
@ControllerLog(description="导出xxxxxxxxx详情")
@RequestMapping(value = "/exportDetail", method = RequestMethod.POST)
@ResponseBody
public void exportPcReturnManageDetail(@RequestParam Long id, HttpServletResponse response) {
PcReturnManage pcReturnManage = pcReturnManageService.getPcReturnManageById(id);
pcReturnManage.getPcReturnDetails().stream().forEach(it -> {
if (StringUtils.isBlank(it.getNontaxSaleMoney().toString())) {
pcReturnManage.setTotalNontaxSaleMoney(BigDecimal.ZERO);
} else {
pcReturnManage.setTotalNontaxSaleMoney(pcReturnManage.getTotalNontaxSaleMoney().add(it.getNontaxSaleMoney()));
}
});
excelService.exportBillDetail(response, pcReturnManage,
pcReturnManage.getPcReturnDetails(), "return-bill", PcReturnManage.class);
}
页面
// 将数据流转为excel下载到本地
export function parseToExcel (fileName, data) {
const blob = new Blob([data], { type: ‘application/vnd.ms-excel;charset=utf-8’ })
const eLink = document.createElement(‘a’)
eLink.download = fileName
eLink.style.display = ‘none’
eLink.href = URL.createObjectURL(blob)
document.body.appendChild(eLink)
eLink.click()
URL.revokeObjectURL(eLink.href)
document.body.removeChild(eLink)
}
// 导出
handleExport () {
console.log('导出')
const that = this
this.$confirm({
title: '提示',
content: `确定导出数据?`,
okText: '导出',
okType: 'warning',
cancelText: '取消',
onOk () {
// 调用导出方法
that.$message.loading('文件下载中...', 1)
exportGoodsPutinDetail({ id: that.goodsEntryId }).then(res => {
const fileName = 'xxxxxxx.xlsx'
parseToExcel(fileName, res)
that.$message.info('导出成功', 1)
})
},
onCancel () {
}
})
}
}
}