java poi组件 读取word文档 替换文档 内容 图片


前段时间为学校做了个小系统,功能里面应该有自动填写内容和填写图片的.来来回回从网上找了很多.


最近发现有篇博文不错,可是博主有一个方法我始终没搞懂,最终综合了一下别人的方法,加上自己的研究,成功了.在这里感谢这位博主.

原帖地址:http://huangqiqing123.iteye.com/blog/1927761


* 使用的poi是 3.8版本 需要xbean.jar 和 geronimo-stax-api_1.0_spec-1.0.jar 以及org.apache.commons.logging_1.0.4.v200706111724.jar 支持

*工具运行环境必须为Office 2007 教训惨痛啊,一直用2013结果解析结果一直不正确,换成07就好了   

*文档格式为docx 如果doc应该不能用.


初始模板文档



填充完成



测试类:

package com.wheal.classes;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
public class Test {
	public static void main(String[] args) throws Exception {
		
		Map<String, Object> param = new HashMap<String, Object>();
		param.put("${xueyuan}", "学院1");
		param.put("${zhuanye}", "专业1");
		param.put("${banji}", "120506");
		param.put("${xingming}", "王");
		param.put("${xuehao}", "2012");
		param.put("${timu}", "题目1");
		param.put("${taidu}", "5");
		param.put("${lilun}", "10");
		param.put("${luwen}", "5");
		param.put("${zhiliang}", "28");
		param.put("${zongfen}", "60");
		Map<String,Object> header = new HashMap<String, Object>();
		header.put("width", 100);
		header.put("height", 50);
		header.put("type", "jpg");
		header.put("content", "d:\\qianming3.jpg");
		param.put("{qianzi}",header);
		XWPFDocument doc = WordUtil.generateWord(param, "d:\\bs.docx");
		FileOutputStream fopts = new FileOutputStream("d:/2.docx");
		doc.write(fopts);
		fopts.close();
	}
}
工具类

package com.wheal.classes;

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
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.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
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;
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;

/**
 * 适用于word 2007
 * poi 版本 3.7
 */
public class WordUtil {

	/**
	 * 根据指定的参数值、模板,生成 word 文档
	 * @param param 需要替换的变量
	 * @param template 模板
	 */
	public static XWPFDocument generateWord(Map<String, Object> param, String template) {
		XWPFDocument doc = null;
		try {
			OPCPackage pack = POIXMLDocument.openPackage(template);
			doc = new CustomXWPFDocument(pack);
			if (param != null && param.size() > 0) {
				
				//处理段落
				List<XWPFParagraph> paragraphList = doc.getParagraphs();
				processParagraphs(paragraphList, param, doc);
				
				//处理表格
				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) {
							List<XWPFParagraph> paragraphListTable =  cell.getParagraphs();
							processParagraphs(paragraphListTable, param, doc);
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return doc;
	}
	/**
	 * 处理段落
	 * @param paragraphList
	 * @throws FileNotFoundException 
	 * @throws InvalidFormatException 
	 */
	public static void processParagraphs(List<XWPFParagraph> paragraphList,Map<String, Object> param,XWPFDocument doc) throws InvalidFormatException, FileNotFoundException{
		if(paragraphList != null && paragraphList.size() > 0){
			for(XWPFParagraph paragraph:paragraphList){
				List<XWPFRun> runs = paragraph.getRuns();
				for (XWPFRun run : runs) {
					String text = run.getText(0);
					System.out.println("text=="+text);
					if(text != null){
						boolean isSetText = false;
						for (Entry<String, Object> entry : param.entrySet()) {
							String key = entry.getKey();
							if(text.indexOf(key) != -1){
								isSetText = true;
								Object value = entry.getValue();
								if (value instanceof String) {//文本替换
									System.out.println("key=="+key);
									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());
									String byteArray = (String) pic.get("content");
									
									
									System.out.println("=="+byteArray);
									//ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);
									
									//int ind = doc.getAllPictures().size() - 1;
									//doc.createPicture(ind, width , height,paragraph);
									CTInline inline = run.getCTR().addNewDrawing().addNewInline();
									insertPicture(doc,byteArray,inline, width, height);

								}
							}
						}
						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;
	}
	
	/**
	    * insert Picture
	    * @param document
	    * @param filePath
	    * @param inline
	    * @param width
	    * @param height
	    * @throws InvalidFormatException
	    * @throws FileNotFoundException
	    */
	   private static void insertPicture(XWPFDocument document, String filePath,
	                              CTInline inline, int width,
	                              int height) throws InvalidFormatException,
	                                                 FileNotFoundException {
	       document.addPictureData(new FileInputStream(filePath),XWPFDocument.PICTURE_TYPE_PNG);
	       int id = document.getAllPictures().size() - 1;
	       final int EMU = 9525;
	       width *= EMU;
	       height *= EMU;
	       String blipId =
	           document.getAllPictures().get(id).getPackageRelationship().getId();
	       String picXml = getPicXml(blipId, width, height);
	       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("IMG_" + id);
	       docPr.setDescr("IMG_" + id);
	   }
	   /**
	    * get the xml of the picture
	    * @param blipId
	    * @param width
	    * @param height
	    * @return
	    */
	   private static String getPicXml(String blipId, int width, int height) {
	       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=\"" + 0 +
	           "\" 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>";
	       return picXml;
	   }
	
}



  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
要使用Java中的POI读取Word文档并将其存储到数据库中,可以按照以下步骤进行操作: 1. 添加POI库的依赖 在Maven项目中,可以在pom.xml文件中添加如下依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 读取Word文档 可以使用POI库中的XWPFDocument类读取Word文档。下面是一个简单的示例代码: ```java File file = new File("path/to/word/document.docx"); FileInputStream fis = new FileInputStream(file); XWPFDocument document = new XWPFDocument(fis); ``` 3. 解析Word文档并获取需要存储的数据 可以使用POI库提供的API来解析Word文档中的内容,如获取段落、表格、图片等。根据需要存储的数据类型,可以选择不同的API进行解析。下面是一个示例代码,用于获取Word文档中的所有段落: ```java List<String> paragraphs = new ArrayList<>(); List<XWPFParagraph> paragraphList = document.getParagraphs(); for (XWPFParagraph paragraph : paragraphList) { String text = paragraph.getText(); paragraphs.add(text); } ``` 4. 将数据存储到数据库中 根据需要存储的数据类型,可以选择不同的数据库操作API进行存储。以下是一个示例代码,用于将获取到的段落存储到MySQL数据库中: ```java String url = "jdbc:mysql://localhost:3306/mydatabase"; String user = "root"; String password = "mypassword"; Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO paragraphs (text) VALUES (?)"); for (String paragraph : paragraphs) { pstmt.setString(1, paragraph); pstmt.executeUpdate(); } ``` 注意:以上代码只是一个示例,实际应用中需要根据具体需求进行修改。同时,为了保证程序的健壮性,需要添加异常处理代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值