使用Jacob合并多个word文档生成一个word文档

public void uniteDoc(String[] tempIds, String savepaths) {
		String rootPath = ****;
		if (ObjectUtil.isNull(tempIds) || tempIds.length <= 0 || ObjectUtil.isNull(tempIds[0])) {
			return;
		}
		//将jacob-1.17-M2-x64.dll文件拷到下面打印出来的目录
		System.out.println("---------->"+System.getProperty("java.library.path"));
		//打开word
		ActiveXComponent app = new ActiveXComponent("Word.Application");//启动word
		try {
			//设置word不可见
			app.setProperty("Visible", new Variant(false));
			//获得documents对象
			Object docs = app.getProperty("Documents").toDispatch();
			//打开第一个文件
			Temp firstTemp = this.findById(tempIds[0]);
			Object doc = Dispatch.invoke(
	                    (Dispatch) docs, 
	                    "Open", 
	                    Dispatch.Method, 
	                    new Object[] { (String) rootPath+firstTemp.getFjurl(),
	                            new Variant(false), new Variant(true) }, 
	                    new int[3]).toDispatch();
			//获得当前文档选定部分或光标所在位置
			Dispatch selection = app.getProperty("Selection").toDispatch();
			//光标定位到文档首位置
			Dispatch.call(selection, "HomeKey", new Variant(6));
			//在光标所在位置插入文本
			insertFormatParagraph(selection, "类型:"+firstTemp.getType().getTypeName(), 
					true, false, false, null, "10.5", "宋体", "0");
			insertFormatParagraph(selection, "来源:"+firstTemp.getUnit().getName(), 
					true, false, false, null, "10.5", "宋体", "0");
			insertFormatParagraph(selection, "标题:"+firstTemp.getTitle(), 
					true, false, false, null, "10.5", "宋体", "0");
			//光标定位到文档末尾位置
			Dispatch.call(selection, "EndKey", new Variant(6));
			Dispatch.call(selection, "TypeParagraph");
			//插入一个分页符
			Dispatch.call(selection, "InsertBreak");
			
			//追加文件
			for (int i = 1; i < tempIds.length; i++) {
				Temp temp = this.findById(tempIds[i]);
				if(!ObjectUtil.isNull(temp.getFjurl())){
					File file = new File(rootPath+temp.getFjurl());
					if(file.exists() && temp.getFjurl().endsWith("doc")){
						//每一篇文档前添加报送类型、单位和标题
						insertFormatParagraph(selection, "类型:"+temp.getType().getTypeName(), 
								true, false, false, null, "10.5", "宋体", "0");
						insertFormatParagraph(selection, "来源:"+temp.getUnit().getName(), 
								true, false, false, null, "10.5", "宋体", "0");
						insertFormatParagraph(selection, "标题:"+temp.getTitle(), 
								true, false, false, null, "10.5", "宋体", "0");
						//文档内容
						Dispatch.invoke(selection,
			                "insertFile", Dispatch.Method, new Object[] {
			                        (String) rootPath+temp.getFjurl(), "",
			                        new Variant(false), new Variant(false),
			                        new Variant(false) }, new int[3]);
						//每一篇文档后添加分页符
						Dispatch.call(selection, "EndKey", new Variant(6));
						Dispatch.call(selection, "TypeParagraph");
						if(i != tempIds.length-1){
							Dispatch.call(selection, "InsertBreak");
						}
					}
				}
			}
			//保存新的word文件
			File folder = new File(savepaths.substring(0, savepaths.lastIndexOf("/")+1));
			if(!folder.exists() && !folder.isDirectory()){
				folder.mkdirs();
			}
			Dispatch.invoke((Dispatch) doc, "SaveAs", Dispatch.Method,
	            new Object[] { savepaths, new Variant(1) }, new int[3]);
			Variant f = new Variant(false);
			Dispatch.call((Dispatch) doc, "Close", f);
		} catch (Exception e) {
			throw new RuntimeException("合并word文件出错.原因:" + e);
		} finally {
			app.invoke("Quit", new Variant[] {});
		}
	}


另写了一个方法,在光标位置插入一个带格式的文本段落。

/**
	 * 在当前光标位置插入(或将选定内容替换成)   一段带格式的文本段落
	 * @param selection 光标位置或选定内容
	 * @param text 插入的内容
	 * @param isBold 是否加粗
	 * @param isItalic 是否斜体
	 * @param isUnderLine 是否加下划线
	 * @param color 字体颜色
	 * @param size 字号(只能是数字)
	 * @param name 字体名称
	 * @param align 对齐方式:0左对齐,1居中,2右对齐,3两端对齐,4分散对齐
	 */
	private void insertFormatParagraph(Dispatch selection, String text, boolean isBold, boolean isItalic, 
			boolean isUnderLine, String color, String size, String name, String align){
		//在光标所在位置插入文本(插入完后默认选中插入内容)
		Dispatch.put(selection, "Text", text);
		//设置选中部分字体格式
		Dispatch font = Dispatch.get(selection, "Font").toDispatch();
		if(!ObjectUtil.isNull(name)){
			Dispatch.put(font, "Name", new Variant(name));
		}
		Dispatch.put(font, "Bold", new Variant(isBold));
		Dispatch.put(font, "Italic", new Variant(isItalic));
		Dispatch.put(font, "UnderLine", new Variant(isUnderLine));
		if(!ObjectUtil.isNull(color)){
			Dispatch.put(font, "Color", color);
		}
		if(!ObjectUtil.isNull(size)){
			Dispatch.put(font, "Size", size);
		}
		if(!ObjectUtil.isNull(align)){
			Dispatch paragraphs = Dispatch.get(selection, "Paragraphs").toDispatch();
			Dispatch.put(paragraphs, "Alignment", new Variant(align));
		}
		//光标移动(取消选定内容)
		Dispatch.call(selection, "Move");
		//设置为一个段落(换行)
		Dispatch.call(selection, "TypeParagraph");
	}


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我并不是一个可以浏览文档的程序,也没有能力打开网页查找相关信息。但是,我可以告诉你如何使用Java多个Word文档合并一个Word文档。 可以使用Apache POI库来操作Word文档。以下是将多个Word文档合并一个Word文档的示例代码: ``` import java.io.*; import org.apache.poi.xwpf.usermodel.*; public class MergeWordDocuments { public static void main(String[] args) throws Exception { String[] files = {"doc1.docx", "doc2.docx", "doc3.docx"}; XWPFDocument finalDoc = new XWPFDocument(); for (String file : files) { XWPFDocument doc = new XWPFDocument(new FileInputStream(file)); for (XWPFParagraph para : doc.getParagraphs()) { XWPFParagraph newPara = finalDoc.createParagraph(); newPara.createRun().setText(para.getText()); } for (XWPFTable tbl : doc.getTables()) { XWPFTable newTbl = finalDoc.createTable(); newTbl.getCTTbl().setTblPr(tbl.getCTTbl().getTblPr()); for (int i = 0; i < tbl.getRows().size(); i++) { XWPFTableRow row = newTbl.getRow(i); if (row == null) row = newTbl.createRow(); for (int j = 0; j < tbl.getRow(i).getTableCells().size(); j++) { XWPFTableCell cell = row.getCell(j); if (cell == null) cell = row.createCell(); cell.getCTTc().setTcPr(tbl.getRow(i).getCell(j).getCTTc().getTcPr()); for (XWPFParagraph para : tbl.getRow(i).getCell(j).getParagraphs()) { XWPFParagraph newPara = cell.addParagraph(); newPara.createRun().setText(para.getText()); } } } } } FileOutputStream out = new FileOutputStream("finalDoc.docx"); finalDoc.write(out); out.close(); finalDoc.close(); } } ``` 上述代码将会把 `doc1.docx`,`doc2.docx` 和 `doc3.docx` 合并为 `finalDoc.docx` 文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值