• 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();

    }

    }

  • 相关阅读:
    二叉查找树详解
    探索推荐引擎内部的秘密
    个性化推荐漫谈
    网站的可扩展架构
    网站伸缩性架构--数据存储服务器集群的伸缩性设计
    SQL Server 分组后取Top N
    SQL SERVER 查询特定的前几条数据
    数据库的事务处理必须满足ACID原则,ACID分别是指什么
    String在JAVA里是固定长度的吗?为什么可用“+”连接
    怎样取得数组对象和arralist 的长度
  • 原文地址:https://www.cnblogs.com/gaodq-blogs/p/10763927.html
Copyright © 2020-2023  润新知