JAVAはPOIを使って画像をExcelに書き出します
39474 ワード
機能:javaがpoiを使ってexcel表を書き出します時ピクチャーの本プログラムの基礎を追加します:ピクチャーはBLOBフォーマットのbase 64コードで、XX.xlsファイルのテンプレートのその他の先見のコードで、簡単な注釈、大まかな意味
次にここで説明します.1.プログラムはHSSF(2003版/.xlsフォーマット)を使用しています.この点で注意しなければならないのは、自分のニーズに応じてプログラムを変更するときにオブジェクトのタイプに注意し、XSSFとHSSFを区別することです.2.プログラム操作画像は、BLOBタイプのbase 64符号化に初期化される.これは、データベースに格納されたbase 64符号化がdata:image/pngであることに注意しなければならない.base 64、先頭、ただしBufferedImageに変換する場合、接頭辞は不要であり、変換時には必ず削除しなければならない.3.ImageIO.write()メソッドで画像タイプのパラメータが間違っていると、画像全体が赤くなるなど、画像の表示が異常になります...
その他、自分のニーズに応じて、1.画像パスからエクスポートすることもできます.
2.新規ファイル(テンプレートを使用しない)
3.Excelフォーマットの場合は別の記事を参考にしてみましょう.面倒くさいので、、、、、、、そのままテンプレートを使うほうが楽ですが、少し注意が必要です.テンプレートのセルにフォーマットがあると、セルに内容を追加する際にもクリアされます...
おそらく、SQLクエリーの「PICTURE」のフォーマットが間違っている場合は、次のsqlを試してみてください.
最后に、もう一つの文章をお勧めします.キットが违うので、兴味のある方は试してみてください.https://www.cnblogs.com/Yesi/p/12356955.html
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