Java将png、jpg、bmp等格式图片批量插入到Excel单个单元格内

最近做一个项目,需将多个图片(比如:jpg、bmp、png等图片格式)按实际大小插入同一个单元格,现把它记录下来,供大家参考。

由于本人程序员猿一枚,而且处在初期堆砌代码阶段,如果程序有错误的地方,真诚希望大家多多指点;如果对大家有所帮助,希望给个赞鼓励一下。具体如下:

前期准备:需要下载jxl.jar包

主要有两个类,imgFile和ExcelPicture

imgFile类,主要包括ByteArrayOutputStream pngByteArray,double width,double heigth三个属性

import java.io.ByteArrayOutputStream;  
public class ImgFile {  
      private ByteArrayOutputStream pngByteArray;//
    private double width;  
    private double heigth;  
 
    public double getWidth() {  
      
        return width;  
    }  
    public void setWidth(double width) {  
      
        this.width = width;  
    }  
    public double getHeigth() {  
      
        return heigth;  
    }  
    public void setHeigth(double heigth) {  
      
        this.heigth = heigth;  
    }
      public ByteArrayOutputStream getPngByteArray() {
            return pngByteArray;
      }
      public void setPngByteArray(ByteArrayOutputStream outPut) {
           this.pngByteArray = outPut;
      }
}

ExcelPicture类代码如下

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;

import javax.imageio.ImageIO;

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

/**
* @ClassName: ExcelPicture
* @Description: TODO(将多种格式的图片插入到excel 一个单元格内)
* @date 2017年9月21日 下午4:21:11
*
*/
public class ExcelPicture {
	 public static void main(String[] args) throws Exception {    
				System.out.println("开始插入图片");
        //创建Excel工作簿;    
        WritableWorkbook workbook = Workbook.createWorkbook(new File("F:/InsertPictureToExcel.xls"));    
        //创建Excel电子薄;    
        WritableSheet sheet = workbook.createSheet("插入图片演示", 0);     
        //图片路径  
        String[] filePaths = new String[4];  
        filePaths[0] = "F:\\2.bmp";  
        filePaths[1] = "F:\\2.jpg";  
        filePaths[2] = "F:\\2.png";
        filePaths[3] = "F:\\2.gif";
        //调用图片插入函数  
        addPictureToExcel(sheet,filePaths,3,3);  
        //写入Excel表格中;    
        workbook.write();    
        //关闭流;    
        workbook.close();    
        System.out.println("恭喜,图片插入成功!");  
    }    
      
    /**  
     *   
    * @Title: addPictureToExcel  
    * @Description: TODO(将多个图片按实际大小,插入同一个单元格,最后一张图如果高度超过了单元格,则压缩高度使之在单元格内)  
    * @date 2016年12月16日 下午6:13:52  
    * @param @param picSheet  
    * @param @param pictureFilePaths  
    * @param @param cellRow  
    * @param @param cellCol  
    * @param @throws Exception 设定文件  
    * @return void 返回类型  
    * @throws  
     */  
    private static void addPictureToExcel(WritableSheet picSheet, String[] pictureFilePaths, double cellRow, double cellCol)    
            throws Exception {  
          
        final double cellSpace = 0.02;//图片之间的间隔 占比  
          
        double picWidthMax = 0;  
        double picHeightSum =0;//空出图片 离上下边框的距离  
        ImgFile[] imgFiles = new ImgFile[pictureFilePaths.length];  
          
        for (int i=0;i<pictureFilePaths.length;i++) {  
            ImgFile imgFile = new ImgFile();  
            File imageFile = new File(pictureFilePaths[i]);   
            // 读入图片   
            BufferedImage picImage = ImageIO.read(imageFile);
            ByteArrayOutputStream pngByteArray = new ByteArrayOutputStream();
            //将其他图片格式写成png的形式
            ImageIO.write(picImage, "PNG", pngByteArray);
            imgFile.setPngByteArray(pngByteArray);
            // 取得图片的像素高度,宽度    
            double picWidth = picImage.getWidth() * 0.15;  //具体的实验值,原理不清楚。    
            double picHeight = picImage.getHeight() * 15; //具体的实验值,原理不清楚。    
              
            imgFile.setHeigth(picHeight);  
            imgFile.setWidth(picWidth);  
            //汇总  
            if (picWidth > picWidthMax) {  
                picWidthMax = picWidth;  
            }  
            picHeightSum += picHeight;  
            imgFiles[i] = imgFile;    
        }  
                      
        WritableFont font = new WritableFont(WritableFont.ARIAL,14,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.RED);    
        WritableCellFormat cellFormat = new WritableCellFormat(font);    
        //设置背景颜色;    
        cellFormat.setBackground(Colour.WHITE);    
        //设置边框;    
        cellFormat.setBorder(Border.ALL, BorderLineStyle.THIN);    
        //设置自动换行;    
        cellFormat.setWrap(true);    
        //设置文字居中对齐方式;    
        cellFormat.setAlignment(Alignment.CENTRE);    
        //设置垂直居中;    
        cellFormat.setVerticalAlignment(VerticalAlignment.CENTRE);    
          
        Label imageLabel = new Label((int)cellCol, (int)cellRow, "",cellFormat);   
        picSheet.addCell(imageLabel);  
          
        //设置单元格宽高  
        picSheet.setColumnView((int)cellCol, (int)picWidthMax);//列宽  
        picSheet.setRowView((int)cellRow, (int)picHeightSum);//行高  
          
        double widthStart = cellSpace;//开始宽度  
        double heightStart = cellSpace;//开始高度  
        //插入图片  
        for (ImgFile imgFile0: imgFiles) {  
            double heigthFact = imgFile0.getHeigth()/picHeightSum;//实际高度  
            double widthFact = imgFile0.getWidth()/picWidthMax;  
            //图片高度压缩了cellSpace+moreHeight,目的是为了该图片高度不超出单元格  
            if (heightStart + heigthFact >= 1) {  
                double moreHeight = heightStart + heigthFact - 1.00;  
                heigthFact -= moreHeight;  
                heigthFact -= cellSpace;  
            }  
            //图片宽度压缩了cellSpace,目的是为了该图片宽度不超出单元格  
            if (widthFact >= 1) {  
                widthFact -= cellSpace;  
            }  
            //生成图片对象  
            WritableImage image = new WritableImage(cellCol+widthStart, cellRow + heightStart,    
                    widthFact, heigthFact, imgFile0.getPngByteArray().toByteArray());    
            //将图片对象插入到sheet    
            picSheet.addImage(image);    
           //开始高度累加,获取下一张图片的起始高度(相对该单元格)  
            heightStart += heigthFact;  
            heightStart +=cellSpace;//图片直接间隔为cellSpace  
        }  
    }    
}




阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012323016/article/details/53738912
个人分类: JavaWeb
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭