POI导出简单的带有图片的Word文档
由于导出的文档中需要插入图片,因此需要新建类来处理由于插入图片引进的错误即“导出的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();
}
}