首页 > 编程语言 >使用Java导出excel内包含图片

使用Java导出excel内包含图片

时间:2024-11-29 16:33:31浏览次数:5  
标签:Java get 导出 excel list createCell setCellValue row

功能使用点

最近公司需要开发一个数据表格导出excel的功能,普通的excel表格很好解决,网上有很多方法,下次写篇文章记录我的方法,但开发到有一个需求是excel是需要带图片的还是有些难度的,网上找了很多方案都无法适配,这里我记录下使用的方法。

这里最后是在这篇文章上进行了优化,优化点是不需要提前准备个模板了,直接在代码里生成需要的模板。

Java导出excel带图片(希望能帮助你们节省时间)_java导出excel能导出图片吗-CSDN博客

功能展示

功能代码展示

 @ApiOperation(value = "治疗记录导出", notes = "治疗记录导出")
    @PostMapping("/exportCureList")
    public void exportCureList(HttpServletResponse response,@RequestBody CureListRo ro) throws Exception{
        String userId = jwtUtil.getCurrentUser().getHisId();
        Long customerId = jwtUtil.getCurrentUser().getCustomerId();
        List<String> departmentIds= hsUserDepartmentMapper.selectList(new QueryWrapper<HsUserDepartment>()
                        .eq("user_id",userId).eq("customer_id", customerId))
                .stream().map(HsUserDepartment::getDepartmentId).collect(Collectors.toList());
        ro.setDepartmentIds(departmentIds);
        ro.setCustomerId(customerId);
        List<CureListVo> list = buSignatureService.exportCureList(ro);
        if (ObjectUtil.isEmpty(list)){
            throw new BusinessException("数据为空无法导出EXCEL");
        }
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //创建excel流(从指定文件流)
            XSSFWorkbook excel = new XSSFWorkbook();
            //定义数据
            XSSFSheet sheet = excel.createSheet("治疗记录");
            XSSFRow row1 = sheet.createRow(0);
            row1.createCell(0).setCellValue("患者姓名");
            row1.createCell(1).setCellValue("手机号");
            row1.createCell(2).setCellValue("门诊号");
            row1.createCell(3).setCellValue("身份证号");
            row1.createCell(4).setCellValue("开单科室");
            row1.createCell(5).setCellValue("执行科室");
            row1.createCell(6).setCellValue("开单医生");
            row1.createCell(7).setCellValue("治疗师");
            row1.createCell(8).setCellValue("治疗项目");
            row1.createCell(9).setCellValue("是否签名");
            row1.createCell(10).setCellValue("签名图片");
            row1.createCell(11).setCellValue("治疗开始");
            row1.createCell(12).setCellValue("治疗完成");
            row1.createCell(13).setCellValue("合计金额");
            //填充数据
            for (int i = 0; i < list.size(); i++) {
                //模板文件从第三行开始填
                Row row = sheet.createRow(i+1);
                //第一个单元格填排名
                sheet.setColumnWidth(10, 20 * 256);
                row.setHeight((short) (100*10));
                row.createCell(0).setCellValue(list.get(i).getName());
                row.createCell(1).setCellValue(list.get(i).getPhone());
                row.createCell(2).setCellValue(list.get(i).getOutpatientId());
                row.createCell(3).setCellValue(list.get(i).getIdcard());
                row.createCell(4).setCellValue(list.get(i).getDepartmentName());
                row.createCell(5).setCellValue(list.get(i).getImplDepartmentName());
                row.createCell(6).setCellValue(list.get(i).getDoctor());
                row.createCell(7).setCellValue(list.get(i).getTherapists());
                row.createCell(8).setCellValue(list.get(i).getItems());
                row.createCell(9).setCellValue(list.get(i).getIsSign());
                if (ObjectUtil.isNotEmpty(list.get(i).getSign())){
                    if (list.get(i).getSign().contains("http")){
                        row.createCell(10).setCellValue(imgxx(list.get(i).getSign(),sheet,i,10,excel));
                    }else {
                        String sign = list.get(i).getSign();
                        String substring = sign.substring(22);
                        BufferedImage bufferedImage = base64ToBufferedImage(substring);
                        row.createCell(10).setCellValue(bufxx(bufferedImage,sheet,i,10,excel));
                    }

                }
                row.createCell(11).setCellValue(sf.format(list.get(i).getCureStartTime()));
                row.createCell(12).setCellValue(sf.format(list.get(i).getCureEndTime()));
                if (ObjectUtil.isNotEmpty(list.get(i).getTotalPrice())){
                    row.createCell(13).setCellValue(list.get(i).getTotalPrice().toString());
                }else {
                    row.createCell(13).setCellValue(0);
                }
            }
            //设置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=" + URLEncoder.encode("治疗记录", "UTF8") + ".xlsx");
            // 通过输出流将Excel文件下载到客户端浏览器
            ServletOutputStream out = response.getOutputStream();
            excel.write(out);
            out.flush();
            //关闭资源
            out.close();
            excel.close();
        }

XSSFWorkbook创建表格行,列,单元格部分代码比较简单,看代码大概可以看懂,又不懂的可以私信我,我和你讲解,这里重点是保存图片单元格的方法,具体代码如下

    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, "png", 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_PNG));
            picture.resize(1,1);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

一般来说有上面一个网址解析图片的方法就足够了,但我们需求是要对于网址和base64的存储都可以进行展示,所以对上诉方法进行了一个改造,也支持base64格式的图片,代码如下。

    private String bufxx(BufferedImage bufferImg, Sheet sheet,int i,int j,Workbook excel){
        try {
            // 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
            ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
            //将图片读入BufferedImage对象
            // 将图片写入流中
            ImageIO.write(bufferImg, "png", 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_PNG));
            picture.resize(1,1);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

实现效果

标签:Java,get,导出,excel,list,createCell,setCellValue,row
From: https://blog.csdn.net/m0_73774439/article/details/144138022

相关文章

  • [Javascript] 等号运算符的运算和转换规则
    ==从上到下按照规则比较,直到能够得到确切结果为止:1.两端存在NaN,返回false2.undefined和null只有与自身比较,或者互相比较时,才会返回true,和其他原始类型比较返回false3.两端类型相同,比较值4.两端都是原始类型,转换成数字重新比较5.一端是原始类型,一端是对象类型,把对象......
  • 使用XWPFTemplate进行java后端word模版导出
    1.pom引入poi-tl<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.7.3</version></dependency> 2.word模版 3.业务代码......
  • Java中的基础语法2
    逻辑运算符1.&—逻辑与|—逻辑或!—逻辑非2.&&—短路与||—短路或^—逻辑异或注意⚠️: &”和“&&”的区别:单&时,左边无论真假,右边表达式都进行运算;双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算|”和“||”的区别同理,||表示:当左边为真,右边不参与......
  • 【JavaScript图片上传与预览】—— 轻松实现,高效体验!
    在网页上实现图片上传并预览的功能,可以使用HTML5的FileAPI和JavaScript来完成。以下是一个简单的示例代码以及详细的解释:HTML部分首先,我们需要创建一个文件输入元素和一个用于显示预览的图片元素。<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8">......
  • 基于数据可视化+加密算法+Javaweb的图书管理系统设计与实现
    文章目录1.内容见下图2.详细视频演示3.系统运行效果介绍4.技术框架4.1前后端分离架构介绍4.3程序操作流程5.项目推荐6.成品项目7.系统测试7.1系统测试的目的7.2系统功能测试8.代码参考9.为什么选择我?10.获取源码1.内容见下图2.详细视频演示文章......
  • 基于智能Ai+Javaweb的在线餐饮管理系统设计与实现
    文章目录1.内容见下图2.详细视频演示3.系统运行效果介绍4.技术框架4.1前后端分离架构介绍4.3程序操作流程5.项目推荐6.成品项目7.系统测试7.1系统测试的目的7.2系统功能测试8.代码参考9.为什么选择我?10.获取源码1.内容见下图2.详细视频演示文章......
  • [2106]基于JAVA的渔具进销存智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的渔具进销存智慧管理系统的设计与实现指导老师(一)选题的背景和意义开题报告背景与意义:在当前数字化经济时代背景下,各行各业的经营管理活动都在向信息化、智能化转变,以提高效率、降低成本、增强决策科学性。渔具行......
  • springboot毕设基于Java的足球联赛管理系统源码+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景在当今数字化快速发展的时代,体育赛事管理面临着诸多挑战与机遇。传统的足球联赛管理多依赖人工操作,存在效率低下、信息更新不及时、易出错等问题......
  • springboot毕设基于Java的幼儿护理在线咨询服务系统 源码+论文+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着社会的发展,幼儿护理受到越来越多家长的重视。然而,传统的幼儿护理咨询方式存在诸多局限。一方面,家长获取专业护理知识的渠道有限,往往只能通过......
  • 基于java ssm springboot生鲜超市管理系统生鲜商城仓库采购出入库登记(源码+文档+运行
     文章目录系列文章目录目的前言一、详细视频演示二、项目部分实现截图三、技术栈后端框架springboot前端框架vue持久层框架MyBaitsPlus系统测试四、代码参考源码获取目的摘要: 本文介绍了基于JavaSSM和SpringBoot构建的生鲜超市管理系统。该系统在生鲜超市的运......