Java Web導(dǎo)出等比例圖片到Excel的實(shí)現(xiàn)過(guò)程
做個(gè)Excel導(dǎo)入導(dǎo)出的Java開(kāi)發(fā)戶都知道,可以利用Apache的POI來(lái)實(shí)現(xiàn),為Excel創(chuàng)建每一行,每一單元及對(duì)應(yīng)的內(nèi)容。當(dāng)然,圖片的話需要用到POI中的HSSFClientAnchor這個(gè)類型來(lái)實(shí)現(xiàn), HSSFClientAnchor的構(gòu)造函數(shù)中有八個(gè)參數(shù),分類為:int dx1,int dy1,int dx2,int dy2,short col1,int row1,short col2, int row2,
其中dx1、dy1定義了該圖片在開(kāi)始cell的起始位置,dx2、dy2定義了在終cell的結(jié)束位置,col1、row1定義了開(kāi)始cell、col2、row2定義了結(jié)束cell。
那么,我們就可以用這個(gè)方法來(lái)講圖片定位到每一個(gè)單元格中。我的做法是:
鋪滿整個(gè)單元格,這里的j和i是代碼中要到處多張圖做了循環(huán)定義的變量HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) j, i + 1, (short) j, i + 1);
很順利,成功導(dǎo)出!
問(wèn)題來(lái)了,打開(kāi)成功到處的Excel一看,商品對(duì)應(yīng)的圖片都很規(guī)矩的按照我的設(shè)置鋪滿了整個(gè)單元格。但是,商品圖片卻都變形了,也就是圖片的 寬高被強(qiáng)行設(shè)置了成對(duì)應(yīng)單元格的寬高。
這樣肯定是不行的,于是第一反應(yīng)就是將圖片等比例導(dǎo)出,但是怎么讓圖片等比例的導(dǎo)出在Excel中呢,苦惱了許久,終于想到了一個(gè)可行的方案。就是利用POI設(shè)置每一行對(duì)應(yīng)要放圖片的那個(gè)單元格的寬度固定,也就是所有導(dǎo)出的圖片的寬度固定,然后根據(jù)這個(gè)固定寬度與原圖寬高對(duì)比,算出該固定寬度的等比例高度,然后動(dòng)態(tài)設(shè)置該單元格的高度,然后再利用HSSFClientAnchor來(lái)鋪滿整個(gè)單元格,這樣看起來(lái)就不會(huì)變形,而且等比例縮放到指定單元格中。
關(guān)鍵兩個(gè)實(shí)現(xiàn)步驟:
第一步 設(shè)置單元格固定寬度: 循環(huán)創(chuàng)建每一行的時(shí)候,如何設(shè)置要放圖片的那個(gè)單元的寬度呢?大家都知道,在Excel中,同一列的單元格的寬度都是一樣的,故可以在創(chuàng)建工作簿的時(shí)候,就設(shè)定好要放圖片的那個(gè)單元格的寬度,我是這樣做的:
生成一個(gè)表格 HSSFSheet sheet = workbook.createSheet(title);
設(shè)置B列的寬度為 30*256; sheet.setColumnWidth(1, 30 * 256);
這里我們看到,SetColumnWidth的第二個(gè)參數(shù)要乘以256,是因?yàn)檫@個(gè)參數(shù)的單位是1/256個(gè)字符寬度,也就是說(shuō)這里我設(shè)置的是30個(gè)字符的寬度,至于一個(gè)字符寬度是多少,可以用FontDesignMetrics來(lái)獲得,一般一個(gè)12號(hào)字體的寬度大約是13像素。
第二步,設(shè)置單元等比率高度:在循環(huán)每一行中,當(dāng)創(chuàng)建對(duì)應(yīng)放圖片的單元的時(shí)候,設(shè)置對(duì)應(yīng)的高度。我的做法是,先獲取要導(dǎo)出的圖片,在獲取圖片的原始寬度和高度(主要,這里獲取的是像素寬高),然后根據(jù)前面設(shè)置的固定寬度算出等比例的高度:
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); BufferedImage bufferImg = ImageIO.read(new File(savePath + System.getProperty("file.separator") + map.get("productImg"))); ImageIO.write(bufferImg, "jpg", byteArrayOut); int width = bufferImg.getWidth();//原始寬度 int height = bufferImg.getHeight();//原始高度 // 一個(gè)12號(hào)字體的寬度為13,前面已設(shè)置了列的寬度為30*256,故這里的等比例高度計(jì)算如下 height = (int) Math.round((height * (30 * 13) * 1.0 / width)); // excel單元格高度是以點(diǎn)單位,1點(diǎn)=2像素; POI中Height的單位是1/20個(gè)點(diǎn),故設(shè)置單元的等比例高度如下 row.setHeight((short) (height / 2 * 20)); // 畫圖的頂級(jí)管理器,一個(gè)sheet只能獲取一個(gè)(一定要注意這點(diǎn)) HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); // anchor主要用于設(shè)置圖片的屬性 HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) j, i + 1, (short) j, i + 1); anchor.setAnchorType(3); // 插入圖片 patriarch.createPicture(anchor,workbook.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
至此,等比率圖片及相關(guān)信息以完美導(dǎo)出到Excel中。
到此這篇關(guān)于Java Web導(dǎo)出等比例圖片到Excel的實(shí)現(xiàn)過(guò)程的文章就介紹到這了,更多相關(guān)Java Web導(dǎo)出等比例圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis自定義SQL的關(guān)系映射、分頁(yè)、排序功能的實(shí)現(xiàn)
這篇文章主要介紹了Mybatis自定義SQL的關(guān)系映射、分頁(yè)、排序功能的實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01JAVA如何判斷上傳文件后綴名是否符合規(guī)范MultipartFile
這篇文章主要介紹了JAVA判斷上傳文件后綴名是否符合規(guī)范MultipartFile,文中通過(guò)實(shí)例代碼介紹了java實(shí)現(xiàn)對(duì)上傳文件做安全性檢查,需要的朋友可以參考下2023-11-11java基本教程之常用的實(shí)現(xiàn)多線程的兩種方式 java多線程教程
下面開(kāi)始學(xué)習(xí)“常用的實(shí)現(xiàn)多線程的2種方式”:Thread 和 Runnable。之所以說(shuō)是常用的,是因?yàn)橥ㄟ^(guò)還可以通過(guò)java.util.concurrent包中的線程池來(lái)實(shí)現(xiàn)多線程2014-01-01JPA?查詢?cè)鶶QL轉(zhuǎn)換VO對(duì)象方式
這篇文章主要介紹了JPA?查詢?cè)鶶QL轉(zhuǎn)換VO對(duì)象方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11SpringBoot下獲取resources目錄下文件的常用方法
本文詳細(xì)介紹了SpringBoot獲取resources目錄下文件的常用方法,包括使用this.getClass()方法、ClassPathResource獲取以及hutool工具類ResourceUtil獲取,感興趣的可以了解一下2024-10-10idea中如何過(guò)濾某些文件不提交的方法實(shí)現(xiàn)
本文主要介紹了idea中如何過(guò)濾某些文件不提交,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07JAVA 16位ID生成工具類含16位不重復(fù)的隨機(jī)數(shù)數(shù)字+大小寫
這篇文章主要介紹了JAVA 16位ID生成工具類含16位不重復(fù)的隨機(jī)數(shù)數(shù)字+大小寫,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02淺談Java變量賦值運(yùn)算符及相關(guān)實(shí)例
這篇文章主要介紹了Java賦值運(yùn)算符的一些知識(shí),需要的朋友可以參考下。2017-09-09Spring復(fù)雜對(duì)象創(chuàng)建的方式小結(jié)
這篇文章主要介紹了Spring復(fù)雜對(duì)象創(chuàng)建的三種方式,現(xiàn)在使用Spring如何創(chuàng)建這種類型的對(duì)象?Spring中提供了三種方法來(lái)創(chuàng)建復(fù)雜對(duì)象,需要的朋友可以參考下2022-01-01