`

Java poi 模板操作,替换文字、图片

 
阅读更多

    研究了好几天基于docx的word模板操作,其他的都还好,只是图片稍微有点复杂。直接看代码吧。

package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
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 CreateFile {

	@SuppressWarnings("resource")
	public static void main(String[] args) throws Exception{
			Map<String,String> parm = new HashMap<String, String>();
			parm.put("${bjbh}", "11");
			parm.put("${applyDepartmentPerson}", "22");
			parm.put("${receive_year}", "33");
			parm.put("${receive_month}", "44");
			parm.put("${receive_day}", "55");
			parm.put("${dealName}", "66");
			searchAndReplace ("C:/Users/Administrator/Desktop/news1.docx","C:/Users/Administrator/Desktop/neword_1.docx",parm);
	}
	
	
	
	 @SuppressWarnings("resource")
	public static void searchAndReplace(String srcPath, String destPath,Map<String, String> map) {
	        try {
	        	InputStream docis = new FileInputStream(srcPath);
	        	CustomXWPFDocument document = new CustomXWPFDocument(docis);
	            // 替换段落中的指定文字
	            Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
	            while (itPara.hasNext()) {
	                XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
	                //String s = paragraph.getParagraphText();        
	                Set<String> set = map.keySet();
	                Iterator<String> iterator = set.iterator();
	                while (iterator.hasNext()) {
	                    String key = iterator.next();
	                    List<XWPFRun> run=paragraph.getRuns();
	                     for(int i=0;i<run.size();i++)
	                     {
	                      if(run.get(i).getText(run.get(i).getTextPosition())!=null && run.get(i).getText(run.get(i).getTextPosition()).trim().equals(key))
	                      {    
	                        /**参数0表示生成的文字是要从哪一个地方开始放置,设置文字从位置0开始
	                         * 就可以把原来的文字全部替换掉了
	                        * */         
	                          run.get(i).setText(map.get(key),0);    
	                      }    
	                     }    
	                }    
	            }

	            // 替换表格中的指定文字=
	            Iterator<XWPFTable> itTable = document.getTablesIterator();
	            while (itTable.hasNext()) {
	                XWPFTable table = (XWPFTable) itTable.next();
	                int rcount = table.getNumberOfRows();
	                for (int i = 0; i < rcount; i++) {
	                    XWPFTableRow row = table.getRow(i);
	                    List<XWPFTableCell> cells = row.getTableCells();
	                    for (XWPFTableCell cell : cells) {
	                        for (Entry<String, String> e : map.entrySet()) {
	                            if (cell.getText().equals(e.getKey())) {
	                                cell.removeParagraph(0);
	                                cell.setText(e.getValue());
	                            }
	                        }
	                    }
	                }
	            }
	            
	            InputStream is = new FileInputStream("C:/Users/Administrator/Desktop/img1.png");
	            String blipId = document.addPictureData(is, CustomXWPFDocument.PICTURE_TYPE_PNG);
	            document.createPicture(blipId,document.getNextPicNameNumber(CustomXWPFDocument.PICTURE_TYPE_PNG), 500, 500);
	            FileOutputStream outStream = null;
	            outStream = new FileOutputStream(destPath);
	            document.write(outStream);
	            outStream.close();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }

	    }
	
	
	public static void rwdoc (){
		try{
			File file = new File("C:/Users/Administrator/Desktop/aa.doc");
			File file1 = new File("C:/Users/Administrator/Desktop/aa_11.doc");
			InputStream istr = new FileInputStream(file);
			HWPFDocument wDoc = new HWPFDocument(istr);
			Range range = wDoc.getRange();
			range.replaceText("${bjbh}", "11");
			range.replaceText("${applyDepartmentPerson}", "22");
			range.replaceText("${receive_year}", "33");
			range.replaceText("${receive_month}", "44");
			range.replaceText("${receive_day}", "55");
			range.replaceText("${dealName}", "66");
			OutputStream out = new FileOutputStream(file1);
			wDoc.write(out);
			wDoc.wait();
			out.flush();out.close();
			
		}catch (Exception e){
			
		}
		
	}

}

     以上代码实现了文字替换功能,下面实现插入图片功能。

package test;

import java.io.IOException;
import java.io.InputStream;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
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.CTPoint2D;
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTAnchor;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTEffectExtent;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTPosH;
import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTPosV;

public class CustomXWPFDocument extends XWPFDocument {

	public CustomXWPFDocument(InputStream in) throws IOException {
		super(in);
	}

	public void createPicture(String blipId, int id, int width, int height) {
		final int EMU = 9525;
		width *= EMU;
		height *= EMU;

		org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR ctr = createParagraph()
				.createRun().getCTR();

		CTAnchor anchor = ctr.addNewDrawing().addNewAnchor();

		anchor.setDistT(0);
		anchor.setDistB(0);
		anchor.setDistL(0);
		anchor.setDistR(0);
		anchor.setRelativeHeight(0);
		anchor.setBehindDoc(false);
		anchor.setLocked(false);
		anchor.setLayoutInCell(false);
		anchor.setAllowOverlap(false);
		anchor.setSimplePos(null);

		CTPoint2D cp2d = anchor.addNewSimplePos();
		cp2d.setX(0);
		cp2d.setY(0);

		CTEffectExtent ctext = anchor.addNewEffectExtent();
		ctext.setL(0);
		ctext.setT(0);
		ctext.setR(6985);
		ctext.setB(635);

		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=\"Picture " + id + "\" descr=\"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=\"1459865\" cy=\"1428115\"/>"
				+ "            </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();
		}
		anchor.set(xmlToken);

		anchor.setDistT(0);
		anchor.setDistB(0);
		anchor.setDistL(0);
		anchor.setDistR(0);

		CTPosH ctph = anchor.addNewPositionH();
		//ctph.setRelativeFrom(org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.STRelFromH.Enum.forString("column"));
		ctph.setPosOffset(3100000);

		CTPosV ctpv = anchor.addNewPositionV();
		//ctpv.setRelativeFrom(org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.STRelFromV.Enum.forString("paragraph"));
		ctpv.setPosOffset(5210000);
		
		CTPositiveSize2D extent = anchor.addNewExtent();
		extent.setCx(1459865);
		extent.setCy(1428115);

		CTNonVisualDrawingProps docPr = anchor.addNewDocPr();
		docPr.setId(id);
		docPr.setName("Picture " + id);
		docPr.setDescr("Generated");

	}

}

    下面是模板------

    下面是转换后效果------
 
 

  • 大小: 28.9 KB
  • 大小: 10.7 KB
分享到:
评论

相关推荐

    java使用poi操作.doc word模板替换,循环插入表格

    总之,Apache POI为Java开发者提供了强大而灵活的工具,可以方便地对Word文档进行各种操作,包括模板替换和表格插入。通过熟练掌握这些技术,你可以构建自动化报告生成、数据可视化等多种实用应用程序。

    Java Poi流根据Word模板插入相应的文本、表格和图片,并生成新的Word报告。

    在这个场景中,我们关注的是如何利用Java POI库通过Word模板生成包含特定文本、表格和图片的报告。 首先,我们需要了解Java POI中的XWPFDocument类,它是用来处理.docx文件的。XWPFDocument可以读取、修改和创建...

    POI替换word模板中的关键字

    Apache POI是一个强大的Java库,专门用于处理...以上就是使用Apache POI在Java中替换Word模板关键字和动态追加表格的知识点。通过熟练掌握这些技术,你可以构建出强大的文档自动化处理工具,满足各种业务需求。

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

    标题中的“poi-tl引擎实现world模板内容替换(支持docx)”指的是使用poi-tl库来操作Word文档模板,并将其中的占位符替换为实际内容。这在需要根据数据动态生成定制化Word报告时非常有用。例如,你可以创建一个包含...

    POI DOCX 完美文本、表格模板文字替换并实现在指定位置插入图片浮于文字上方

    在本文中,我们将深入...以上就是关于"POI DOCX 完美文本、表格模板文字替换并实现在指定位置插入图片浮于文字上方"的知识点概述。通过熟练掌握Apache POI库,开发者可以灵活地处理DOCX文档,实现各种定制化的需求。

    使用poi替换word中的图片

    注意,替换图片时可能需要处理图片的大小和位置,以保持文档的布局不变。此外,由于.doc格式的复杂性,替换.doc文件中的图片可能需要额外的步骤,比如处理`DOP`对象和`PAPX`段落属性。 总的来说,Apache POI提供了...

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

    以上就是使用Java和Apache POI根据Word模板生成带有图片和文字的Word文档的基本步骤和技术要点。通过这种方式,开发者可以方便地批量生成定制化的报告、合同或其他文档,极大地提高了工作效率。

    java poi 通过模板生成word文档

    Java POI 是一个非常强大的库,它允许程序员在Java环境中操作Microsoft Office格式的文件,包括Word、Excel和PowerPoint等。在这个场景中,我们关注的是使用POI来通过模板生成Word文档。这个过程通常涉及到读取一个...

    Apache poi 根据word模板生成word报表 替换 循环列表 图片

    1. **模板替换**:在Word模板中,我们可以定义一些占位符,例如`{{name}}`,然后使用POI的API来查找并替换这些占位符。XWPFDocument类的getParagraphs()方法可以获取文档中的所有段落,接着遍历这些段落,检查其文本...

    Java Poi流 根据Word模板插入相应的文本、表格和图片,生成新的Word报告

    在本主题中,我们将深入探讨如何使用Java POI流处理Word模板,插入文本、表格和图片,以及生成新的Word报告。 1. **Java POI流处理Word模板**: - POI API提供了`XWPFDocument`类来处理`.docx`文件,这是Word 2007...

    POI操作PPT文档(导入,导出,读取,添加,拼接,替换文本,页面排序)

    POI 操作 PPT 文档(导入、导出、读取、添加、拼接、替换文本、页面排序) POI(Apache POI)是一款开源的Java库,用于读取和写入各种Microsoft Office文件格式,包括PPT文档。本文档将介绍如何使用POI操作PPT文档...

    J2W-master.zipJ2W Java 使用 POI 3.17根据Word 模板替换、操作书签

    总的来说,“J2W-master”项目是一个实用的示例,展示了Java如何利用Apache POI库处理Word文档,特别是基于模板的数据替换和书签操作。对于任何需要批量生成定制化Word文档的Java开发者来说,掌握这项技能都能极大地...

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

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

    POI替换文本和图片,解决分割异常替换不完全的问题

    在这个场景中,我们关注的是如何使用POI中的`XWPFDocument`类来有效地替换文本和图片,并解决在分割或替换过程中可能出现的异常,以及保持原有的文档样式不变。 首先,让我们深入了解`XWPFDocument`类。它是Apache ...

    java POI-lib,word中写入图片

    在Java中,如果你需要在Word文档中插入图片,POI库提供了解决方案。这个过程涉及到对Word文档的内部结构有深入的理解,包括其XML表示形式,以及如何通过API来操作这些元素。 首先,我们需要导入必要的库,包括POI的...

    android使用POI操作替换word docx文档中指定内容

    除了基本的替换功能,还可以扩展到其他高级操作,如格式更改、样式调整、图片插入等。 总之,通过Apache POI在Android中操作Word文档是一项技术性较强的任务,涉及到文件IO、XML解析和压缩包操作等多个方面。开发者...

    java实现poi模板生成PPT文件代码

    总结来说,使用Java和Apache POI生成PPT文件涉及理解PPT文件结构、掌握POI API、创建模板、数据绑定和错误处理等多个步骤。在给定的代码中,可能有两个不同的迭代实现,分别对应两种不同的处理方式或优化策略。通过...

    java poi操作word模版文件生成表单和修改

    在提供的压缩包文件中,"改进wordDemo-master.zip"和"java poi template .zip"可能包含了示例代码和模板文件,用于演示如何使用Java POI操作Word模板生成表单和进行修改。你可以解压并研究这些文件,以更好地理解和...

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

    FreeMarker和Apache POI是两种在Java开发中广泛使用的工具,它们在处理文档生成和操作方面各有专长。本文将详细介绍这两个库如何协同工作来创建带有图片的Word文档。 **FreeMarker** FreeMarker是一个模板引擎,...

Global site tag (gtag.js) - Google Analytics