将数据导出到excel并插入图片(保持图片比例)

  • 一、先看效果
  • 二、上代码
  • 1.依赖:
  • 2.工具类:
  • 3.功能代码:


一、先看效果

excel java 导入获取图片 java excel导出带图片_excel

二、上代码

1.依赖:

<poi.version>3.15</poi.version>
 		<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${poi.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>${poi.version}</version>
        </dependency>

2.工具类:

在项目中我使用了一个封装好的工具类方便使用,可在网上搜索ExportExcelUtil查找。这里列出两个主要方法(篇幅问题就不列全了),:

/**
     * 创建Excel
     *
     * @param excelName  要导出的excel名称
     * @param excelTitle 要导出的excel表中工作表的标题
     * @param list       要导出的数据集合
     * @param fieldMap   中英文字段对应Map,即要导出的excel表头
     * @param response   使用response可以导出到浏览器
     * @param <T>        虚拟类型参数
     * @return 工作簿HSSFWorkbook对象
     */
    public static <T> HSSFWorkbook createExcel(String excelName, String excelTitle, List<T> list, LinkedHashMap<String, String> fieldMap, HttpServletResponse response) {

        HSSFWorkbook wb = null;

        // 设置默认文件名为当前时间:年月日时分秒
        if (excelName == null || "".equals(excelName)) {
            excelName = new SimpleDateFormat("yyyyMMddhhmmss").format(
                    new Date()).toString();
        }
//        exportExcel(excelName, response);

        try {
            //创建一个WorkBook,对应一个Excel文件
            wb = new HSSFWorkbook();
            //在Workbook中,创建一个sheet,对应Excel中的工作表(sheet)
            HSSFSheet sheet = wb.createSheet(excelName);
            // 填充工作表
            fillSheet(sheet, excelTitle, list, fieldMap, getColumnTopStyle(wb), getStyle(wb));

        } catch (Exception e) {
            logger.info("创建Excel失败!");
            logger.error(e.getMessage());
        }
        return wb;
    }
    /**
     * 导出Excel
     *
     * @param wb        工作簿HSSFWorkbook对象
     * @param excelName 工作表名称
     * @param excelName 工作表后缀名
     * @param response  http响应
     */
    public static void exportExcel(HSSFWorkbook wb, String excelName, String suffix, HttpServletResponse response) {
        try {
            // 设置response头信息
            response.reset();   // 清除buffer缓存
            response.setContentType("application/vnd.ms-excel;charset=utf-8"); // 改成输出excel文件
            //通知浏览器不要缓存
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setDateHeader("Expires", -1);
            //通知客户端以下载的方式打开
            response.setHeader("Content-Disposition", "attachment; filename="
                    + new String(excelName.getBytes("utf-8"), "ISO-8859-1") + suffix);
            //将excel文件输出到response输出流
            OutputStream out = response.getOutputStream();
            wb.write(out);
            out.flush();
            out.close();
        } catch (Exception e) {
            logger.info("导出Excel失败!");
            logger.error(e.getMessage());
        }
    }

3.功能代码:

public void exportData( HttpServletResponse response) {
        Person person = new Person();
        person.setName("libai");
        person.setAge(43);
        List<Person> list=new ArrayList<Person>();
        list.add(person);
        List<Person> personList = list;
        String excelName = "节假日排班表";
        String excelTitle = "节假日排班表";
        LinkedHashMap<String, String> fieldMap = new LinkedHashMap<String, String>();
        fieldMap.put("name", "姓名");
        fieldMap.put("age", "年龄");
        HSSFWorkbook wb = ExportExcelUtil.createExcel(excelName, excelTitle, personList, fieldMap, response);
        ExportExcelUtil.setTopLineFont(wb.getSheet(excelName), "黑体", 18);
        ExportExcelUtil.setAllColumnsWidth(wb.getSheet(excelName), 2, fieldMap.size());
        /************上面是设置表格文本内容,下面进行插入图片处理的部分***************/
        BufferedImage bufferImg = null;
        ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
        //加载图片
        try {
            //这里file路径换成需要插入的图片路径
            bufferImg = ImageIO.read(new File("C:\\Users\\11727\\Pictures\\Saved Pictures\\569259599 (1).jpg"));
            ImageIO.write(bufferImg, "jpg", byteArrayOut);
            HSSFSheet sheet1 = wb.getSheet(excelName);
//            这里获取上面插入数据后表格的最后一行
            int lastRowNum = sheet1.getLastRowNum();
            // 设置B列的宽度为35*256;
            sheet1.setColumnWidth(1, 35 * 256);
            int row=lastRowNum+1;     //要插入的行
            int col=1;        //要插入的列
            int width = bufferImg.getWidth();//原始宽度
            int height = bufferImg.getHeight();//原始高度
        // 一个12号字体的宽度为13,前面已设置了列的宽度为30*256,故这里的等比例高度计算如下
            height = (int) Math.round((height * (30 * 13) * 1.0 / width));
        // excel单元格高度是以点单位,1点=2像素; POI中Height的单位是1/20个点,故设置单元的等比例高度如下
            HSSFRow row = sheet1.createRow(row);
            row.setHeight((short) (height / 2 * 20));
        // 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
            HSSFPatriarch patriarch = sheet1.createDrawingPatriarch();
        // anchor主要用于设置图片的属性
            HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) col, row , (short) col, row);
            anchor.setAnchorType(3);
// 插入图片
            patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
        } catch (Exception e) {
            e.printStackTrace();
        }
        /*********最后使用工具类导出设置好的表格************/
        ExportExcelUtil.exportExcel(wb, excelName, ".xls", response);
    }

希望对大家有用,能导出数据和合适的图片到excel中。

参考: Java Web篇:导出等比例图片到Excel.