【webFlux Excel导出插入图片】POI导出Excel的时候插入图片
- 工作小总结
- 时间:2023-03-05 14:08
- 15900人已阅读
简介
在工作中,有时候,我们会遇到这样的需求:导出数据的时候,同时把图片导出。本文使用于WebFlux响应式开发导出Excel功能。SpringMVC模式可以在此基础上做少许修改即可实现在SpringMVC模式导出带有图片的需求如下:导出效果:代码如下:入口:public Mono<Void> exportHistoryReport(HistoryDataParam&nb
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
在工作中,有时候,我们会遇到这样的需求:导出数据的时候,同时把图片导出。
本文使用于WebFlux 响应式开发导出Excel功能。SpringMVC模式可以在此基础上做少许修改即可实现在SpringMVC模式导出带有图片的
需求如下:
导出效果:
代码如下:
入口:
public Mono<Void> exportHistoryReport(HistoryDataParam historyDataParam, ServerHttpResponse response,Integer fromType) throws Exception { String dimensionType = historyDataParam.getDimensionType(); String quotaType = historyDataParam.getQuotaType(); String image = "data:image/jpeg;base64,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"; String picBase64 = historyDataParam.getPicBase64(); if(StringUtils.isEmpty(picBase64)){ picBase64 = image; } /* * 数据样式:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABI4AAAEsCAYAAAClh/jbAAAgAElEQVR4XuzdB3hUVfo * /8O+dSe8hCSlAaKJ0BBEQFBBQseFiwUVkURHEgtjWdV0bLPpTV10BRYodsWH5i64guIiAqKyASu8lgfTeJzNz/8 ........ * 图片编码只要‘base64,’后面的部分 * 图片数据通过表单传递到了后台,可以在后台获取到信息。但是有一点必须注意:数据中的 "+"加号会因为传递变为 " "空格,所以需要替换一下 */ String dataChartCostStr = (URLDecoder.decode(picBase64.substring(22), "UTF-8")).replaceAll(" ", "+"); Mono<List<HistoryQuotaBaseResult>> dataMono= Mono.empty(); String tableName = "数据报表(" + dimensionType + "_" + quotaType + ")"; String[] heards = heardMapping.get("11"); String[] fields = heardMapping.get("13field"); if(1 == fromType){ dataMono = mockDataMono(historyDataParam); if ("2".equals(dimensionType)) { heards = heardMapping.get("12"); } }else{ dataMono = mockDevicePropertyDataMono(historyDataParam); tableName = "数据报表(" + dimensionType + "_" + quotaType + ")"; if ("2".equals(dimensionType)) { heards = heardMapping.get("22"); }else { heards = heardMapping.get("21"); } } List<HistoryQuotaBaseResult> dataList = Lists.newArrayList(); dataMono.map(ms -> { dataList.addAll(ms); return dataList; }).defaultIfEmpty(new ArrayList<>()).subscribe(); return HistoryExcelUtil.getHSSFWorkbook(tableName, tableName + ".xls", heards, fields, dataList, response, dataChartCostStr); }
代码片2:
/** *表头1 */ private static final String[] WEATHER_QUOTA_DAY_TITLE = new String[]{"时间", "气象指标.风速", "气象指标.气温", "气象指标.湿度" , "气象指标.对标数据(去年同期).风速", "气象指标.对标数据(去年同期).气温", "气象指标.对标数据(去年同期).湿度"}; /** * 表头1对应的属性字段 */ private static final String[] WEATHER_QUOTA_INFO_FIELD = new String[]{"dataTime", "windSpeed", "temperature", "humidity" , "windSpeedBenchmark", "temperatureBenchmark", "humidityBenchmark"}; private static Map<String, String[]> heardMapping; static { heardMapping = new HashMap<>(); heardMapping.put("11", WEATHER_QUOTA_HOURS_TITLE); heardMapping.put("13field", WEATHER_QUOTA_INFO_FIELD); }
导出的工具类:
t com.google.common.base.Strings; import org.apache.commons.collections.CollectionUtils; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DefaultDataBuffer; import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ZeroCopyHttpOutputMessage; import org.springframework.http.server.reactive.ServerHttpResponse; import reactor.core.publisher.Flux; import reactor.core.publisher.FluxSink; import reactor.core.publisher.Mono; import sun.misc.BASE64Decoder; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Method; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Objects; /** * @author 凯哥Java * @date 2023/3/1 * @description 历史数据的Excel工具类 */ public class HistoryExcelUtil { /** * 导出Excel * * @param sheetName sheet名称 * @param excelName 文件名 * @param heard 表头 * @param fields 对象属性 * @param dataList 要导出的数据 * @param response 输出流对象 * @param dataChartCostStr base64图片 */ public static <T> Mono<Void> getHSSFWorkbook(String sheetName, String excelName, String[] heard, String[] fields , List<T> dataList, ServerHttpResponse response, String dataChartCostStr) throws Exception { HSSFWorkbook workBook = new HSSFWorkbook(); HSSFSheet sheet = workBook.createSheet(Strings.isNullOrEmpty(sheetName) ? "场地历史数据" : sheetName); sheet.setDefaultColumnWidth(15); //设置宽度高度 sheet = setHeightAndWidth(sheet, heard); //创建单元格样式 HSSFCellStyle headStyle1 = makeCellStyle(workBook); //创建绘图(画布),注明:一个sheet只能创建一个画布,但一个画布中可以添加多张图片 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); //构成-图表图片 createPictureInExcel(dataChartCostStr, patriarch, workBook, (short) 1, dataList.size() + 5, (short) (heard.length+8), dataList.size() + 25); int index = 0; if (Objects.nonNull(heard)) { HSSFRow row = sheet.createRow(index); for (int i = 0; i < heard.length; i++) { HSSFCell cell = row.createCell(i); cell.setCellValue(heard[i]); cell.setCellStyle(headStyle1); } } if (CollectionUtils.isNotEmpty(dataList)) { for (int i = 0; i < dataList.size(); i++) { HSSFRow row = sheet.createRow(i + 1); for (int j = 0; j < fields.length; j++) { HSSFCell cell = row.createCell(j); String fieldName = fields[j]; String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); T t = (T) dataList.get(i); Class tCls = t.getClass(); System.out.println(getMethodName); Method getMethod = tCls.getMethod(getMethodName, new Class[]{}); Object value = getMethod.invoke(t, new Object[]{}); // 判断值的类型后进行强制类型转换 String textValue = null; if (value == null) { cell.setCellValue(""); } if (value instanceof Integer) { int intValue = (Integer) value; cell.setCellValue(intValue); } else if (value instanceof Float) { float fValue = (Float) value; cell.setCellValue(fValue); } else if (value instanceof Double) { double dValue = (Double) value; cell.setCellValue(dValue); } else if (value instanceof Long) { long longValue = (Long) value; cell.setCellValue(longValue); } else if (value instanceof Date) { Date date = (Date) value; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); textValue = sdf.format(date); cell.setCellValue(textValue); } else { // 其它数据类型都当作字符串简单处理 textValue = value == null ? "" : value.toString(); cell.setCellValue(textValue); } } } } return downloadExcelFile(response, workBook, excelName); } /** * 将图片保存到excel中 * * @param dataChart 图片的BASE64格式编码 * @param patriarch Excel-sheet 画布 * @param wb Excel工作簿 * @param col1 指定起始的单元格行索引 * @param row1 指定起始的单元格列索引 * @param col2 指定结束的单元格行索引 * @param row2 指定结束的单元格列索引 * @throws Exception */ @SuppressWarnings("restriction") public static void createPictureInExcel(String dataChart, HSSFPatriarch patriarch, HSSFWorkbook wb, short col1, int row1, short col2, int row2) throws Exception { //用于将BASE64编码格式转为byte数组 BASE64Decoder base64Decoder = new BASE64Decoder(); ByteArrayOutputStream dataChartoutStream = new ByteArrayOutputStream(); //将dataChartStringin作为输入流,读取图片存入image中 ByteArrayInputStream dataChartin = new ByteArrayInputStream(base64Decoder.decodeBuffer(dataChart)); BufferedImage dataChartbufferImg = ImageIO.read(dataChartin); //利用HSSFPatriarch将图片写入EXCEL ImageIO.write(dataChartbufferImg, "png", dataChartoutStream); /* * 指定绘图区域位置及大小 * HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2) * 参数说明: * dx1 dy1 起始单元格中的x,y坐标. * dx2 dy2 结束单元格中的x,y坐标. * col1,row1 指定起始的单元格,下标从0开始. * col2,row2 指定结束的单元格 ,下标从0开始. * 详情参考博客 https://www.cnblogs.com/1175429393wljblog/p/9809868.html */ HSSFClientAnchor anchorCostStr = new HSSFClientAnchor(0, 0, 0, 0, col1, row1, col2, row2); //画图 patriarch.createPicture(anchorCostStr, wb.addPicture(dataChartoutStream.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG)); } private static HSSFSheet setHeightAndWidth(HSSFSheet sheet, String[] heads) { //默认高度 sheet.setDefaultRowHeight((short) (20 * 30)); //控制第0列的宽度 sheet.setColumnWidth(0, 40 * 200); for (int i = 1; i < heads.length; i++) { sheet.setColumnWidth(i, 30 * 200); } return sheet; } /** * 设置表格风格 * * @param wb 工作簿对象 * @return */ private static HSSFCellStyle makeCellStyle(HSSFWorkbook wb) { //设置表格样式 HSSFCellStyle cellStyle = wb.createCellStyle(); //自动换行 cellStyle.setWrapText(true); //水平居中 cellStyle.setAlignment(CellStyle.ALIGN_CENTER); //垂直居中 cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); //设置字体 HSSFFont font = wb.createFont(); font.setFontName("宋体"); //设置字体粗细 font.setBoldweight(Font.DEFAULT_CHARSET); //设置字体大小 font.setFontHeightInPoints((short) 13); font.setColor(Font.COLOR_RED); cellStyle.setFont(font); //设置边框 cellStyle.setBorderBottom(CellStyle.BORDER_MEDIUM); cellStyle.setBorderRight(CellStyle.BORDER_MEDIUM); cellStyle.setBorderLeft(CellStyle.BORDER_MEDIUM); cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM); cellStyle.setFillForegroundColor(HSSFColor.BLUE.index2); cellStyle.setFillBackgroundColor(HSSFColor.BLUE.index2); cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index2); return cellStyle; } public static Mono<Void> downloadExcelFile(ServerHttpResponse response, HSSFWorkbook hssfWorkbook, String exclName) throws IOException { ZeroCopyHttpOutputMessage response1 = (ZeroCopyHttpOutputMessage) response; HttpHeaders headers = response1.getHeaders(); // 设置被下载的文件名称 headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + URLEncoder.encode(exclName, "UTF-8")); headers.add("Accept-Ranges", "bytes"); headers.set("file-name", URLEncoder.encode(exclName, "UTF-8")); headers.set("Access-Control-Allow-Origin", "*"); MediaType application = new MediaType("application", "octet-stream", StandardCharsets.UTF_8); headers.setContentType(application); // 定义输出流 DefaultDataBuffer dataBuffer = new DefaultDataBufferFactory().allocateBuffer(); OutputStream outputStream = dataBuffer.asOutputStream(); // 将excel文件流写入到output流 hssfWorkbook.write(outputStream); Flux<DataBuffer> dataBufferFlux = Flux.create((FluxSink<DataBuffer> emitter) -> { emitter.next(dataBuffer); emitter.complete(); }); return response1.writeAndFlushWith(Mono.just(dataBufferFlux)); } }
上一篇: java base64转图片
下一篇: 看过一个小故事