研究了好几天基于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"); } }
下面是模板------
下面是转换后效果------
相关推荐
总之,Apache POI为Java开发者提供了强大而灵活的工具,可以方便地对Word文档进行各种操作,包括模板替换和表格插入。通过熟练掌握这些技术,你可以构建自动化报告生成、数据可视化等多种实用应用程序。
在这个场景中,我们关注的是如何利用Java POI库通过Word模板生成包含特定文本、表格和图片的报告。 首先,我们需要了解Java POI中的XWPFDocument类,它是用来处理.docx文件的。XWPFDocument可以读取、修改和创建...
Apache POI是一个强大的Java库,专门用于处理...以上就是使用Apache POI在Java中替换Word模板关键字和动态追加表格的知识点。通过熟练掌握这些技术,你可以构建出强大的文档自动化处理工具,满足各种业务需求。
标题中的“poi-tl引擎实现world模板内容替换(支持docx)”指的是使用poi-tl库来操作Word文档模板,并将其中的占位符替换为实际内容。这在需要根据数据动态生成定制化Word报告时非常有用。例如,你可以创建一个包含...
在本文中,我们将深入...以上就是关于"POI DOCX 完美文本、表格模板文字替换并实现在指定位置插入图片浮于文字上方"的知识点概述。通过熟练掌握Apache POI库,开发者可以灵活地处理DOCX文档,实现各种定制化的需求。
注意,替换图片时可能需要处理图片的大小和位置,以保持文档的布局不变。此外,由于.doc格式的复杂性,替换.doc文件中的图片可能需要额外的步骤,比如处理`DOP`对象和`PAPX`段落属性。 总的来说,Apache POI提供了...
以上就是使用Java和Apache POI根据Word模板生成带有图片和文字的Word文档的基本步骤和技术要点。通过这种方式,开发者可以方便地批量生成定制化的报告、合同或其他文档,极大地提高了工作效率。
Java POI 是一个非常强大的库,它允许程序员在Java环境中操作Microsoft Office格式的文件,包括Word、Excel和PowerPoint等。在这个场景中,我们关注的是使用POI来通过模板生成Word文档。这个过程通常涉及到读取一个...
1. **模板替换**:在Word模板中,我们可以定义一些占位符,例如`{{name}}`,然后使用POI的API来查找并替换这些占位符。XWPFDocument类的getParagraphs()方法可以获取文档中的所有段落,接着遍历这些段落,检查其文本...
在本主题中,我们将深入探讨如何使用Java POI流处理Word模板,插入文本、表格和图片,以及生成新的Word报告。 1. **Java POI流处理Word模板**: - POI API提供了`XWPFDocument`类来处理`.docx`文件,这是Word 2007...
POI 操作 PPT 文档(导入、导出、读取、添加、拼接、替换文本、页面排序) POI(Apache POI)是一款开源的Java库,用于读取和写入各种Microsoft Office文件格式,包括PPT文档。本文档将介绍如何使用POI操作PPT文档...
总的来说,“J2W-master”项目是一个实用的示例,展示了Java如何利用Apache POI库处理Word文档,特别是基于模板的数据替换和书签操作。对于任何需要批量生成定制化Word文档的Java开发者来说,掌握这项技能都能极大地...
【Java POI 设置 Word 图片为上下型环绕及位置实现详解】 在使用 Java POI 库生成 Word 文档时,有时我们需要对插入的图片进行格式调整,比如设置为上下型环绕,使其在文本中占据独立空间,同时可以调整图片的位置...
在这个场景中,我们关注的是如何使用POI中的`XWPFDocument`类来有效地替换文本和图片,并解决在分割或替换过程中可能出现的异常,以及保持原有的文档样式不变。 首先,让我们深入了解`XWPFDocument`类。它是Apache ...
在Java中,如果你需要在Word文档中插入图片,POI库提供了解决方案。这个过程涉及到对Word文档的内部结构有深入的理解,包括其XML表示形式,以及如何通过API来操作这些元素。 首先,我们需要导入必要的库,包括POI的...
除了基本的替换功能,还可以扩展到其他高级操作,如格式更改、样式调整、图片插入等。 总之,通过Apache POI在Android中操作Word文档是一项技术性较强的任务,涉及到文件IO、XML解析和压缩包操作等多个方面。开发者...
总结来说,使用Java和Apache POI生成PPT文件涉及理解PPT文件结构、掌握POI API、创建模板、数据绑定和错误处理等多个步骤。在给定的代码中,可能有两个不同的迭代实现,分别对应两种不同的处理方式或优化策略。通过...
在提供的压缩包文件中,"改进wordDemo-master.zip"和"java poi template .zip"可能包含了示例代码和模板文件,用于演示如何使用Java POI操作Word模板生成表单和进行修改。你可以解压并研究这些文件,以更好地理解和...
FreeMarker和Apache POI是两种在Java开发中广泛使用的工具,它们在处理文档生成和操作方面各有专长。本文将详细介绍这两个库如何协同工作来创建带有图片的Word文档。 **FreeMarker** FreeMarker是一个模板引擎,...