POI|POI Word 模板 文字 图片 替换
POI Word 模板 文字 图片 替换
博客分类:java poi POI java WOrd 实验环境:POI3.7+Word2007
Word模板:
文章图片
替换后效果:
文章图片
代码:
1、入口文件
Java代码
文章图片
- public class Test {
- public static void main(String[] args) throws Exception {
- Map param = new HashMap();
- param.put("${name}", "huangqiqing");
- param.put("${zhuanye}", "信息管理与信息系统");
- param.put("${sex}", "男");
- param.put("${school_name}", "山东财经大学");
- param.put("${date}", new Date().toString());
- Map header = new HashMap();
- header.put("width", 100);
- header.put("height", 150);
- header.put("type", "jpg");
- header.put("content", WordUtil.inputStream2ByteArray(new FileInputStream("c:\\new.jpg"), true));
- param.put("${header}",header);
- Map twocode = new HashMap();
- twocode.put("width", 100);
- twocode.put("height", 100);
- twocode.put("type", "png");
- twocode.put("content", ZxingEncoderHandler.getTwoCodeByteArray("测试二维码,huangqiqing", 100,100));
- param.put("${twocode}",twocode);
- CustomXWPFDocument doc = WordUtil.generateWord(param, "c:\\1.docx");
- FileOutputStream fopts = new FileOutputStream("c:/2.docx");
- doc.write(fopts);
- fopts.close();
- }
- }
2、封装的工具类WordUtil.java
Java代码
![POI|POI Word 模板 文字 图片 替换](https://img.it610.com/image/info8/4a4002571a314fe8beaf48e570e2929c.jpg)
文章图片
- package test1;
- import java.io.ByteArrayInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
- 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;
- /**
- * 适用于word 2007
- * poi 版本 3.7
- */
- public class WordUtil {
- /**
- * 根据指定的参数值、模板,生成 word 文档
- * @param param 需要替换的变量
- * @param template 模板
- */
- public static CustomXWPFDocument generateWord(Map param, String template) {
- CustomXWPFDocument doc = null;
- try {
- OPCPackage pack = POIXMLDocument.openPackage(template);
- doc = new CustomXWPFDocument(pack);
- if (param != null && param.size() > 0) {
- //处理段落
- List
paragraphList = doc.getParagraphs(); - processParagraphs(paragraphList, param, doc);
- //处理表格
- Iterator
it = doc.getTablesIterator(); - while (it.hasNext()) {
- XWPFTable table = it.next();
- List
rows = table.getRows(); - for (XWPFTableRow row : rows) {
- List
cells = row.getTableCells(); - for (XWPFTableCell cell : cells) {
- List
paragraphListTable =cell.getParagraphs(); - processParagraphs(paragraphListTable, param, doc);
- }
- }
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return doc;
- }
- /**
- * 处理段落
- * @param paragraphList
- */
- public static void processParagraphs(List
paragraphList,Map param,CustomXWPFDocument doc){ - if(paragraphList != null && paragraphList.size() > 0){
- for(XWPFParagraph paragraph:paragraphList){
- List
runs = paragraph.getRuns(); - for (XWPFRun run : runs) {
- String text = run.getText(0);
- if(text != null){
- boolean isSetText = false;
- for (Entry entry : param.entrySet()) {
- String key = entry.getKey();
- if(text.indexOf(key) != -1){
- isSetText = true;
- Object value = https://www.it610.com/article/entry.getValue();
- if (value instanceof String) {//文本替换
- text = text.replace(key, value.toString());
- } else if (value instanceof Map) {//图片替换
- text = text.replace(key, "");
- Map pic = (Map)value;
- int width = Integer.parseInt(pic.get("width").toString());
- int height = Integer.parseInt(pic.get("height").toString());
- int picType = getPictureType(pic.get("type").toString());
- byte[] byteArray = (byte[]) pic.get("content");
- ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);
- try {
- int ind = doc.addPicture(byteInputStream,picType);
- doc.createPicture(ind, width , height,paragraph);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
- if(isSetText){
- run.setText(text,0);
- }
- }
- }
- }
- }
- }
- /**
- * 根据图片类型,取得对应的图片类型代码
- * @param picType
- * @return int
- */
- private static int getPictureType(String picType){
- int res = CustomXWPFDocument.PICTURE_TYPE_PICT;
- if(picType != null){
- if(picType.equalsIgnoreCase("png")){
- res = CustomXWPFDocument.PICTURE_TYPE_PNG;
- }else if(picType.equalsIgnoreCase("dib")){
- res = CustomXWPFDocument.PICTURE_TYPE_DIB;
- }else if(picType.equalsIgnoreCase("emf")){
- res = CustomXWPFDocument.PICTURE_TYPE_EMF;
- }else if(picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")){
- res = CustomXWPFDocument.PICTURE_TYPE_JPEG;
- }else if(picType.equalsIgnoreCase("wmf")){
- res = CustomXWPFDocument.PICTURE_TYPE_WMF;
- }
- }
- return res;
- }
- /**
- * 将输入流中的数据写入字节数组
- * @param in
- * @return
- */
- public static byte[] inputStream2ByteArray(InputStream in,boolean isClose){
- byte[] byteArray = null;
- try {
- int total = in.available();
- byteArray = new byte[total];
- in.read(byteArray);
- } catch (IOException e) {
- e.printStackTrace();
- }finally{
- if(isClose){
- try {
- in.close();
- } catch (Exception e2) {
- System.out.println("关闭流失败");
- }
- }
- }
- return byteArray;
- }
- }
3、重写的类 CustomXWPFDocument
Java代码
![POI|POI Word 模板 文字 图片 替换](https://img.it610.com/image/info8/4a4002571a314fe8beaf48e570e2929c.jpg)
文章图片
- package test1;
- 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;
- /**
- * 自定义 XWPFDocument,并重写 createPicture()方法
- */
- public class CustomXWPFDocument extends XWPFDocument {
- public CustomXWPFDocument(InputStream in) throws IOException {
- super(in);
- }
- public CustomXWPFDocument() {
- super();
- }
- public CustomXWPFDocument(OPCPackage pkg) throws IOException {
- super(pkg);
- }
- /**
- * @param id
- * @param width 宽
- * @param height 高
- * @param paragraph段落
- */
- 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 = paragraph.createRun().getCTR().addNewDrawing().addNewInline();
- String picXml = ""
- + ""
- + ""
- + ""
- + "" + "
- + id
- + "\" name=\"Generated\"/>"
- + ""
- + ""
- + ""
- + "
- + blipId
- + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
- + ""
- + ""
- + ""
- + ""
- + ""
- + ""
- + ""
- + "
- + width
- + "\" cy=\""
- + height
- + "\"/>"
- + ""
- + ""
- + ""
- + ""
- + ""
- + ""
- + "" + "";
- inline.addNewGraphic().addNewGraphicData();
- XmlToken xmlToken = null;
- try {
- xmlToken = XmlToken.Factory.parse(picXml);
- } catch (XmlException xe) {
- xe.printStackTrace();
- }
- inline.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("测试");
- }
- }
推荐阅读
- opencv|opencv C++模板匹配的简单实现
- web网页模板|如此优秀的JS轮播图,写完老师都沉默了
- 通过复盘快速成长(附模板)
- 不会PS没关系,用Word更换证件照背景色只要30秒!
- WordPress安装后必须要做的10件事
- Word|Word Power Made Easy Review 5
- elon's|elon's keywords of 2016
- 用c#转换word或excel文档为html文件|用c#转换word或excel文档为html文件,C#实现DataSet内数据转化为Excel和Word文件的通用类完整实例...
- 词向量|词向量 Word2Vec, Glove, FastText
- PHP|PHP Everywhere 三个 RCE 漏洞威胁大量 WordPress 网站