JAVAはPOIを使って画像をExcelに書き出します

39474 ワード

機能:javaがpoiを使ってexcel表を書き出します時ピクチャーの本プログラムの基礎を追加します:ピクチャーはBLOBフォーマットのbase 64コードで、XX.xlsファイルのテンプレートのその他の先見のコードで、簡単な注釈、大まかな意味
package com.runge.util;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import javax.imageio.ImageIO;
import javax.xml.bind.DatatypeConverter;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/**
 *   Excel-   
 * @author Runge
 *
 */
public class ExcelImage {
    public static void main(String[] args) {
        new ExcelImage().creatExportFile("E:/", "  .xls");
    }
    

    public boolean creatExportFile(String path, String name) {
    	         >>>>>>>>>>>>
        List<LinkedHashMap<String, String>> list = new ArrayList<LinkedHashMap<String,String>>();
        if(null != list && list.size()>0){
            //    
            String templatePath = path + "exportAlarm.xls";
            //     
            HSSFWorkbook workbook = getWorkbook(templatePath);
            //  sheet 
            HSSFSheet sheet = workbook.getSheetAt(0);
            //        ,  sheet      (       )
            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
            //   sheet  
            try {
                writeSheet(workbook, sheet, list, patriarch);
            } catch (IOException e) {
                e.printStackTrace();
            }  //   
            //   Excel  
            exportExcel(path, name, workbook);
            return true;
        }else{
            return false;
        }
    }
    
    /**
     *      
     * @param filePath
     * @return
     */
    public HSSFWorkbook getWorkbook(String filePath){
        HSSFWorkbook xssfWorkbook = null;
        FileInputStream fis = null;
        try {
            //  Excel        
            fis = new FileInputStream(filePath);
            xssfWorkbook = new HSSFWorkbook(fis);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //        
            try {
                if (fis != null)
                    fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return xssfWorkbook;
    }
    /*
     *        
     */
    public static HSSFCell getCell(HSSFRow row, int colIndex){
        HSSFCell cell = row.getCell(colIndex);
        if (cell == null) {
            cell = row.createCell(colIndex);
            cell.setCellValue("");
        }
        return cell;
    }
    /*
     *   Excel
     */
    public void exportExcel(String path, String fileName, HSSFWorkbook wb){
        OutputStream os = null;
        try {
            //              
            File tempFile = new File(path);
            if (!tempFile.exists()) {
                tempFile.mkdirs();
            }
            os = new FileOutputStream(path + File.separator + fileName);
            wb.write(os);
            os.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {               
                if (os != null) 
                    os.close();
                wb.close();
            } catch (IOException e) {
                e.printStackTrace();
            }           
        }
    }
    /**
     *   sheet  
     * @param workbook
     * @param sheet
     * @param list
     * @throws IOException 
     */
    public void writeSheet(HSSFWorkbook workbook, HSSFSheet sheet,List<LinkedHashMap<String, String>> list, HSSFPatriarch patriarch) throws IOException{
        int rowIndex = 0;
        HSSFRow row = null;// 
        HSSFCell cell = null;// 
        ByteArrayOutputStream byteArrayOut = null;//      
        String baseArr[];//     base64Str     0-    ;1-base64  
        String type;//    
        BufferedImage buffer_Img;  
        HSSFClientAnchor anchor;
        for(LinkedHashMap<String, String> r : list){
            rowIndex++;
            row = sheet.getRow(rowIndex);
            if(row == null)row = sheet.createRow(rowIndex);
            //   
            cell = getCell(row, 0);
            cell.setCellValue(rowIndex);
            //   
            cell = getCell(row, 9);
            cell.setCellValue(r.get("USER_NAME"));
            //       
            if(StringUtils.isNotBlank(r.get("PICTURE"))){
                row.setHeight((short)2400);//     
                byteArrayOut = new ByteArrayOutputStream();
                //    ,       base64    
                baseArr = base64SplitTypeAndStr(r.get("PICTURE"));
                type = baseArr[0];
                // base64 BufferedImage
                buffer_Img = base64ToBufferedImage(baseArr[1]);  
                ImageIO.write(buffer_Img, type, byteArrayOut);//   
                //    
                anchor = new HSSFClientAnchor(0, 0, 0, 0, (short)10, rowIndex, (short)11, rowIndex+1);   
                //     
                patriarch.createPicture((HSSFClientAnchor)anchor, workbook.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));   
            }else{
                row.setHeight((short)360);//     
            }
        }
    }
    
    
    
    
    
    /**
     * base64   ,       base64  
     * @param base64
     * @return [0]-type; [1]-base64Str
     */
    public static String [] base64SplitTypeAndStr(String base64){
        String [] retArr = {"", ""};
        if(StringUtils.isNotBlank(base64)){
            //     
            String typeStr = base64.split(",")[0];
            //        
            retArr[1] = base64.replaceFirst(typeStr+",", "");
            //      
            retArr[0] = typeStr.replace("data:image/", "").replace(";base64", "");
        }
        return retArr;
    }
    
    /**
     * base64       BufferedImage
     * @param base64
     * @return
     */
    public static BufferedImage base64ToBufferedImage(String base64) {
        try {
            byte[] bytes1 = DatatypeConverter.parseBase64Binary(base64);
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);
            return ImageIO.read(bais);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
}



次にここで説明します.1.プログラムはHSSF(2003版/.xlsフォーマット)を使用しています.この点で注意しなければならないのは、自分のニーズに応じてプログラムを変更するときにオブジェクトのタイプに注意し、XSSFとHSSFを区別することです.2.プログラム操作画像は、BLOBタイプのbase 64符号化に初期化される.これは、データベースに格納されたbase 64符号化がdata:image/pngであることに注意しなければならない.base 64、先頭、ただしBufferedImageに変換する場合、接頭辞は不要であり、変換時には必ず削除しなければならない.3.ImageIO.write()メソッドで画像タイプのパラメータが間違っていると、画像全体が赤くなるなど、画像の表示が異常になります...
その他、自分のニーズに応じて、1.画像パスからエクスポートすることもできます.
	File imgFile = new File("E:/url/XX.png") ;
	BufferedImage bufferedImage = ImageIO.read(imgFile) ;
    ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
    ImageIO.write(bufferedImage, "png", byteArrayOut);

2.新規ファイル(テンプレートを使用しない)
	HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = workbook.createSheet();

3.Excelフォーマットの場合は別の記事を参考にしてみましょう.面倒くさいので、、、、、、、そのままテンプレートを使うほうが楽ですが、少し注意が必要です.テンプレートのセルにフォーマットがあると、セルに内容を追加する際にもクリアされます...
おそらく、SQLクエリーの「PICTURE」のフォーマットが間違っている場合は、次のsqlを試してみてください.
SELECT CONVERT(PICTURE USING utf8mb4) AS PICTURE FROM table

最后に、もう一つの文章をお勧めします.キットが违うので、兴味のある方は试してみてください.https://www.cnblogs.com/Yesi/p/12356955.html