精华内容
下载资源
问答
  • 使用POI导出word文档
    2021-07-16 16:18:02

    使用POI导出word文档

    步骤一、创建一个需要导出的word文档模板。将表里需要填充的数据对应好要填充的键最后在表的最前方加入一个书签(一个table一个书签)
    步骤二、工具类

    public class WordExport {
    
    	/** 内部使用的文档对象 **/
    	private XWPFDocument document;
    
    	private BookMarks bookMarks = null;
    
    	/**
    	 * 	为文档设置模板
    	 * @param templatePath  模板文件名称
    	 * @throws Exception
    	 */
    	public void setTemplate(String templatePath) throws Exception {
    		try {
    			InputStream is=this.getClass().getResourceAsStream(templatePath);
    			this.document = new XWPFDocument(OPCPackage.open(is));
    			bookMarks = new BookMarks(document);
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	/**
    	 * 进行标签替换的例子,传入的Map中,key表示标签名称,value是替换的信息
    	 * @param indicator
    	 */
    	public void replaceBookMark(Map<String, String> indicator) {
    		//循环进行替换
    		Iterator<String> bookMarkIter = bookMarks.getNameIterator();
    		while (bookMarkIter.hasNext()) {
    			String bookMarkName = bookMarkIter.next();
    
    			//得到标签名称
    			BookMark bookMark = bookMarks.getBookmark(bookMarkName);
    
    			//进行替换
    			if (indicator.get(bookMarkName) != null) {
    				bookMark.insertTextAtBookMark(indicator.get(bookMarkName), BookMark.REPLACE);
    			}
    
    		}
    
    	}
    
    	public void fillTableAtBookMark(String bookMarkName, List<Map<String, String>> content) {
    
    		//rowNum来比较标签在表格的哪一行
    		int rowNum = 0;
    
    		//首先得到标签
    		BookMark bookMark = bookMarks.getBookmark(bookMarkName);
    		Map<String, String> columnMap = new HashMap<String, String>();
    		Map<String, Node> styleNode = new HashMap<String, Node>();
    
    		//标签是否处于表格内
    		if (bookMark.isInTable()) {
    
    			//获得标签对应的Table对象和Row对象
    			XWPFTable table = bookMark.getContainerTable();
    			XWPFTableRow row = bookMark.getContainerTableRow();
    //			CTRow ctRow = row.getCtRow();
    			List<XWPFTableCell> rowCell = row.getTableCells();
    			for (int i = 0; i < rowCell.size(); i++) {
    				columnMap.put(i + "", rowCell.get(i).getText().trim());
    				//System.out.println(rowCell.get(i).getParagraphs().get(0).createRun().getFontSize());
    				//System.out.println(rowCell.get(i).getParagraphs().get(0).getCTP());
    				//System.out.println(rowCell.get(i).getParagraphs().get(0).getStyle());
    
    				//获取该单元格段落的xml,得到根节点
    				Node node1 = rowCell.get(i).getParagraphs().get(0).getCTP().getDomNode();
    
    				//遍历根节点的所有子节点
    				for (int x = 0; x < node1.getChildNodes().getLength(); x++) {
    					if (node1.getChildNodes().item(x).getNodeName().equals(BookMark.RUN_NODE_NAME)) {
    						Node node2 = node1.getChildNodes().item(x);
    
    						//遍历所有节点为"w:r"的所有自己点,找到节点名为"w:rPr"的节点
    						for (int y = 0; y < node2.getChildNodes().getLength(); y++) {
    							if (node2.getChildNodes().item(y).getNodeName().endsWith(BookMark.STYLE_NODE_NAME)) {
    								//将节点为"w:rPr"的节点(字体格式)存到HashMap中
    								styleNode.put(i + "", node2.getChildNodes().item(y));
    							}
    						}
    					} else {
    						continue;
    					}
    				}
    			}
    
    			//循环对比,找到该行所处的位置,删除改行			
    			for (int i = 0; i < table.getNumberOfRows(); i++) {
    				if (table.getRow(i).equals(row)) {
    					rowNum = i;
    					break;
    				}
    			}
    			table.removeRow(rowNum);
    			int rowHeight=table.getRow(0).getHeight();//获取第一行高度
    			for (int i = 0; i < content.size(); i++) {
    				//创建新的一行,单元格数是表的第一行的单元格数,
    				//后面添加数据时,要判断单元格数是否一致
    				XWPFTableRow tableRow = table.createRow();
    				CTTrPr trPr = tableRow.getCtRow().addNewTrPr();
    				CTHeight ht = trPr.addNewTrHeight();
    				ht.setVal(BigInteger.valueOf(rowHeight));
    			}
    
    			//得到表格行数
    			int rcount = table.getNumberOfRows();
    			for (int i = rowNum; i < rcount; i++) {
    				XWPFTableRow newRow = table.getRow(i);
    
    				//判断newRow的单元格数是不是该书签所在行的单元格数
    				if (newRow.getTableCells().size() != rowCell.size()) {
    
    					//计算newRow和书签所在行单元格数差的绝对值
    					//如果newRow的单元格数多于书签所在行的单元格数,不能通过此方法来处理,可以通过表格中文本的替换来完成
    					//如果newRow的单元格数少于书签所在行的单元格数,要将少的单元格补上
    					int sub = Math.abs(newRow.getTableCells().size() - rowCell.size());
    					//将缺少的单元格补上
    					for (int j = 0; j < sub; j++) {
    						newRow.addNewTableCell();
    					}
    				}
    
    				List<XWPFTableCell> cells = newRow.getTableCells();
    
    				for (int j = 0; j < cells.size(); j++) {
    					XWPFParagraph para = cells.get(j).getParagraphs().get(0);
    					XWPFRun run = para.createRun();
    					if (content.get(i - rowNum).get(columnMap.get(j + "")) != null) {
    						//判断传送内容是否为图片
    						Object obj = content.get(i - rowNum).get(columnMap.get(j + ""));
    		                //判断是图片还是字符串
    		                if (obj instanceof String) {
    		                	//改变单元格的值,标题栏不用改变单元格的值 
    							run.setText(obj.toString());
    							//将单元格段落的字体格式设为原来单元格的字体格式
    							run.getCTR().getDomNode().insertBefore(styleNode.get(j + "").cloneNode(true), run.getCTR().getDomNode().getFirstChild());
    		                } else if (obj instanceof Map) {
    		                    Map pic = (Map) obj;
    		                    int width = Integer.parseInt(pic.get("width").toString());
    		                    int height = Integer.parseInt(pic.get("height").toString());
    		                    int picType = WordUtils.getPictureType(pic.get("type").toString());
    		                    byte[] byteArray = (byte[]) pic.get("content");
    		                    ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);
    		                    try {
    //		                    	File file = new File(path);//TODO path:模板word路径
    //		                        InputStream is = new FileInputStream(file);
    //		                        CustomXWPFDocument doc = new CustomXWPFDocument(is);
    //		                        
    //		                    		doc.addPictureData(byteInputStream, picType);
    //		                    		doc.createPicture(doc.getAllPictures().size() - 1, width, height, para);
    		                    } catch (Exception e) {
    		                        e.printStackTrace();
    		                    }
    		                }
    						
    					}
    					cells.get(j).setVerticalAlignment(XWPFVertAlign.CENTER);	
    					para.setAlignment(ParagraphAlignment.CENTER);
    				}
    			}
    		}
    	}
    
    	public void replaceText(Map<String, String> bookmarkMap, String bookMarkName) {
    
    		//首先得到标签
    		BookMark bookMark = bookMarks.getBookmark(bookMarkName);
    		//获得书签标记的表格
    		XWPFTable table = bookMark.getContainerTable();
    		//获得所有的表
    		//Iterator<XWPFTable> it = document.getTablesIterator();
    
    		if (table != null) {
    			//得到该表的所有行
    			int rcount = table.getNumberOfRows();
    			ParagraphAlignment align=null;
    			XWPFRun run=null;
    			for (int i = 0; i < rcount; i++) {
    				XWPFTableRow row = table.getRow(i);
    				//获到改行的所有单元格
    				List<XWPFTableCell> cells = row.getTableCells();
    				for (XWPFTableCell c : cells) {
    					for (Entry<String, String> e : bookmarkMap.entrySet()) {
    						if (c.getText().equals(e.getKey())) {
    							//获取原单元格对齐方式
    							align=c.getParagraphs().get(0).getAlignment();
    							//删掉单元格内容
    							c.removeParagraph(0);
    							//添加段落并设置段落文本对齐方式
    							c.addParagraph().setAlignment(align);
    							//设置字体大小
    							run= c.getParagraphs().get(0).createRun();
    							run.setFontFamily("宋体");
    							c.getParagraphs().get(0).setSpacingBefore(0);
    							c.getParagraphs().get(0).setSpacingAfter(0);
    							c.setVerticalAlignment(XWPFVertAlign.CENTER);
    							c.getParagraphs().get(0).setVerticalAlignment(TextAlignment.CENTER);
    //							run.setFontSize(15);
    							//给单元格赋值
    							run.setText(e.getValue());
    						}
    					}
    					if("governmentNetwork".equals(bookMarkName)) {
    						c.getParagraphs().get(0).setSpacingBefore(0);
    						c.getParagraphs().get(0).setSpacingAfter(0);
    					}
    				}
    			}
    			if("governmentNetwork".equals(bookMarkName))
    				table.setWidth(9000);
    		}
    	}
    
    	public void replaceText(Map<String, String> bookmarkMap, String bookMarkName, WordStyle style) {
    
    		//首先得到标签
    		BookMark bookMark = bookMarks.getBookmark(bookMarkName);
    		//获得书签标记的表格
    		XWPFTable table = bookMark.getContainerTable();
    		//获得所有的表
    		//Iterator<XWPFTable> it = document.getTablesIterator();
    
    		if (table != null) {
    			//得到该表的所有行
    			int rcount = table.getNumberOfRows();
    			ParagraphAlignment align=null;
    			XWPFRun run=null;
    			for (int i = 0; i < rcount; i++) {
    				XWPFTableRow row = table.getRow(i);
    				//获到改行的所有单元格
    				List<XWPFTableCell> cells = row.getTableCells();
    				for (XWPFTableCell c : cells) {
    					for (Entry<String, String> e : bookmarkMap.entrySet()) {
    						if (c.getText().equals(e.getKey())) {
    							//获取原单元格对齐方式
    							align=c.getParagraphs().get(0).getAlignment();
    							//删掉单元格内容
    							c.removeParagraph(0);
    							//添加段落并设置段落文本对齐方式
    							c.addParagraph().setAlignment(align);
    							//设置字体大小
    							run= c.getParagraphs().get(0).createRun();
    							run.setFontFamily(style.getFontFamily());
    							c.getParagraphs().get(0).setSpacingBefore(0);
    							c.getParagraphs().get(0).setSpacingAfter(0);
    							c.setVerticalAlignment(XWPFVertAlign.CENTER);
    							c.getParagraphs().get(0).setVerticalAlignment(TextAlignment.CENTER);
    							run.setFontSize(style.getFontSize());
    							//给单元格赋值
    							run.setText(e.getValue());
    						}
    					}
    					if("governmentNetwork".equals(bookMarkName)) {
    						c.getParagraphs().get(0).setSpacingBefore(0);
    						c.getParagraphs().get(0).setSpacingAfter(0);
    					}
    				}
    			}
    			if("governmentNetwork".equals(bookMarkName))
    				table.setWidth(9000);
    		}
    	}
    
    	public void saveAs(String fileName) {
    		File newFile = new File(fileName);
    		FileOutputStream fos = null;
    		try {
    			fos = new FileOutputStream(newFile);
    			this.document.write(fos);
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if (fos != null){
    					fos.flush();
    				}
    				if (fos != null){
    					fos.close();
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    	
    	public void saveAs(HttpServletResponse resp) {
    		OutputStream fos = null;
    		try {
    			fos = resp.getOutputStream();
    			this.document.write(fos);
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if (fos != null){
    					fos.flush();
    				}
    				if (fos != null){
    					fos.close();
    				}
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    
    	
    	
    	public XWPFDocument getDocument() {
    		return document;
    	}
    
    	public void setDocument(XWPFDocument document) {
    		this.document = document;
    	}
    
    	/**
    	 * 	设置行元素样式
    	 * @param run 行元素
    	 * @param font 字体
    	 * @param fontSize 字体大小
    	 */
    	private void setXWPFRunStyle(XWPFRun run, String font, int fontSize) {
    		run.setFontSize(fontSize);
    		CTRPr rpr=run.getCTR().isSetRPr()?run.getCTR().getRPr():run.getCTR().addNewRPr();
    		CTFonts fonts=rpr.isSetRFonts()?rpr.getRFonts():rpr.addNewRFonts();
    		fonts.setAscii(font);
    		fonts.setEastAsia(font);
    		fonts.setHAnsi(font);
    	}
    	
    	/**
    	 * 将所有需导出的秘密事项相关文件的document对象内容合并至第一个document
    	 * @param docList 需合并的document
    	 * @param type 是否委外会签:1 否 2是
    	 * @throws Exception
    	 */
    	public static void mergeDocument(List<XWPFDocument> docList, String type) throws Exception {
    		//获取第一个document对象
    		XWPFDocument firstDoc=docList.get(0);
    		//如果为委外会签则为第一个文档添加分页符
    		if(SecretItemsDetail.DOWNLOAD_FILE_TYPE_OUT.equals(type)) {
    			//根据document对象创建段落对象
    			XWPFParagraph fPara= firstDoc.createParagraph();
    			//为段落对象设置分页符
    			fPara.setPageBreak(true);
    		}
    		//提取第一个document对象的xml文档信息
    		CTBody srcBody=firstDoc.getDocument().getBody();
    		String xmlBody=srcBody.xmlText();
    		//提取第一个document对象的xml文档头部信息
    		String prefix=xmlBody.substring(0, xmlBody.indexOf(">")+1);
    		//提取第一个document对象的xml文档主体信息
    		String mainPart=xmlBody.substring(xmlBody.indexOf(">")+1, xmlBody.lastIndexOf("<"));
    		//提取第一个document对象的xml文档尾部信息
    		String sufix=xmlBody.substring(xmlBody.lastIndexOf("<"));
    		//遍历剩余的document对象
    		XWPFParagraph para= null;//初始化段落对象
    		XmlOptions options=null;//初始化document对象属性
    		CTBody appendBody=null;//初始化文档对象主体信息
    		String appendBodyXml=null;//初始化文档对象xml文档信息
    		String appendMainPart="";//初始化文档对象xml文档主体信息
    		String mergeBodyXml=null;//初始化合并后的文档对象xml信息
    		for(int i=1;i<docList.size();i++) {
    			if(i!=docList.size()-1) {
    				//根据document对象创建段落对象
    				para= docList.get(i).createParagraph();
    				//为段落对象设置分页符
    				para.setPageBreak(true);
    			}
    			//设置当前的document对象的xmloptions属性
    			options=new XmlOptions();
    			options.setSaveOuter();
    			//获取当前当前的document对象xml文档信息
    			appendBody=docList.get(i).getDocument().getBody();
    			appendBodyXml=appendBody.xmlText(options);
    			//获取当前的document对象主体信息
    			appendMainPart+=appendBodyXml.substring(appendBodyXml.indexOf(">")+1, appendBodyXml.lastIndexOf("<"));
    		}
    		//去掉附加文档中的"w:sectPr"标签
    		String regex = "<[\\s]*?w:sectPr[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?w:sectPr[\\s]*?>";//查找"w:sectPr"标签正则
    		appendMainPart=appendMainPart.replaceAll(regex, "");
    		//拼接第一个document对象的头部信息、主体信息、当前的document对象主体信息和第一个document对象的尾部信息
    		mergeBodyXml=prefix+mainPart+appendMainPart+sufix;
    		//将拼接后的信息转换为新的主体信息并将其设置为第一个document对象的xml文档主体信息
    		srcBody.set(CTBody.Factory.parse(mergeBodyXml));
    	}
    	
    	
    	/**
    	 * 设置响应输出文件头信息
    	 * @param fileName 文件名
    	 * @param response 响应对象
    	 */
    	public static void setResponseHeader(String fileName, HttpServletResponse response) {
        	try {
    //    		fileName=new String(fileName.getBytes("gbk"),"iso-8859-1");
    			fileName=new String(fileName.getBytes("UTF-8"),"iso-8859-1");
    			response.setContentType("application/octet-stream;charset=UTF-8");
    			response.setHeader("Content-Disposition", "attachment;filename="+fileName);
    			response.addHeader("Pargam", "no-cache");
    			response.addHeader("Cache-Control", "no-cache");
    			response.setCharacterEncoding("UTF-8");
    		} catch (UnsupportedEncodingException e) {
    			e.printStackTrace();
    		}
        }
    }
    

    步骤三、编写word导出接口

    @Transactional(readOnly = false)
    public void fileWord(Entry entry, HttpServletResponse response) {
        WordExport wordExport = new WordExport();
        try {
            Map<String, String> content1 = new HashMap<String, String>();
            content1.put("drafter", entry.getName());
            String templeatePath = "word模板路径";
                wordExport.setTemplate(templeatePath);//加载模板
                wordExport.replaceText(content1, "table_1");//根据标签替换字段
                String downloadFileName = entry.getName()+  ".docx";//设置word名称
                WordExport.setResponseHeader(downloadFileName, response);//设置相应文信息
                wordExport.saveAs(response);//下载word
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    

    步骤五、前端调用该接口

    更多相关内容
  • 1、poi版本3.13 2、可进行表格替换。复制、图片导出 3、可直接运行
  • 最近项目中需要用到数据的导出Word,本在项目中使用POI将数据导入到Word,代码示例非常简洁,代码包含pom依赖文件,下载解压即可到本地调试运行。
  • poi导出word的几种方法

    2018-09-20 11:38:25
    这是grails框架的类似java开发,只是类型用def定义所有类型。
  • POI导出Word包含页眉 页脚的设置,标题的设置以及显示显示设置,包括POI操作Word完整的jar包
  • java poi导出word文档DEMO

    2017-08-24 17:18:55
    java poi导出word文档DEMO
  • poi导出word例子(图片)
  • POI导出word

    千次阅读 2019-01-03 13:45:05
    poi导出word 最近有一个项目需要用做导出word的功能,刚开始用的是poi,开始写的时候才发现poi对于word的支持真的是少的可怜,还是推荐大家用xml或者别的来做导出word,本次功能分两篇博客展现如果用需要用poi的...

    poi导出word

    最近有一个项目需要用做导出word的功能,刚开始用的是poi,开始写的时候才发现poi对于word的支持真的是少的可怜,还是推荐大家用xml或者别的来做导出word,本次功能分两篇博客展现如果用需要用poi的可以看看这篇博客,欢迎补充。

    1. 替换word表格参数
    2. 动态生成行

    替换word模板参数 

    根据word模板导出word

    public class WordUtil {
     /**
         * 替换所有段落中的标记
         *
         * @param xwpfParagraphList
         * @param params
         */
        public static void replaceInAllParagraphs(List<XWPFParagraph> xwpfParagraphList, Map<String, String> params) {
            for (XWPFParagraph paragraph : xwpfParagraphList) {
                if (paragraph.getText() == null || paragraph.getText().equals("")) continue;
                for (String key : params.keySet()) {
                    if (paragraph.getText().contains(key)) {
                        replaceInParagraph(paragraph, key, params.get(key));
                    }
                }
            }
        }
    
        /**
         * 替换段落中的字符串
         *
         * @param xwpfParagraph
         * @param oldString
         * @param newString
         */
        public static void replaceInParagraph(XWPFParagraph xwpfParagraph, String oldString, String newString) {
            Map<String, Integer> pos_map = findSubRunPosInParagraph(xwpfParagraph, oldString);
            if (pos_map != null) {
                List<XWPFRun> runs = xwpfParagraph.getRuns();
                XWPFRun modelRun = runs.get(pos_map.get("end_pos"));
                XWPFRun xwpfRun = xwpfParagraph.insertNewRun(pos_map.get("end_pos") + 1);
                xwpfRun.setText(newString);
                if (modelRun.getFontSize() != -1)
                    xwpfRun.setFontSize(modelRun.getFontSize());//默认值是五号字体,但五号字体getFontSize()时,返回-1
                xwpfRun.setFontFamily(modelRun.getFontFamily());
                for (int i = pos_map.get("end_pos"); i >= pos_map.get("start_pos"); i--) {
                    xwpfParagraph.removeRun(i);
                }
            }
        }
    
        /**
         * 找到段落中子串的起始XWPFRun下标和终止XWPFRun的下标
         *
         * @param xwpfParagraph
         * @param substring
         * @return
         */
        public static Map<String, Integer> findSubRunPosInParagraph(XWPFParagraph xwpfParagraph, String substring) {
            List<XWPFRun> runs = xwpfParagraph.getRuns();
            int start_pos = 0;
            int end_pos = 0;
            String subtemp = "";
            for (int i = 0; i < runs.size(); i++) {
                subtemp = "";
                start_pos = i;
                for (int j = i; j < runs.size(); j++) {
                    if (runs.get(j).getText(runs.get(j).getTextPosition()) == null) continue;
                    subtemp += runs.get(j).getText(runs.get(j).getTextPosition());
                    if (subtemp.equals(substring)) {
                        end_pos = j;
                        Map<String, Integer> map = new HashMap<>();
                        map.put("start_pos", start_pos);
                        map.put("end_pos", end_pos);
                        return map;
                    }
                }
            }
            return null;
        }
    
        /**
         * 替换所有的表格
         *
         * @param xwpfTableList
         * @param params
         */
        public static void replaceInTables(List<XWPFTable> xwpfTableList, Map<String, String> params) {
            for (XWPFTable table : xwpfTableList) {
                replaceInTable(table, params);
            }
        }
    
        /**
         * 替换一个表格中的所有行
         *
         * @param xwpfTable
         * @param params
         */
        public static void replaceInTable(XWPFTable xwpfTable, Map<String, String> params) {
            List<XWPFTableRow> rows = xwpfTable.getRows();
            replaceInRows(rows, params);
        }
    
        /**
         * 替换表格中的一行
         *
         * @param rows
         * @param params
         */
        public static void replaceInRows(List<XWPFTableRow> rows, Map<String, String> params) {
            for (int i = 0; i < rows.size(); i++) {
                XWPFTableRow row = rows.get(i);
                replaceInCells(row.getTableCells(), params);
            }
        }
    
        /**
         * 替换一行中所有的单元格
         *
         * @param xwpfTableCellList
         * @param params
         */
        public static void replaceInCells(List<XWPFTableCell> xwpfTableCellList, Map<String, String> params) {
            for (XWPFTableCell cell : xwpfTableCellList) {
                replaceInCell(cell, params);
            }
        }
    
        /**
         * 替换表格中每一行中的每一个单元格中的所有段落
         *
         * @param cell
         * @param params
         */
        public static void replaceInCell(XWPFTableCell cell, Map<String, String> params) {
            List<XWPFParagraph> cellParagraphs = cell.getParagraphs();
            replaceInAllParagraphs(cellParagraphs, params);
         }
        }

    下面是调用方法
    因为map泛型规定了String,所以非String类型的参数都要用""串接起来

    public static void main(String[] args) {
            Map<String, String> params = new HashMap<>();
            params.put("${name}", "请假");
            params.put("${user}", "邹某");
            params.put("${time}", "" + new SimpleDateFormat("yyyy-MM-dd hh:mm").format(new Date()) + "");
            params.put("${type}", "产假");
            params.put("${project}", "金融");
            params.put("${startTime}", "2018-12-05 12:00");
            params.put("${endTime}", "2018-12-05 12:00");
            params.put("${dept}", "开发部");
            params.put("${numDay}", "1");
            params.put("${remark}", "不想上班");
            String filepath = "E:\\test.docx";
            String destpath = "E:\\test3.docx";
            WordUtil wordUtil = new WordUtil();
          WordUtil wordUtil = new WordUtil();
            try {
                OPCPackage pack = POIXMLDocument.openPackage(filepath);//读取模板文件
                XWPFDocument document = new XWPFDocument(pack);//创建word文件并将模板导入
                //对段落中的标记进行替换
            	List<XWPFParagraph> parasList = xwpfDocument.getParagraphs();
            	replaceInAllParagraphs(parasList, map);
                //表格标记替换
                List<XWPFTable> tables = document.getTables();
                wordUtil.replaceInTables(tables, params);
                FileOutputStream  outStream = new FileOutputStream(destpath);
                document.write(outStream);
                outStream.flush();
                outStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    å¨è¿éæå¥å¾çæè¿°

    å¨è¿éæå¥å¾çæè¿°

    以上就是poi替换word模板参数的所有内容,欢迎补充

     

    展开全文
  • Java使用POI导出Word文档的操作教程,poiword一、主要pom依赖org.apache.poipoi-ooxml3.16二、需要导出word模板三、相关导出代码package com.iflytek.chy;import java.io.FileInputStream;import java.io....

    Java使用POI导出Word文档的操作教程,poiword

    一、主要pom依赖

    org.apache.poi

    poi-ooxml

    3.16

    二、需要导出word模板

    20180712123117623.png

    三、相关导出代码

    package com.iflytek.chy;

    import java.io.FileInputStream;

    import java.io.FileOutputStream;

    import java.io.IOException;

    import java.io.InputStream;

    import java.io.OutputStream;

    import java.util.HashMap;

    import java.util.List;

    import java.util.Map;

    import java.util.regex.Matcher;

    import java.util.regex.Pattern;

    import org.apache.commons.lang3.StringUtils;

    import org.apache.poi.xwpf.usermodel.XWPFDocument;

    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 App {

    private static String regex = "[a-zA-Z]+";

    private static Pattern pattern = Pattern.compile(regex);

    public static void main(String[] args) throws IOException {

    Map map = new HashMap();

    map.put("qbdj", "你好");

    map.put("zlhtbt", "姓名");

    map.put("fwqh", "性别");

    map.put("qbly", "年龄");

    map.put("lrsj", "生日");

    map.put("bt", "职业");

    map.put("xxzw", "工作城市");

    map.put("bb", "武汉光谷");

    map.put("ss", "武汉光谷");

    map.put("ff", "武汉光谷");

    map.put("gg", "武汉光谷");

    map.put("hh", "武汉光谷");

    map.put("dd", "武汉光谷");

    String filePath = "D:\\java_workspace_qbNew\\qb-yp\\qb-xsfx\\target\\classes\\config\\template\\SWSJ-test.docx";

    InputStream is = new FileInputStream(filePath);

    @SuppressWarnings("resource")

    XWPFDocument doc = new XWPFDocument(is);

    List list = doc.getParagraphs();

    // 替换占位符

    for (int i = 0; i < list.size(); i++) {

    XWPFParagraph xwpfParagraph = list.get(i);

    List runs = xwpfParagraph.getRuns();

    if (runs != null && runs.size() > 0) {

    for (int j = runs.size() - 1; j >= 0; j--) {

    if (map.containsKey(runs.get(j).text())) {

    System.out.println("run:" + runs.get(j).text());

    runs.get(j).setText(map.get(runs.get(j).text()), 0);

    }

    }

    }

    }

    // 替换表格中的占位符

    List tables = doc.getTables();

    for (XWPFTable xwpfTable : tables) {

    for (int i = 0; i < xwpfTable.getNumberOfRows(); i++) {

    XWPFTableRow row = xwpfTable.getRow(i);

    List tableCells = row.getTableCells();

    for (XWPFTableCell xwpfTableCell : tableCells) {

    List paragraphs = xwpfTableCell.getParagraphs();

    for (XWPFParagraph xwpfParagraph : paragraphs) {

    List runs = xwpfParagraph.getRuns();

    for (XWPFRun xwpfRun : runs) {

    String trim = xwpfRun.text();

    Matcher matcher = pattern.matcher(trim);

    String temp = "";

    while (matcher.find()) {

    temp = matcher.group();

    }

    if (StringUtils.isNotBlank(temp)) {

    trim = trim.replace(temp, map.get(temp));

    }

    xwpfRun.setText(trim, 0);

    }

    }

    }

    }

    }

    OutputStream os = new FileOutputStream(

    "D:\\\\java_workspace_qbNew\\\\qb-yp\\\\qb-xsfx\\\\target\\\\classes\\\\config\\\\template\\\\MY-SWSJ-test.docx");

    doc.write(os);

    os.close();

    is.close();

    }

    }

    展开全文
  • Spring boot + poi 导出Word

    2021-12-28 10:44:45
    spring boot + poi 遍历导出 Word

    基于若依框架:Spring boot + poi 导出Word

    Pom

     		<!-- Word Start-->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>4.1.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-scratchpad</artifactId>
                <version>4.1.2</version>
            </dependency>
    		<!-- Word End-->
    

    Controller

        @PostMapping("/exportWord")
        @ResponseBody
        public AjaxResult exportWord(SysUser user)
        {
            List<SysUser> list = userService.selectUserList(user);
        	ExportWord ew = new ExportWord();
            return ew.word(list, "导出文件夹名称");
        }
    

    Util

    package com.ruoyi.web.controller.system;
    
    import com.ruoyi.common.config.RuoYiConfig;
    import com.ruoyi.common.core.domain.AjaxResult;
    import com.ruoyi.common.core.domain.entity.SysUser;
    import com.ruoyi.common.exception.UtilException;
    import org.apache.poi.util.IOUtils;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    import java.text.SimpleDateFormat;
    import java.util.List;
    import java.util.UUID;
    
    public class ExportWord {
        private static final Logger log = LoggerFactory.getLogger(ExportWord.class);
    
        public AjaxResult word(List<SysUser> userList, String fileName){
            String uuid = UUID.randomUUID().toString();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //格式化当前系统日期
            XWPFDocument doc = new XWPFDocument();
            OutputStream out = null;
            try
            {
                for (int i = 0; i < userList.size(); i++) {
                    //创建一个段落
                    XWPFParagraph para = doc.createParagraph();
                    //一个XWPFRun代表具有相同属性的一个区域:一段文本
                    XWPFRun run16 = para.createRun();
                    run16.setText("客户名称:" + userList.get(i).getKhmc());//文本
                    run16.setBold(true);//加粗
                    run16.setFontSize(16);//字体大小
                    run16.setFontFamily("微软雅黑");//字体,范围----效果不详
                    run16.addCarriageReturn();//回车键
    
                    XWPFRun run12 = para.createRun();
                    run12.setText("联系人:"  + userList.get(i).getUserName());
                    run12.setBold(false);//加粗
                    run12.setFontSize(12);//字体大小
                    run12.setFontFamily("微软雅黑");//字体,范围----效果不详
                    run12.addCarriageReturn();//回车键
    
                    run12.setText("联系电话:" + userList.get(i).getPhonenumber());
                    run12.setBold(false);//加粗
                    run12.setFontSize(12);//字体大小
                    run12.setFontFamily("微软雅黑");//字体,范围----效果不详
                    run12.addCarriageReturn();//回车键
    
                    XWPFRun run16_2 = para.createRun();
                    run16_2.setText("件数共:"  + userList.get(i).getSex());//文本
                    run16_2.setBold(true);//加粗
                    run16_2.setFontSize(16);//字体大小
                    run16_2.setFontFamily("微软雅黑");//字体,范围----效果不详
                    run16_2.addCarriageReturn();//回车键
    
                    XWPFRun run12_2 = para.createRun();
                    run12_2.setText("运输方式:" + userList.get(i).getYxfs());//文本
                    run12_2.setBold(false);//加粗
                    run12_2.setFontSize(12);//字体大小
                    run12_2.setFontFamily("微软雅黑");//字体,范围----效果不详
                    run12_2.addCarriageReturn();//回车键
    
                    run12_2.setText("发货日期:" + sdf.format(userList.get(i).getCreateTime()));//文本
                    run12_2.addCarriageReturn();//回车键
    
                    run12_2.setText("实际收货地址:" + userList.get(i).getDz());//文本
                    if(i == 0){
                        run12_2.addCarriageReturn();//回车键
                        run12_2.addCarriageReturn();//回车键
                        run12_2.addCarriageReturn();//回车键
                        run12_2.addCarriageReturn();//回车键
                        run12_2.addCarriageReturn();//回车键
                    }else if(i != userList.size()-1){
    					run12_2.addCarriageReturn();//回车键
                        run12_2.addCarriageReturn();//回车键
                        run12_2.addCarriageReturn();//回车键
                        run12_2.addCarriageReturn();//回车键
                    }
                }
                out = new FileOutputStream(getAbsoluteFile(uuid,fileName));
                doc.write(out);
                return AjaxResult.success(encodingFilename(uuid,fileName));
            }
            catch (Exception e)
            {
                log.error("导出Excel异常{}", e.getMessage());
                throw new UtilException("导出Excel失败,请联系网站管理员!");
            }
            finally
            {
    
                IOUtils.closeQuietly(doc);
                IOUtils.closeQuietly(out);
            }
        }
    
        /**
         * 编码文件名
         */
        public String encodingFilename(String uuid,String filename)
        {
            filename = uuid + "_" + filename + ".docx";
            return filename;
        }
    
        /**
         * 获取下载路径
         *
         * @param filename 文件名称
         */
        public String getAbsoluteFile(String uuid,String filename)
        {
            String downloadPath = RuoYiConfig.getDownloadPath() + uuid + "_" + filename + ".docx";
            File desc = new File(downloadPath);
            if (!desc.getParentFile().exists())
            {
                desc.getParentFile().mkdirs();
            }
            return downloadPath;
        }
    }
    

    XWPFRun

    XWPFRun 对象属性。例如:

    方法类型描述
    run.setText()String写入Word内容
    run.setBold()Boolean加粗
    run.setColor()String设置颜色–十六进制
    run.setDoubleStrikethrough()Boolean双删除线
    run.setFontFamily()String字体
    run.setFontSize()int字体大小
    run.setImprinted()Boolean印迹(悬浮阴影)
    run.setItalic()Boolean斜体(字体倾斜)
    run.setShadow()Boolean阴影
    run.setStrikeThrough()Boolean单删除线
    run.addTab()tab键
    run.addCarriageReturn()回车键

    效果

    SoringBoot Poi 导出Word
    链接:

    1. Maven: https://mvnrepository.com/
    2. Csnd: https://www.csdn.net/
    展开全文
  • 项目中,有时候需要使用poi实现将固定数据导入word中 效果图: 代码: package poiword; import java.io.File; import java.io.FileOutputStream; import java.math.BigInteger; import org.apache.poi.xwpf....
  • poi 导出word

    2018-11-01 20:43:57
    项目中需要根据人员信息生成个人简历文档
  • /***写入图片*@paramdocument*@parampicName*@paramwidth*@paramheight*@paramalignment*/privatevoidWriteImage(CustomXWPFDocumentdocument,StringpicName,intwidth,intheight,ParagraphAlignmen...
  • apache poi 导出excel、word,替换word内容,导出word-文本、图片、表格
  • POI报表Word导出

    2017-02-06 14:31:07
    POI报表Word导出
  • Java使用poi导出word(亲测有效)

    千次阅读 2020-10-17 16:05:49
    废话也就不那个多说,下面的代码是...import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import o
  • java使用poi导出word

    2022-04-24 11:22:14
    1.代码如下 package doc; import java.io....import org.apache.poi.poifs.filesystem.DirectoryEntry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; public class ExportDoc { public
  • springboot整合POI导出word(文字加图片)
  • 展开全部读取word 2003及word 2007需要的jar包读取 2003 版本62616964757a686964616fe58685e5aeb931333363383436(.doc)的word文件相对来说比较简单,只需要 poi-3.5-beta6-.jar 和 poi-scratchpad-3.5-beta6-.jar 两...
  • 文章目录SpringBoot Poi导出word,浏览器下载1.引依赖:2.写代码(生成本地word):3.返回给浏览器下载1.如何返回给浏览器让它下载4.解决方案5.为什么没使用easypoi 模板导出word SpringBoot Poi导出word,浏览器下载 ...
  • 一个使用Apache的poi使用word模板循环输出表格行并导出的例子
  • POI导出word工具类

    2022-03-08 15:59:25
    1:导出07版word(docx) 2:支持文本、图片、表格、页脚、纸张大小、纸张方向、页边距 3:方便扩展 4:使用实例 (在 类WordExporter 的main方法中)
  • 通过 apache poi导出带表格的 word 文件,并且表格的宽度可能过宽,需要纸张横向或者更大的纸张
  • POI导出word表格代码(XWPF) package com.jeesite.modules.emage.wordexport.emageexportwordtemplate.controller; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream;...
  • Java POI导出Word文档详解

    万次阅读 多人点赞 2019-08-28 14:58:06
    一、POI 生成导出Word样式 二、详细代码 pom.xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version...
  • 模版word文件 生成的word文件 代码 //自己使用做下简单的封装即可 public static void main(String[] args) { //示例数据 Map<String, Object> map = new HashMap<>(); map.put("name", "李四1");...
  • //导出word@RequestMapping("/exportWord.do")@ResponseBodypublicReturnMsg exportWord(String[] key_columns,String[] value_columns,String title,HttpServletResponse response){ReturnMsg rm= newReturnMsg();...
  • Springboot 之 POI导出Word文件

    千次阅读 2019-12-09 19:07:15
    导出Word文件其实与...下面简单介绍一下在Springboot项目中如何使用POI导出Word文件。 pom.xml文件 <parent> <groupId>org.springframework.boot</groupId> <artifactId>sprin...
  • 1、固定表格的格式,宽带和高度 : 表格》》》自动调整》》固定列宽 2、设置单元格内字体大小 : XWPFRun.setFontSize(9); 3、设置单元格内文字段落的行距 : para.setSpacingBetween(0.3); ...
  • Java POI导出word文件及生成表格

    千次阅读 多人点赞 2020-03-25 17:04:37
    HWPF是处理 Microsoft Word 97(-2007) .doc文件格式,它还为较旧的Word 6和Word 95文件格式... XWPF是处理 Word 2007 .docx文件格式,包含在poi-ooxml-XXX.jar中。 虽然HWPF和XWPF提供类似的功能,但目前两者...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,049
精华内容 2,419
关键字:

poi 导出word