您的位置:首页 > 其它

POI导出简单的带有图片的Word文档

2018-03-01 20:49 721 查看
由于导出的文档中需要插入图片,因此需要新建类来处理由于插入图片引进的错误即“导出的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(); }}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: