需求:
将系统中的数据导出,数据中存在的网址需要处理后变成二维码,批量导出到excel中
使用开源包:
二维码生成:https://gitee.com/iherus/qrext4j
excel导出:https://gitee.com/lemur/easypoi
详细操作:
maven引入
<dependency>
<groupId>org.iherus</groupId>
<artifactId>qrext4j</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.3.0</version>
</dependency>
创建模板类
import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import lombok.Data;
/**
* 屠宰导出数据模板
*
* @author zhy
* @date 2019/6/20 11:54
*/
@ExcelTarget(value = "slaughterDataModel")
@Data
public class SlaughterDataModel implements java.io.Serializable {
/**
* 学生姓名
*/
@Excel(name = "耳标", height = 40, width = 30)
private String earTag;
@Excel(name = "耳缺", height = 40, width = 30)
private Integer earNotch;
@Excel(name = "二维码", type = 2, width = 20, height = 40, imageType = 2)
private byte[] qrCode;
}
创建工具类
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import com.datbc.pig360.db.config.BlackpigException;
import com.datbc.pig360.db.domain.BlackpigPig;
import com.datbc.pig360.wx.config.SlaughterDataModel;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.iherus.codegen.qrcode.QrcodeGenerator;
import org.iherus.codegen.qrcode.SimpleQrcodeGenerator;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
/**
* excel工具类
*
* @author zhy
* @date 2019/6/19 17:16
*/
@Slf4j
public class ExcelUtil {
/**
* 导出excel
*
* @param response HttpServletResponse
* @param fileName 文件名字
* @param workbook 通过exportPicture()方法获取
* @author zhy
*/
public static void writeExcel(HttpServletResponse response, String fileName, Workbook workbook) {
// 判断数据
if (workbook == null) {
throw new BlackpigException(-1, "错误");
}
// 重置响应对象
response.reset();
try {
OutputStream outputStream = getOutputStream(fileName, response);
BufferedOutputStream bufferedOutPut = new BufferedOutputStream(outputStream);
workbook.write(bufferedOutPut);
bufferedOutPut.flush();
bufferedOutPut.close();
outputStream.close();
} catch (IOException e) {
log.error(e.getMessage());
}
}
/**
* 导出文件时为Writer生成OutputStream
*
* @param fileName 文件名字
* @param response response
* @return 输出流
* @author zhy
*/
private static OutputStream getOutputStream(String fileName, HttpServletResponse response) {
try {
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xls");
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "no-store");
response.addHeader("Cache-Control", "max-age=0");
return response.getOutputStream();
} catch (IOException e) {
throw new BlackpigException("导出excel表格失败!");
}
}
/**
* 获取Workbook对象
*
* @param pigList 查询黑猪对象列表
* @param aesPassword aes加密密码
* @param qrCodeUrl 溯源网址前缀
* @return 文件下载
* @author zhy
*/
public static Workbook exportPicture(List<BlackpigPig> pigList, String aesPassword, String qrCodeUrl) {
List<SlaughterDataModel> list = new ArrayList<>();
pigList.forEach(item -> {
SlaughterDataModel e = new SlaughterDataModel();
e.setEarNotch(item.getEarNotch());
e.setEarTag(item.getEarTag());
String s = AESParameter.parameterEncryption(item.getId().toString(), aesPassword);
QrcodeGenerator generate = new SimpleQrcodeGenerator().generate(qrCodeUrl + "/" + s);
BufferedImage image = generate.getImage();
byte[] pngs = imageToBytes(image);
e.setQrCode(pngs);
list.add(e);
});
return ExcelExportUtil.exportExcel(new ExportParams(), SlaughterDataModel.class, list);
}
/**
* BufferedImage转byte[]
*
* @param bImage BufferedImage对象
* @return byte[]
* @auth zhy
*/
private static byte[] imageToBytes(BufferedImage bImage) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ImageIO.write(bImage, "png", out);
} catch (IOException e) {
log.error(e.getMessage());
}
return out.toByteArray();
}
}
使用生成
@GetMapping("zhy")
public void zhy(HttpServletResponse response) {
List<BlackpigPig> pigList = pigService.querySelective();
String fileName = "耳标二维码导出" + DateUtils.formatDate(new Date(), "yyyyMMddHHmmss");
ExcelUtil.writeExcel(response, fileName, ExcelUtil.exportPicture(pigList, weixinOAConfig.getPassword(), weixinOAConfig.getUrl()));
}
完成,就是这么优雅,跪拜开源包大神