JXLS快速简单便捷导出
jxls官网:http://jxls.sourceforge.net
实现步骤:
- 引入相关依赖
- 创建模板
- 创建数据模型导出
一、依赖
//JXLS导出用依赖
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-jexcel</artifactId>
<version>1.0.9</version>
</dependency>
//生成条形码依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
二、模板
三、导出代码
代码中仅有大致实现方法,主要是组装个Map,和生成一个条形码图片流导出
@ApiOperation(value = "导出入库订单相关信息")
@GetMapping(value = "/exportInOrder/{key}")
public void exportInOrder(@PathVariable String key, HttpServletResponse response, HttpServletRequest request) {
//====================我本地使用的查询方法========================
OrderDto order = orderSearchService.queryExportOrderByKey(key);
//根据 订单编号生成条形码
String orderNo = order.getOrderNo();
//=============================================================
//组装数据
Map<String,Object> map = new HashMap();
map.put("record",order.getDetailDtoList());
map.put("orgName","测试单位");
map.put("num",20);
map.put("sum",20);
map.put("sumPrice",20);
map.put("orderNo","SO340603000022060125");
map.put("goodsType","非免疫规划疫苗");
map.put("dateTime",DateFormatUtils.format(new Date(), "yyyy-MM-dd"));
map.put("userName","大亮啊");
map.put("customerName","测试单位收货");
try {
//获取模板
ClassPathResource classPathResource = new ClassPathResource("excel/exportInTemplate.xls");
InputStream inputStream = classPathResource.getInputStream();
//生成条形码图片
byte[] bytes = code128(orderNo,300, 120, 40, 24);
map.put("img",bytes);
//创建文件名
String fileName = orgName + "入库单-" +new Date().getTime();
String filenameEncoder = URLEncoder.encode(fileName, "utf-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + filenameEncoder + ".xlsx");
ServletOutputStream outputStream = response.getOutputStream();
Context context = new Context();
context.putVar("data",map);
//导出操作
JxlsHelper.getInstance().processTemplate(inputStream,outputStream,context);
outputStream.close();
inputStream.close();
LOGGER.info("导出成功");
} catch (IOException e) {
e.printStackTrace();
LOGGER.error("导出失败",e);
}
}
/**
* 生成条形码
*/
public byte[] code128(String barCodeInfo, int barCodeWidth, int barCodeHeight, int heightSpace, int fontSize) throws IOException {
int imageWidth = barCodeWidth;
int imageHeight = barCodeHeight + heightSpace;
BufferedImage img = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) img.getGraphics();
g.fillRect(0, 0, imageWidth, imageHeight);
Font font = new Font("", Font.PLAIN, fontSize);
Barcode128 barcode128 = new Barcode128();
FontRenderContext fontRenderContext = g.getFontRenderContext();
int startX = 0;
int imageStartY = 0;
int stringStartY = imageHeight - 8;
int codeWidth = (int) font.getStringBounds(barCodeInfo, fontRenderContext).getWidth();
barcode128.setCode(barCodeInfo);
Image codeImg = barcode128.createAwtImage(java.awt.Color.black, java.awt.Color.white);
g.drawImage(codeImg, startX, imageStartY, barCodeWidth, barCodeHeight, java.awt.Color.white, null);
AttributedString ats = new AttributedString(barCodeInfo);
ats.addAttribute(TextAttribute.FONT, font, 0, barCodeInfo.length());
AttributedCharacterIterator iter = ats.getIterator();
g.setColor(Color.BLACK);
g.drawString(iter, startX + (barCodeWidth - codeWidth) / 2, stringStartY);
g.dispose();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(img, "png", os);
return os.toByteArray();
}