1.导出excel文件效果

2.说明

先要制作一个空的excel模板(也可以全由代码写成,使用excel模板的好处是,不用代码去实现复杂的排版,只需要填写内容就可),注意文件内容不能太大,否则在生成图片时可能会导致内存溢出(内容非常多的建议不要导出带图片的)。

     <!-- poi处理 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version></dependency>

3.代码

controller层

    // 导出用户购物车明细 带图片@RequestMapping("/exportusertruckdetail")public ResponseEntity<AbstractResource> exportUserTruckDetail(@RequestParam(value="data") String data){logger.debug("ExportController.exportUserTruckDetail in, param:{}", data);try {JSONObject json = JSON.parseObject(data);String userId = json.getString("userId");Date startDate = json.getDate("startDate");Date endDate = json.getDate("endDate");String companyId = json.getString("companyId");boolean picFlag = json.getBooleanValue("picFlag");File excel = exportService.exportUserTruckDetail(companyId, userId, startDate, endDate, picFlag);return HttpUtils.export(excel);} catch (Exception e) {logger.error("errorCode : filemanage_exportusertruckdetail_sys,  errorMessages : 导出用户购物车明细异常!", e);return HttpUtils.exportFailed(e.getMessage());}}// HttpUtils.exportpublic static ResponseEntity<AbstractResource> export(File file) {if (file == null) {return null;} else {HttpHeaders headers = new HttpHeaders();headers.add("Cache-Control", "no-cache, no-store, must-revalidate");headers.add("Content-Disposition", "attachment; filename=" + file.getName());headers.add("Pragma", "no-cache");headers.add("Expires", "0");headers.add("Last-Modified", (new Date()).toString());headers.add("ETag", String.valueOf(System.currentTimeMillis()));return ((BodyBuilder)ResponseEntity.ok().headers(headers)).contentLength(file.length()).contentType(MediaType.parseMediaType("application/octet-stream")).body(new FileSystemResource(file));}}// HttpUtils.exportFailedpublic static ResponseEntity<AbstractResource> exportFailed(String message) {InputStream ins = new ByteArrayInputStream(message.getBytes());return ResponseEntity.ok().contentType(MediaType.parseMediaType("application/json;charset=UTF-8")).body(new InputStreamResource(ins));}

service层

    @Overridepublic File exportUserTruckDetail(String companyId, String userId, Date startDate, Date endDate, boolean picFlag) throws Exception {List<Map<String, Object>> detailList = unusualMapper.truckUserDetail(companyId, startDate, endDate, userId);List<JSONObject> excelDataList = new ArrayList<>(detailList.size());String sheetName = null;for (Map<String, Object> detailMap : detailList) {if(StringUtils.isBlank(sheetName)){sheetName = detailMap.get("phone").toString();}JSONObject retJson = ExcelUtil.getStandardSummary(detailMap.get("standardDetail").toString());detailMap.putAll(retJson);JSONObject excelData = JsonUtils.bean2JSON(detailMap);excelDataList.add(excelData);}if(StringUtils.isBlank(sheetName)){sheetName = "无";}return createUserTruckExcel(excelDataList, sheetName, startDate, endDate, picFlag);}private File createUserTruckExcel(List<JSONObject> excelDataList, String sheetName, Date startDate, Date endDate, boolean picFlag){long startTime = System.currentTimeMillis();// 复制文件Date now = new Date();String basePath = new ApplicationHome(this.getClass()).getSource().getParentFile().getPath()+ File.separator + "files" + File.separator;File exportFile = new File(basePath + "ymhc_user_truck_" + DateUtils.getStrDate(now,"yyyyMMdd_HHmmssSSS") + ".xlsx");try {Files.copy(new File(basePath + "ymhc_user_truck.xlsx").toPath(),exportFile.toPath());FileInputStream fileInputStream = new FileInputStream(exportFile);XSSFWorkbook book = new XSSFWorkbook(fileInputStream);// 处理sheet名字XSSFSheet sheet = book.getSheetAt(0);book.setSheetName(0, sheetName);CellStyle style = book.createCellStyle();style.setBorderBottom(BorderStyle.THIN); //下边框style.setBorderLeft(BorderStyle.THIN);//左边框style.setBorderTop(BorderStyle.THIN);//上边框style.setBorderRight(BorderStyle.THIN);//右边框style.setVerticalAlignment(VerticalAlignment.CENTER); // 水平居中style.setAlignment(HorizontalAlignment.CENTER); // 垂直居中style.setWrapText(true);XSSFFont font = book.createFont();font.setFontHeightInPoints((short) 10);font.setFontName("宋体");style.setFont(font);CellStyle numStyle = book.createCellStyle();numStyle.setBorderBottom(BorderStyle.THIN); //下边框numStyle.setBorderLeft(BorderStyle.THIN);//左边框numStyle.setBorderTop(BorderStyle.THIN);//上边框numStyle.setBorderRight(BorderStyle.THIN);//右边框numStyle.setWrapText(true);XSSFDataFormat df = book.createDataFormat();numStyle.setDataFormat(df.getFormat("#,#0.00"));// 导出时间XSSFRow row0 = sheet.getRow(1);XSSFCell cell1 = row0.getCell(14);XSSFFont font10 = book.createFont();font10.setFontHeightInPoints((short) 11);font10.setFontName("宋体");font10.setBold(true);CellStyle style01 = book.createCellStyle();style01.setFont(font10);style01.setAlignment(HorizontalAlignment.CENTER);style01.setVerticalAlignment(VerticalAlignment.CENTER);String cell01 = DateUtils.getStrDate(startDate, "yyyy/MM/dd") + " 至 " + DateUtils.getStrDate(endDate, "yyyy/MM/dd");cell1.setCellValue(cell01);cell1.setCellStyle(style01);int ossPicTotal = 0; // excel图片XSSFDrawing drawingPatriarch = sheet.createDrawingPatriarch(); // 插入图片Map<String, String> localPicMap = new HashMap<>(); // 本地图片缓存 itemId localPathXSSFRow row;int orderRowLength = excelDataList.size();for (int j = 0; j < orderRowLength; j++) {JSONObject excelData = excelDataList.get(j);int rowIndex = j + 3;row = sheet.createRow(rowIndex);row.setHeight((short)(100*20));JSONObject parseDataJson = parseTruckUserData(excelData);// 1 序号row.createCell(0).setCellValue(j+1);// 2 店铺名row.createCell(1).setCellValue(excelData.getString("company_name"));// 3 产品款号row.createCell(2).setCellValue(excelData.getString("productCode"));// 4 商品图片int picIndex = 3;boolean insertPicFlag = false;String briefPath = excelData.getString("brief_path");String productId = excelData.getString("product_id");try{row.createCell(picIndex).setCellValue("");if(picFlag && ossPicTotal < 1000){ // 导出图片最大String productLocalPic = basePath + "pic" + File.separator + productId + briefPath.substring(briefPath.lastIndexOf("."));if(localPicMap.containsKey(productId)){productLocalPic = localPicMap.get(productId);logger.debug("本地已下载图片:{}", productLocalPic);}else{// 下载到本地,并缓存String httpUrlPath = constantDataUtil.signaturePicture(briefPath,250, 90);if(!ExcelUtil.downloadPic(httpUrlPath, productLocalPic, false)){productLocalPic = ""; // 下载图片失败,缓存空,后续不再下载}localPicMap.put(productId, productLocalPic);}if(StringUtils.isNotBlank(productLocalPic)){// 插入图片ExcelUtil.insertExcelPic(book, drawingPatriarch, rowIndex, picIndex, productLocalPic);ossPicTotal++;insertPicFlag = true;}}}catch (Exception e){logger.error("{}图片插入失败!", briefPath);}if(!insertPicFlag){ // 导出有效期为24小时的图片链接row.createCell(picIndex).setCellValue(constantDataUtil.signaturePicture(briefPath,800,90,24*60));}// 5 商品名称row.createCell(4).setCellValue(excelData.getString("product_name"));// 6 选购规格row.createCell(5).setCellValue(excelData.getString("selectStandardStr"));// 7 选购件数row.createCell(6).setCellValue(excelData.getString("goods_amount"));// 8 选购价格row.createCell(7).setCellValue(excelData.getString("showPrice"));// 9 所有颜色row.createCell(8).setCellValue(parseDataJson.getString("colorStr"));// 10 所有尺码row.createCell(9).setCellValue(parseDataJson.getString("sizeStr"));// 11 价格范围row.createCell(10).setCellValue(parseDataJson.getString("allPrice"));// 12 供应商名称row.createCell(11).setCellValue(excelData.getString("supplierName"));// 13 供应商地址row.createCell(12).setCellValue(excelData.getString("address"));// 14 商品状态row.createCell(13).setCellValue(ExcelUtil.getItemState(excelData.getString("item_state")));// 15 加购时间row.createCell(14).setCellValue(excelData.getString("create_date"));// 16 备注row.createCell(15).setCellValue("");for(int k = 0; k < 16; k++) {row.getCell(k).setCellStyle(style);}}OutputStream os = new FileOutputStream(exportFile);os.flush();book.write(os);book.close();os.close();fileInputStream.close();} catch (IOException e) {throw new RuntimeException(e);}logger.debug("导出文件完成,花费时间:{}", System.currentTimeMillis()-startTime);return exportFile;}

ExcelUtil.insertExcelPic

    /*** <一句话功能简述> excel插入图片* <功能详细描述>* author: zhanggw* 创建时间:  2022/5/25* @param book poi book对象* @param drawingPatriarch 用于图片插入Represents a SpreadsheetML drawing* @param rowIndex 图片插入的单元格第几行* @param colIndex 图片插入的单元格第几列* @param localPicPath 本地图片路径*/public static void insertExcelPic(XSSFWorkbook book, XSSFDrawing drawingPatriarch, int rowIndex, int colIndex, String localPicPath) throws IOException {// 获取图片后缀格式String fileSuffix = localPicPath.substring(localPicPath.lastIndexOf(".") + 1);fileSuffix = fileSuffix.toLowerCase();// 将图片写入到字节数组输出流中BufferedImage bufferImg;ByteArrayOutputStream picByteOut = new ByteArrayOutputStream();bufferImg = ImageIO.read(new File(localPicPath));ImageIO.write(bufferImg, fileSuffix, picByteOut);// 将图片字节数组输出流写入到excel中XSSFClientAnchor anchor = new XSSFClientAnchor(12, 3, 0, 0,(short) colIndex, rowIndex, (short) colIndex + 1, rowIndex + 1);anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);drawingPatriarch.createPicture(anchor, book.addPicture(picByteOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));picByteOut.close();}

java导出带图片excel相关推荐

  1. Java中带图片的数据导出到excel

    Java中导入,导出带图片的数据及模板下载 数据导出 数据导出 导出包含了带图片的与不带图片的导出方式,大致如下: 无图片的导出 : 这种导出可以选择你喜欢用的,POI或者EasyExcel等,这里选 ...

  2. Excel导出带图片详解

    Excel导出带图片详解 导出模板 一.引入的jar <dependency><groupId>org.apache.poi</groupId><artifa ...

  3. 导出带图片的Excel报表

    导出带图片的Excel报表 先引用 Microsoft.Office.Tools.Excel.v4.0.Utilities.dll程序集,然后在后台页面引用using Excel = Microsof ...

  4. Java导出数据到Excel文件

    Java导出数据到Excel文件 前言 如何导出 导出的基本流程 测试结果 测试数据及结果 测试代码 ExcelExportUtil.class 遇到的问题 lombok的问题 解决 Cell.set ...

  5. easypoi 导出文本图片Excel

    一.参考官网文档:easypoi文档 二.导入easypoi的maven依赖 <dependency><groupId>cn.afterturn</groupId> ...

  6. springboot整合easypoi导入带图片excel并将图片上传到FastDFS服务器

    springboot整合easypoi导入带图片excel并将图片上传到FastDFS服务器 1.使用easypoi导入excel 链接: easypoi详细文档. 2.导入easypoi依赖,版本可 ...

  7. Java导出多个excel压缩成zip下载

    Java导出多个excel压缩成zip下载 maven <!--hutoos工具类根据需要可以导入不同的模块,我这里是导入全部的模块--><dependency><gro ...

  8. Obsidian Pandoc导出带图片的word docx

    Obsidian Pandoc导出带图片的docx 总结 因为有时候需要把文档发给别人,用word更方便一点,体验了一下用Obsidian Pandoc插件转docx,体验还可以,基本的内容:图片.标 ...

  9. jxl实现写入excel模板及导出(带图片)

    在上一片博客中我用的是freemarker(操作简单),试了很多种方法就是没有把带图片的excel导出来,没办法就换jxl来实现.好了下面就开始进入正题: 第一步:pom.xml中添加jxl的依赖如下 ...

  10. java导入带图片的excel表格(工具HSSFWorkbook-HSSFSheet)(支持一条数据(单元格)可以导入多个图片,)

    一个表格框可以添加多个图片 Excel表格导入数据的同时导入图片 @Transactional(rollbackFor = Exception.class)public String selectEx ...

最新文章

  1. 卷积神经网络中的参数共享/权重复制
  2. Pytorch中改变形状和交换维度详解:view()、reshape()、transpose()、permute()以及contiguous()
  3. webpack从入门到精通(四)优化打包配置总结②
  4. JavaWeb 入门篇(2)Hello Servlet!!!
  5. Android-使用AIDL进程间通信
  6. 以二进制的形式保存在数据库中
  7. 中国电信天翼云进入4.0阶段 打造一朵无处不在的分布式云
  8. 基于JAVA+SpringBoot+Mybatis+Vue+MYSQL的小区物业管理系统
  9. ShardingSphere-Proxy 分库分表 简单示例
  10. 大脑遗忘与数据结构中的对列相似
  11. Windows 2008下Exchange Server部署攻略
  12. android打印机驱动4521,三星SCX-4521打印机驱动
  13. Wireshark之远程抓包
  14. 7-3 将整数转换为汉字大写数字
  15. VR这张旧船票,能否登上元宇宙这艘宇宙飞船?
  16. wordcloud安装,又给我来安装失败,嚓
  17. jOOQ是如何设计事务API(详细指南)
  18. 一个十年程序员写给大家的忠告
  19. 【Qt】关于QLabel显示图片二三事
  20. python 安装和使用

热门文章

  1. ensp中输入interface GigabitEthernet0/0/0提示Wrong parameter found at ‘^‘ position
  2. spss入门——简单的数据预处理到时间序列分析系列(六)
  3. DFA(deterministic finite automaton )有限状态机概念
  4. html中加入计时器,javascript怎么做计时器?
  5. 嵌入式软件开发是做什么的?要学哪些课程?
  6. 什么是嵌入式开发?嵌入式是什么?初学者必看。
  7. foxmail连接163邮箱服务器,Foxmail怎么接收163邮箱? foxmail添加163邮箱的方法
  8. 量子启蒙:99%的人是从漫威电影起步的
  9. 判断字符串是否对称 C语言,c语言 判断字符串是否中心对称
  10. 2020校园招聘公司列表!计算机/互联网 技术类岗位!,一直更新!