读取word模板,并写入数据到word文件中

本文介绍如何使用Java操作OpenOffice文档,包括插入文本到书签位置及更新表格数据。通过具体代码示例展示了如何连接OpenOffice服务、加载文档、获取文档中的书签和表格,并实现内容替换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

word的模板

   

   

package com.ws.base.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.sun.star.container.XNameAccess;
import com.sun.star.frame.XComponentLoader;
import com.sun.star.lang.XMultiComponentFactory;
import com.sun.star.table.XTableRows;
import com.sun.star.text.XBookmarksSupplier;
import com.sun.star.text.XSentenceCursor;
import com.sun.star.text.XText;
import com.sun.star.text.XTextContent;
import com.sun.star.text.XTextCursor;
import com.sun.star.text.XTextDocument;
import com.sun.star.text.XTextTable;
import com.sun.star.text.XTextTablesSupplier;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XComponentContext;
import com.ws.base.bootstrapconnector.BootstrapSocketConnector;

public class TestAction {
	private static Log logger = LogFactory.getLog(TestAction.class);
	/**
	 * open office的安装路径;
	 */
	private static String OPENOFFICE_PATH = "C:/Program Files (x86)/OpenOffice 4/program/";

	private static XTextDocument mxDoc;

	@SuppressWarnings("unchecked")
	public static void main(String[] args) {
		// 读取文件
		XComponentContext xContext = null;
		try {
			// get the remote office component context
			xContext = BootstrapSocketConnector.bootstrap(OPENOFFICE_PATH);
			System.out.println("Connected to a running office ...");
			// get the remote office service manager
			XMultiComponentFactory xMCF = xContext.getServiceManager();
			Object desktop = xMCF.createInstanceWithContext(
					"com.sun.star.frame.Desktop", xContext);
			XComponentLoader xCompLoader = (XComponentLoader) UnoRuntime
					.queryInterface(XComponentLoader.class, desktop);

			args = new String[] { "E:\\1.odt" };
			// args=new String[]{"private:factory/swriter"};
			String sUrl = args[0];
			if (sUrl.indexOf("private:") != 0) {
				java.io.File sourceFile = new java.io.File(args[0]);
				StringBuffer sbTmp = new StringBuffer("file:///");
				sbTmp.append(sourceFile.getCanonicalPath().replace('\\', '/'));
				sUrl = sbTmp.toString();
			}

			// Load a Writer document, which will be automaticly displayed
			com.sun.star.lang.XComponent xComp = xCompLoader
					.loadComponentFromURL(sUrl, "_blank", 0,
							new com.sun.star.beans.PropertyValue[0]);

			if (xComp != null) {
				mxDoc = (XTextDocument) UnoRuntime.queryInterface(
						XTextDocument.class, xComp);
				
				//XText mxDocText = mxDoc.getText();

				// 获取要插入标签的值
				Map contentMap = new HashMap();
				contentMap.put("projectName", "111");
				contentMap.put("projectCode", "22222");

				insertStrToBookMark(contentMap);

				// 表格数据
				String[][] tableValueArr = {
						{ "2017", "4000.00", "4000.00", "0.00", "0.00" },
						{ "合计", "4000.00", "4000.00", "0.00", "0.00" } };
				Map tableMap = new HashMap();
				tableMap = setTableValue(tableMap, "table1", true,
						tableValueArr);
				insertTable(tableMap);

			} else {
				System.exit(1);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * 
	 * @Description:插入字符串到word文件书签中;
	 * @Title: insertStrToBookMark
	 * @param @param contentMap
	 * @param @throws Exception 设定文件
	 * @return void 返回类型
	 * @throws
	 */
	public static void insertStrToBookMark(Map contentMap)
			throws Exception {
		try {
			XText mxDocText = mxDoc.getText();
			// 获取标签集合
			XBookmarksSupplier xBookmarksSupplier = (XBookmarksSupplier) UnoRuntime
					.queryInterface(XBookmarksSupplier.class, mxDoc);
			XNameAccess xNamedBookmarks = xBookmarksSupplier.getBookmarks();
			if (null == xNamedBookmarks) {
				return;
			}
			// 遍历标签集合,并在标签处插入相应的字符串
			for (String bookMark : xNamedBookmarks.getElementNames()) {
				// 判断是否包含要替换内容的书签
				if (contentMap.containsKey(bookMark)) {
					// 从书签位置处开始插入、删除或更改文字或属性
					XTextContent xTextContent = (XTextContent) UnoRuntime
							.queryInterface(XTextContent.class,
									xNamedBookmarks.getByName(bookMark));
					// 获取书签位置
					XTextCursor mxDocCursor = mxDocText
							.createTextCursorByRange(xTextContent.getAnchor());
					XSentenceCursor xSentenceCursor = (XSentenceCursor) UnoRuntime
							.queryInterface(XSentenceCursor.class, mxDocCursor);
					// 插入
					mxDocText.insertString(xSentenceCursor,
							contentMap.get(bookMark), true);
				}
			}
		} catch (Exception e) {
			logger.info("插入字符串到文档标签中出错", e);
		}
	}

	/**
	 * 
	 * @Description: 插入字表格到word文件中;
	 * @Title: insertTable
	 * @param @param mxDoc
	 * @param @param tableMap
	 * @param @throws Exception 设定文件
	 * @return void 返回类型
	 * @throws
	 */
	@SuppressWarnings("unchecked")
	public static void insertTable(Map tableMap) throws Exception {
		try {
			// 首先从文档中查询 XTextTablesSupplier 接口
			XTextTablesSupplier xTablesSupplier = (XTextTablesSupplier) UnoRuntime
					.queryInterface(XTextTablesSupplier.class, mxDoc);
			// 获取表格集合
			XNameAccess xNamedTables = xTablesSupplier.getTextTables();
			// 取表以及表数据 并赋值
			if (null == xNamedTables) {
				return;
			}
			for (String tableName : xNamedTables.getElementNames()) {
				if (tableMap.containsKey(tableName)) {
					XTextTable xTable = (XTextTable) UnoRuntime
							.queryInterface(XTextTable.class,
									xNamedTables.getByName(tableName));
					List> contenList = tableMap
							.get(tableName);
					if (!contenList.isEmpty() && contenList.size() > 1) {
						boolean isAddTr = (boolean) contenList.get(0).get(
								"isAddTr");
						// 获取表行
						XTableRows xRow = xTable.getRows();
						for (int i = 1; i < contenList.size(); i++) {
							Map m = contenList.get(i);
							// 插入列数据
							for (Map.Entry entry : (Set>) m
									.entrySet()) {
								System.out.println("map值" + entry.getKey()
										+ "  " + entry.getValue());
								XText xCellText = (XText) UnoRuntime
										.queryInterface(XText.class, xTable
												.getCellByName(entry.getKey()));
								xCellText
										.setString(entry.getValue().toString());
							}
							// 每行赋值增加一行数据
							if (isAddTr)
								xRow.insertByIndex(xRow.getCount(), 1);
						}
						// 删除最后一行的空白行
						if (isAddTr)
							xRow.removeByIndex(xRow.getCount() - 1, 1);
					}
				}
			}
		} catch (Exception e) {
			logger.info("插入表格到文档中出错", e);
		}
	}

	/**
	 * 
	 * @Description: 拼接表格数据
	 * @Title: setTableValue
	 * @param @param tableMap
	 * @param @param tableName
	 * @param @param isAddTr
	 * @param @param tableValueArr
	 * @param @return 设定文件
	 * @return Map 返回类型
	 * @throws
	 */
	public static Map setTableValue(Map tableMap,
			String tableName, boolean isAddTr, String[][] tableValueArr) {
		if (null == tableMap) {
			tableMap = new HashMap();
		}
		String[] cellName = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
				"K", "L", "M", "N" };
		List> tableContentList = new ArrayList>();
		Map tableContentMap = new HashMap();
		tableContentMap.put("isAddTr", isAddTr);
		tableContentList.add(tableContentMap);
		for (int i = 0; i < tableValueArr.length; i++) {
			tableContentMap = new HashMap();
			for (int j = 0; j < tableValueArr[i].length; j++) {
				tableContentMap.put(cellName[j] + (i + 2), tableValueArr[i][j]);
			}
			tableContentList.add(tableContentMap);
		}
		tableMap.put(tableName, tableContentList);

		return tableMap;
	}

}


运行效果:
    
    






评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值