【轉】POI導出簡單的帶有圖片的Word文檔

原文鏈接:https://www.cnblogs.com/gaodq-blogs/p/10763927.html?tdsourcetag=s_pctim_aiomsg

 

由於導出的文檔中需要插入圖片,因此需要新建類來處理由於插入圖片引進的錯誤即“導出的word文檔在打開時會報內容出現錯誤,無法打開文件”

新建處理類爲:

import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.IOException;

import java.io.InputStream;

import org.apache.poi.openxml4j.opc.OPCPackage;

import org.apache.poi.xwpf.usermodel.XWPFDocument;

import org.apache.poi.xwpf.usermodel.XWPFParagraph;

import org.apache.xmlbeans.XmlException;

import org.apache.xmlbeans.XmlToken;

import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;

import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;

import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;

/**

* @author dongqianggao

* @version 2017-12-18 18:08

*/

public class CustomXWPFDocument extends XWPFDocument {

public CustomXWPFDocument(InputStream in) throws IOException {

super(in);

}

 

/**

*

*/

public CustomXWPFDocument() {

super();

// TODO Auto-generated constructor stub

}

 

/**

* @param pkg

* @throws IOException

*/

public CustomXWPFDocument(OPCPackage pkg) throws IOException {

super(pkg);

// TODO Auto-generated constructor stub

} // picAttch 圖片後面追加的字符串 可以是空格

public void createPicture(XWPFParagraph paragraph,int id, int width, int height,String picAttch) {

final int EMU = 9525;

width *= EMU;

height *= EMU;

String blipId = getAllPictures().get(id).getPackageRelationship()

.getId();

 

CTInline inline = paragraph.createRun().getCTR()

.addNewDrawing().addNewInline();

paragraph.createRun().setText(picAttch);

String picXml = ""

+ "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"

+ " <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"

+ " <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"

+ " <pic:nvPicPr>" + " <pic:cNvPr id=\""

+ id

+ "\" name=\"Generated\"/>"

+ " <pic:cNvPicPr/>"

+ " </pic:nvPicPr>"

+ " <pic:blipFill>"

+ " <a:blip r:embed=\""

+ blipId

+ "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"

+ " <a:stretch>"

+ " <a:fillRect/>"

+ " </a:stretch>"

+ " </pic:blipFill>"

+ " <pic:spPr>"

+ " <a:xfrm>"

+ " <a:off x=\"0\" y=\"0\"/>"

+ " <a:ext cx=\""

+ width

+ "\" cy=\""

+ height

+ "\"/>"

+ " </a:xfrm>"

+ " <a:prstGeom prst=\"rect\">"

+ " <a:avLst/>"

+ " </a:prstGeom>"

+ " </pic:spPr>"

+ " </pic:pic>"

+ " </a:graphicData>" + "</a:graphic>";

 

// CTGraphicalObjectData graphicData =

inline.addNewGraphic().addNewGraphicData();

XmlToken xmlToken = null;

try {

xmlToken = XmlToken.Factory.parse(picXml);

} catch (XmlException xe) {

xe.printStackTrace();

}

inline.set(xmlToken);

// graphicData.set(xmlToken);

 

inline.setDistT(0);

inline.setDistB(0);

inline.setDistL(0);

inline.setDistR(0);

 

CTPositiveSize2D extent = inline.addNewExtent();

extent.setCx(width);

extent.setCy(height);

 

CTNonVisualDrawingProps docPr = inline.addNewDocPr();

docPr.setId(id);

docPr.setName("圖片" + id);

docPr.setDescr("");

}

}

實際使用方法如下:

public void expWord(OrderRefund orderRefund,HttpServletRequest request,HttpServletResponse response){

try{

CustomXWPFDocument doc = new CustomXWPFDocument(); //創建文檔實體

 

XWPFParagraph title = doc.createParagraph(); //創建一個段落

title.setAlignment(ParagraphAlignment.CENTER); //設置段落的位置

XWPFRun r1 = title.createRun(); //設置相同樣式的文本

r1.setBold(true); //設置字體是否加粗

r1.setFontFamily("宋體"); //設置字體

r1.setText("退費審批表"); //添加文字內容

r1.setFontSize(16); //設置字體大小

//插入圖片文件,同樣需要新建一個段落實體

XWPFParagraph pic = doc.createParagraph();

pic1.setAlignment(ParagraphAlignment.CENTER);

doc.addPictureData(new FileInputStream(request.getSession().getServletContext().getRealPath("/")+"/upload/refund/qmw.png"),XWPFDocument.PICTURE_TYPE_PNG);

doc.createPicture(pic,doc.getAllPictures().size()-1, 97, 47," ");

 

//判斷添加的圖片的類型

int res = XWPFDocument.PICTURE_TYPE_PICT;

if(picType != null){

if(picType.equalsIgnoreCase("png")){

res = XWPFDocument.PICTURE_TYPE_PNG;

}else if(picType.equalsIgnoreCase("gif")) {

res = XWPFDocument.PICTURE_TYPE_GIF;

}else if(picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")){

res = XWPFDocument.PICTURE_TYPE_JPEG;

}

}

//通過respons輸出提示框下載文件,要注意的是如果文件名稱中有文字,需要對文件名稱進行URLEncoder編碼

String fileName = "退費審批表——"+orderRefund.getProInfo().getProName();

OutputStream out=response.getOutputStream();

response.setHeader("Content-Type","application/ms-winword");

response.addHeader("Content-Disposition","attachment;filename=\""+ URLEncoder.encode(fileName,"UTF-8")+ ".docx\"");

response.setContentType("application/octet-stream");

response.setCharacterEncoding("UTF-8");

doc.write(out);

out.close();

}catch(Exception e){

e.printStackTrace();

}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章