Java Web導(dǎo)出等比例圖片到Excel的實現(xiàn)過程
做個Excel導(dǎo)入導(dǎo)出的Java開發(fā)戶都知道,可以利用Apache的POI來實現(xiàn),為Excel創(chuàng)建每一行,每一單元及對應(yīng)的內(nèi)容。當然,圖片的話需要用到POI中的HSSFClientAnchor這個類型來實現(xiàn), HSSFClientAnchor的構(gòu)造函數(shù)中有八個參數(shù),分類為:int dx1,int dy1,int dx2,int dy2,short col1,int row1,short col2, int row2,其中dx1、dy1定義了該圖片在開始cell的起始位置,dx2、dy2定義了在終cell的結(jié)束位置,col1、row1定義了開始cell、col2、row2定義了結(jié)束cell。
那么,我們就可以用這個方法來講圖片定位到每一個單元格中。我的做法是:
鋪滿整個單元格,這里的j和i是代碼中要到處多張圖做了循環(huán)定義的變量HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) j, i + 1, (short) j, i + 1);
很順利,成功導(dǎo)出!
問題來了,打開成功到處的Excel一看,商品對應(yīng)的圖片都很規(guī)矩的按照我的設(shè)置鋪滿了整個單元格。但是,商品圖片卻都變形了,也就是圖片的 寬高被強行設(shè)置了成對應(yīng)單元格的寬高。
這樣肯定是不行的,于是第一反應(yīng)就是將圖片等比例導(dǎo)出,但是怎么讓圖片等比例的導(dǎo)出在Excel中呢,苦惱了許久,終于想到了一個可行的方案。就是利用POI設(shè)置每一行對應(yīng)要放圖片的那個單元格的寬度固定,也就是所有導(dǎo)出的圖片的寬度固定,然后根據(jù)這個固定寬度與原圖寬高對比,算出該固定寬度的等比例高度,然后動態(tài)設(shè)置該單元格的高度,然后再利用HSSFClientAnchor來鋪滿整個單元格,這樣看起來就不會變形,而且等比例縮放到指定單元格中。
關(guān)鍵兩個實現(xiàn)步驟:
第一步 設(shè)置單元格固定寬度: 循環(huán)創(chuàng)建每一行的時候,如何設(shè)置要放圖片的那個單元的寬度呢?大家都知道,在Excel中,同一列的單元格的寬度都是一樣的,故可以在創(chuàng)建工作簿的時候,就設(shè)定好要放圖片的那個單元格的寬度,我是這樣做的:
生成一個表格 HSSFSheet sheet = workbook.createSheet(title);
設(shè)置B列的寬度為 30*256; sheet.setColumnWidth(1, 30 * 256);
這里我們看到,SetColumnWidth的第二個參數(shù)要乘以256,是因為這個參數(shù)的單位是1/256個字符寬度,也就是說這里我設(shè)置的是30個字符的寬度,至于一個字符寬度是多少,可以用FontDesignMetrics來獲得,一般一個12號字體的寬度大約是13像素。
第二步,設(shè)置單元等比率高度:在循環(huán)每一行中,當創(chuàng)建對應(yīng)放圖片的單元的時候,設(shè)置對應(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();//原始高度
// 一個12號字體的寬度為13,前面已設(shè)置了列的寬度為30*256,故這里的等比例高度計算如下
height = (int) Math.round((height * (30 * 13) * 1.0 / width));
// excel單元格高度是以點單位,1點=2像素; POI中Height的單位是1/20個點,故設(shè)置單元的等比例高度如下
row.setHeight((short) (height / 2 * 20));
// 畫圖的頂級管理器,一個sheet只能獲取一個(一定要注意這點)
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的實現(xiàn)過程的文章就介紹到這了,更多相關(guān)Java Web導(dǎo)出等比例圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot中的三種應(yīng)用事件處理機制詳解
在項目開發(fā)中,組件間的松耦合設(shè)計至關(guān)重要,應(yīng)用事件處理機制作為觀察者模式的一種實現(xiàn),允許系統(tǒng)在保持模塊獨立性的同時實現(xiàn)組件間的通信,SpringBoot延續(xù)并增強了Spring框架的事件機制,提供了多種靈活的事件處理方式,本文給大家介紹了SpringBoot中的三種應(yīng)用事件處理機制2025-04-04
子線程任務(wù)發(fā)生異常時主線程事務(wù)回滾示例過程
這篇文章主要為大家介紹了子線程任務(wù)發(fā)生了異常時主線程事務(wù)如何回滾的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-03-03
使用logback實現(xiàn)按自己的需求打印日志到自定義的文件里
這篇文章主要介紹了使用logback實現(xiàn)按自己的需求打印日志到自定義的文件里,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Spring?boot?運用策略模式實現(xiàn)避免多次使用if
這篇文章主要介紹了Spring?boot?運用策略模式實現(xiàn)避免多次使用if,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
解決spring cloud gateway調(diào)用其他模塊出現(xiàn)的問題
這篇文章主要介紹了解決spring cloud gateway調(diào)用其他模塊出現(xiàn)的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-06-06
移動開發(fā)Spring Boot外置tomcat教程及解決方法
這篇文章主要介紹了移動開發(fā)SpringBoot外置tomcat教程,需要的朋友可以參考下2017-11-11

