Java导出excel带图片(希望能帮助你们节省时间)

第一天太慌张,下班逃跑,一夜没睡好,第二天决定搞出来。
查了好多博客,感觉都挺繁琐的,好多工具类、引入类找不到。经过一上午的琢磨,终于搞定。记录一下

借鉴了这个博主的文章

需求前端点击导出按钮,导出excel,并且带出图片

在这里插入图片描述

引入pom依赖

  <!-- 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>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.4</version>
        </dependency>

我使用了excel模板,放到了resources下
在这里插入图片描述

使用Get请求

//通过模板文件,导入模板数据,并在浏览器端下载 startTime endTime
    @GetMapping("/exportAddressLog")
    public void exportAddressLog(@RequestParam(value = "startTime") String startTime,@RequestParam(value = "endTime") String endTime,HttpServletResponse response) throws Exception {
        URL resource = getClass().getClassLoader().getResource("Address.xlsx");
        String path = resource.getPath();

        //文件输入流
        FileInputStream in = new FileInputStream(path);
        //创建excel流(从指定文件流)
        Workbook excel = WorkbookFactory.create(in);
        //定义数据
        List<AddressLogResource> excelDataList = logService.getAddressLogList(startTime, endTime);
        //获取第一页
        Sheet sheet = excel.getSheetAt(0);
        //填充数据
        for (int i = 0; i < excelDataList.size(); i++) {
            //模板文件从第三行开始填
            Row row = sheet.createRow(i+1);
            int columnIndex4 = 4; // 设置第4列的宽度
            int columnIndex3 = 4; // 设置第4列的宽度
            int width4 = 20; // 设置宽度值为20个字符
            int width3 = 40; // 设置宽度值为20个字符
            sheet.setColumnWidth(columnIndex3, width3 * 256);
            sheet.setColumnWidth(columnIndex4, width4 * 256);
            row.setHeight((short) (160*10));
            Cell cell = row.createCell(0);
            Cell cell1 = row.createCell(1);
            Cell cell2 = row.createCell(2);
            Cell cell3 = row.createCell(3);
            Cell cell4 = row.createCell(4);
            Cell cell5 = row.createCell(5);
            //第一个单元格填排名
            cell.setCellValue(i + 1);
            //第二个单元格填姓名
            cell1.setCellValue(excelDataList.get(i).getAddressCoordinate());
            //第三个单元格填分数
            cell2.setCellValue(excelDataList.get(i).getAddressName());
            cell3.setCellValue(excelDataList.get(i).getCameraSn());
            LocalDateTime logTime = excelDataList.get(i).getLogTime();
            String dateTimeStr = logTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
            System.out.println("当前字符串日期时间:" + dateTimeStr);
            cell4.setCellValue(dateTimeStr);
            //插入图片
            String img = excelDataList.get(i).getImagePath();
            imgxx(img,sheet,i,5,excel);
//            cell4.setCellValue(excelDataList.get(i).getImagePath());
        }
        //设置Content-Type为appl ication/vnd.openxmLformats -officedocument. spreadsheetmL. sheet
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        //设置Content-Dispositiontattachment;filename-excel.xLsx,表示将文件下载到本地,并指定文件名为excel.xLsx
        response.setHeader("Content-Disposition", "attachment;filename=excel.xlsx");
        // 通过输出流将Excel文件下载到客户端浏览器
        ServletOutputStream out = response.getOutputStream();
        excel.write(out);
        out.flush();
        //关闭资源
        out.close();
        excel.close();

    }

插入图片单独抽出的方法

//插入图片
    private String imgxx(String img, Sheet sheet,int i,int j,Workbook excel){
        URL photoFile = null;
        try {
            photoFile = new URL(img);

            // 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
            ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
            //将图片读入BufferedImage对象
            BufferedImage bufferImg = ImageIO.read(photoFile);
            // 将图片写入流中
            ImageIO.write(bufferImg, "jpg", byteArrayOut);
            // 利用HSSFPatriarch将图片写入EXCEL
            Drawing<?> patriarch = sheet.createDrawingPatriarch();
            // 图片一导出到单元格I3-5中 列开始:8 行开始:2 列结束:9 行结束:5
            XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, j, i + 1, j, i + 1);
            anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
            // 插入图片内容
            Picture picture =  patriarch.createPicture(anchor, excel.addPicture(byteArrayOut
                    .toByteArray(), XSSFWorkbook.PICTURE_TYPE_JPEG));
            picture.resize(1,1);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

导出的图片
在这里插入图片描述
前端不能使用ajax访问,直接使用 location.href= url
在这里插入图片描述
在这里插入图片描述
OK…收工

Java Excel导出图片可以通过使用POI和JFreeChart等库来实现。首先需要创建一个Excel工作簿,然后在特定位置上插入图片。我们可以使用POI库中的HSSFWorkbook和HSSFPatriarch类来实现,HSSFWorkbook用于创建工作簿,HSSFPatriarch用于插入图片。 使用JFreeChart库来生成图表并将其保存为图片。然后可以使用Java将图像对象读取并插入到Excel单元格中。这可以通过将图像数据转换为字节数组并将其插入到单元格中来完成。 以下是大致的实现步骤: 1. 创建Excel工作簿 HSSFWorkbook workbook = new HSSFWorkbook(); 2. 创建一个工作表 HSSFSheet sheet = workbook.createSheet("Sheet1"); 3. 创建一个HSSFPatriarch对象 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); 4. 加载将要插入的图片 File imageFile = new File("image.png"); FileInputStream fis = new FileInputStream(imageFile); byte[] imageData = IOUtils.toByteArray(fis); 5. 创建HSSFClientAnchor对象,设置图片位置和大小 HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 1, 1, (short) 4, 10); anchor.setAnchorType(2); 6. 插入图片并返回图片的ID int pictureIndex = workbook.addPicture(imageData, Workbook.PICTURE_TYPE_PNG); HSSFPicture picture = patriarch.createPicture(anchor, pictureIndex); 7. 保存Excel文件 FileOutputStream fos = new FileOutputStream(new File("output.xlsx")); workbook.write(fos); fos.close(); 这样就可以将图片保存到Excel文件中了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值