`
zyn010101
  • 浏览: 324927 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

poi替换模板标签为图片

    博客分类:
  • java
 
阅读更多
在问答频道看到有人求poi模板替换图片的需求,百度一下,网上没有合适的方案,一时手痒,自己动手写了一个。本文参考了http://www.it165.net/pro/html/201108/451.html的方法,进行了部分修改,可以替换word2007的表格中的标签为图片,先看效果:





,再看代码

package com.chinahrt.zyn.iteye;  
  
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 
 *  
 */  
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   
    }  
  
    public void createPicture(int id, int width, int height,XWPFParagraph paragraph) {  
        final int EMU = 9525;  
        width *= EMU;  
        height *= EMU;  
        String blipId = getAllPictures().get(id).getPackageRelationship()  
                .getId();  
  
/*        CTInline inline = createParagraph().createRun().getCTR()  
                .addNewDrawing().addNewInline();  */
        CTInline inline = paragraph.createRun().getCTR()  
                .addNewDrawing().addNewInline();  
  
        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("甩葱玩具");  
    }  
}  



package com.chinahrt.zyn.iteye;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.POIXMLDocument;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;

public class POIWordTest {
	

	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try{
			OPCPackage pack = POIXMLDocument.openPackage("d:/img.docx");
	//		XWPFDocument doc = new XWPFDocument(pack);
			CustomXWPFDocument doc = new CustomXWPFDocument(pack);
			File pic = new File("d:/2000.png");
			FileInputStream is = new FileInputStream(pic);
			Iterator<XWPFTable> it = doc.getTablesIterator();
			while(it.hasNext()){
				XWPFTable table = it.next();
				List<XWPFTableRow> rows = table.getRows();
				for(XWPFTableRow row:rows){
					List<XWPFTableCell> cells = row.getTableCells();
					for(XWPFTableCell cell:cells){
						if(cell.getText().endsWith("${img}")){
							cell.removeParagraph(0);
						//	cell.setText("aa");
							XWPFParagraph pargraph =	cell.addParagraph();
							//100为宽,150为高
							int ind =	doc.addPicture(is, doc.PICTURE_TYPE_PNG);
							doc.createPicture(ind, 100, 150,pargraph);
						}
						List<XWPFParagraph> pars = cell.getParagraphs();
						for(XWPFParagraph par:pars){
							List<XWPFRun> runs = par.getRuns();
							for(XWPFRun run:runs){
								run.removeBreak();
								
							}
						}
					}
				}
			}
			FileOutputStream fos = new FileOutputStream("d:/img_copy.docx");
			doc.write(fos);
			fos.flush();
			fos.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}

  • 大小: 13 KB
  • 大小: 21.8 KB
0
4
分享到:
评论
5 楼 weilikk 2017-06-12  
好像只能替换整行,如果是一行中有其他数据,只替换行中某个位置就不行啊
4 楼 zyn010101 2014-11-21  
zykai029 写道
doc.addPicture(is, doc.PICTURE_TYPE_PNG);
这方法在哪

我用的 poi-3.7-20101029.jar,换下你的poi版本
3 楼 zykai029 2014-10-22  
doc.addPicture(is, doc.PICTURE_TYPE_PNG);
这方法在哪
2 楼 zykai029 2014-10-22  
doc.addPicture(is, doc.PICTURE_TYPE_PNG);
1 楼 tianyi1 2014-08-26  
设置图片的版式可以处理吗,

相关推荐

    poi-tl引擎实现world模板内容替换(支持docx)

    3. 替换模板内容:调用poi-tl的`DocumentEngine`或`TemplateEngine`,传入数据模型,将模板中的占位符替换为实际值。 4. 保存生成的文档:将替换后的内容保存为新的Word文件。 例如,如果模板中有一行`亲爱的 ${...

    FreeMarker+poi 模板生成word+导入图片

    4. **替换占位符**: 遍历模板文档,找到图片占位符,用FreeMarker的`process`方法替换为实际的图片数据。这通常涉及将图片转换为Base64编码字符串,以便能够在文档中嵌入。 5. **插入图片**: 使用POI的API在指定位置...

    poi-tl模板文件

    这些变量和占位符将在实际应用中被替换为实际数据,从而生成具体的业务目标制定报告。 业务目标制定 POI-TL 模板文件的主要内容是业务目标制定报告。报告中包括 OKR 目标制定人、部门、时间、业务目标、关键结果等...

    java使用poi根据word模板生成word(图片及文字).zip

    本示例聚焦于使用POI库根据Word模板生成带有图片和文字的新Word文档。以下是对这一技术的详细解释: 1. **Apache POI库**:Apache POI是Apache软件基金会的一个开源项目,提供了Java API来操作Microsoft Office格式...

    java poi设置生成的word的图片为上下型环绕以及其位置的实现

    【Java POI 设置 Word 图片为上下型环绕及位置实现详解】 在使用 Java POI 库生成 Word 文档时,有时我们需要对插入的图片进行格式调整,比如设置为上下型环绕,使其在文本中占据独立空间,同时可以调整图片的位置...

    使用POI向Excel模板动态添加内容

    在IT行业中,Apache POI是一个广泛使用的库,它允许开发者在Java环境中创建、修改和读取Microsoft Office格式的...通过学习和实践,你将能够熟练地使用Apache POI处理Excel模板,为你的业务提供强大的数据导出功能。

    POI按word模版生成合同并生成PDF

    在Java代码中,我们会创建一个`XWPFDocument`对象来代表Word文档,然后通过`XWPFParagraph`和`XWPFRun`对象找到并替换模板中的占位符。例如,可以使用`getParagraphs()`方法获取文档中的所有段落,再通过`getText()`...

    java替换word(docx)书签

    poi解析word模板,在需要填写 空白地方建立书签;程序遍历书签,并根据书签名称进行赋值。 &lt;groupId&gt;org.apache.poi &lt;artifactId&gt;poi &lt;version&gt;3.8 &lt;groupId&gt;org.apache.poi &lt;artifactId&gt;poi-ooxml ...

    poi3.15,word模板以及代码

    Apache POI提供了丰富的API,使得开发者能够方便地操作文档内容,包括文本、样式、图片等。 描述中提到的"定义好模板"是指在Word文档中预先设计好固定的格式,比如表格、标题、段落样式等,然后通过Apache POI的API...

    自定义标签实现POI导出

    在程序中,我们需要遍历Excel模板,找到这些自定义标签,然后根据业务逻辑替换为实际值。 以下是一些关键步骤和知识点: 1. **导入必要的POI库**:在项目中引入Apache POI的相关依赖,通常是`poi-ooxml`和`poi-...

    利用poi+word模版书签,向word中插入数据

    3. **替换数据**:遍历书签列表,找到对应的XWPFParagraph或XWPFRun对象,然后使用setText()方法替换书签内的文本为实际数据。 4. **保存文档**:最后,使用XWPFDocument的write()方法将修改后的文档写入新的.docx...

    word测试替换书签模板

    标题“word测试替换书签模板”涉及到的是在Java编程环境下,如何操作Microsoft Word 97-2003版本的文档模板,特别是针对书签内容的替换。书签是Word中的一个功能,允许用户在文档中设置特定位置的标记,方便后续对...

    freemarker根据word模板生成word的完整示例

    这些变量是由后台Java代码提供,模板引擎会将这些变量替换为实际值,然后生成最终的输出文档。 在这个"freemarker根据word模板生成word的完整示例"中,描述提到的"template"文件夹存放了XML模板。XML模板是一种结构...

    Poi-ppt.zip_885POICOM_PPT模板_javaPPT工具项目_poi ppt

    标签中的“885poicom ppt模板 javappt工具项目 poi_ppt”可能是项目名的一部分,暗示了该项目可能与885POICom组件有关,这可能是一个封装了Apache POI功能的库,提供更便捷的API用于处理PPT模板。 至于“Poi-ppt”...

    富文本框word导出所需jar包poi-tl-1.12.0

    第一种是将word模板设置成ftl格式,然后再进行标签替换。(缺点:标签太为复杂) 第二种则是通过esaypoi进行word模板导出,但是遇到有富文本框的数据,则就不咋好使了 第三种,则是今天要分享给大家的,也是我项目...

    java根据模版生成带图片的word文档

    1. 预处理:将.doc文件另存为.xml,并分析模板结构,确定需要动态替换的部分。 2. 创建数据模型:根据模板内容,构建包含图片路径或数据的数据模型。 3. 加载Freemarker库:引入`freemarker-2.3.13.jar`,初始化...

    Android应用源码利用poi将内容填到word模板.zip

    标签虽然为空,但我们可以通过标题和描述推断出一些关键标签,如 "Android开发"、"Apache POI" 和 "Word模板处理"。 压缩包中的文件名进一步揭示了其内容: 1. **QQ截图20131120112452.jpg** - 这可能是一个截图,...

    freemarkerdemo 生成word 插入图片

    图片的插入通常会涉及`&lt;#assign&gt;`指令来定义变量,以及`&lt;img&gt;`标签来插入图片,其src属性为Base64编码的图片数据。 6. **readme.txt**:这个文件很可能是项目的说明文档,提供了关于如何配置、运行和理解示例的指导...

    poi-tl:Java中以{{template}}模板化的最小word(docx)

    Word模板拥有丰富的样式,poi-tl在生成的文档中会完美保留模板中的样式,还可以为标签设置样式,标签的样式会被应用到替换后的文本上,因此您可以专注于模板设计。 poi-tl是一种“逻辑少”模板引擎,没有复杂的控制...

    jxls利用模板生成excel文件

    模板中的某些单元格可以被标记为变量,这些变量会在生成过程中被Java对象的属性值替换。 2. **数据绑定**:在Java代码中,你需要准备一个数据模型,通常是一个列表或集合,包含你要填充到Excel文件的对象。 3. **...

Global site tag (gtag.js) - Google Analytics