- 浏览: 235961 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
annyliyear:
找到的ExtJS实现多选下拉框3个代码 -
yinboxian:
源码太乱了
JXTA中使用JxtaServerPipe和JxtaBiDiPipe实现双向可靠的通信 -
yinboxian:
我的peers第一次执行时可以得到正确的结果,以后就不行了。不 ...
JXTA中基于管道监听方式通信 -
cuizhenfu#gmail.com:
http://www.cnblogs.com/cuizhf
JXTA中使用JxtaServerPipe和JxtaBiDiPipe实现双向可靠的通信 -
luxing44530:
请问, jsp页面如果在 META-INF 中, 改怎么访问? ...
Servlet3.0 新特性之模块化实践
基于开源项目jacob的基础上,封装了操作Word常用的方法和接口。jacob项目是通过java操作com接口的工具,这部分代码是封装了操作word的常用com接口。需要配合jacob.dll和jacob.jar使用。
import java.io.File;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComFailException;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
final class WordBean {
/**
* 读取Com接口异常的最多重试次数.
*/
private static final int MAX_RETRY = 10;
/**
* word文档.
*/
private Dispatch doc;
/**
* word运行程序对象.
*/
private ActiveXComponent wordApp = null;
/**
* 选定的范围或插入点.
*/
private Dispatch selection;
/**
* 退出时是否保存文档.
*/
private boolean saveOnExit = true;
/**
* 构造函数.
* @param show 是否可见.
*/
public WordBean(final boolean show) {
if (wordApp == null) {
wordApp = new ActiveXComponent("Word.Application");
wordApp.setProperty("Visible", new Variant(show));
}
}
/**
* 设置退出时参数.
* @param b boolean true-退出时保存文件,false-退出时不保存文件
*/
public void setSaveOnExit(
final boolean b) {
this.saveOnExit = b;
}
/**
* 把选定的内容或插入点向上移动.
* @param pos 移动的距离
*/
public void moveUp(
final int pos) {
if (selection == null) {
selection = Dispatch.get(wordApp, "Selection").toDispatch();
}
for (int i = 0; i < pos; i++) {
Dispatch.call(selection, "MoveUp");
}
}
/**
* 把选定的内容或者插入点向下移动.
* @param pos 移动的距离
*/
public void moveDown(
final int pos) {
if (selection == null) {
selection = Dispatch.get(wordApp, "Selection").toDispatch();
}
for (int i = 0; i < pos; i++) {
Dispatch.call(selection, "MoveDown");
}
}
/**
* 把选定的内容或者插入点向左移动.
* @param pos 移动的距离
*/
public void moveLeft(
final int pos) {
if (selection == null) {
selection = Dispatch.get(wordApp, "Selection").toDispatch();
}
for (int i = 0; i < pos; i++) {
Dispatch.call(selection, "MoveLeft");
}
}
/**
* 把选定的内容或者插入点向右移动.
* @param pos 移动的距离
*/
public void moveRight(
final int pos) {
if (selection == null) {
selection = Dispatch.get(wordApp, "Selection").toDispatch();
}
for (int i = 0; i < pos; i++) {
Dispatch.call(selection, "MoveRight");
}
}
/**
* 把插入点移动到文件首位置.
*/
public void moveStart() {
if (selection == null) {
selection = Dispatch.get(wordApp, "Selection").toDispatch();
}
Dispatch.call(selection, "HomeKey", new Variant(6));
}
/**
* 把插入点移动到文件尾位置.
*/
public void moveEnd() {
if (selection == null) {
selection = Dispatch.get(wordApp, "Selection").toDispatch();
}
Dispatch.call(selection, "EndKey", new Variant(6));
}
/**
* 增加缩进.
* @param pos 缩进量
*/
public void listIndent(
final int pos) {
Dispatch range = Dispatch.get(this.selection, "Range").toDispatch();
Dispatch listFormat = Dispatch.get(range, "ListFormat").toDispatch();
for (int i = 0; i < pos; i++) {
Dispatch.call(listFormat, "ListIndent");
}
}
/**
* 减少缩进.
* @param pos 缩进量
*/
public void listOutdent(
final int pos) {
Dispatch range = Dispatch.get(this.selection, "Range").toDispatch();
Dispatch listFormat = Dispatch.get(range, "ListFormat").toDispatch();
for (int i = 0; i < pos; i++) {
Dispatch.call(listFormat, "ListOutdent");
}
}
/**
* 回车换行.
*/
public void enter() {
int index = 1;
while (true) {
try {
Dispatch.call(this.selection, "TypeParagraph");
break;
} catch (ComFailException e) {
if (index++ >= MAX_RETRY) {
throw e;
} else {
continue;
}
}
}
}
/**
* 插入一个换页符.
*/
public void insertPageBreak() {
Dispatch.call(this.selection, "InsertBreak", new Variant(2));
}
/**
* 设置word文档是否可见.
* @param isVisible 是否可见
*/
public void setIsVisible(
final boolean isVisible) {
wordApp.setProperty("Visible", new Variant(isVisible));
}
/**
* 判断文档是否存在.
* @param docName 文档名称.
* @return boolean 是否存在.
*/
private boolean isExist(
final String docName) {
boolean result = false;
File file = new File(docName);
result = file.exists();
file = null;
return result;
}
/**
* 获取文件名称.
* @param docName 文档路径.
* @return 文件名称
*/
public String getFileName(
final String docName) {
int pos = docName.lastIndexOf("\\");
return docName.substring(pos + 1);
}
/**
* 打开文档.
* @param docName 文档路径.
* @throws WordException 异常
*/
public void openDocument(
final String docName)
throws WordException {
Dispatch docs = wordApp.getProperty("Documents").toDispatch();
if (isExist(docName)) {
this.closeDocument();
doc = Dispatch.call(docs, "Open", docName).toDispatch();
} else {
wordApp.invoke("Quit", new Variant[] {});
new WordException("[Open doc failed]: file["
+ docName + "] isn't existed!");
}
selection = Dispatch.get(wordApp, "Selection").toDispatch();
}
/**
* 添加一个新文档.
* @param docName 文档路径.
* @throws WordException 异常
*/
public void newDocument(
final String docName)
throws WordException {
try {
Dispatch docs = wordApp.getProperty("Documents").toDispatch();
doc = Dispatch.call(docs, "Add").toDispatch();
selection = Dispatch.get(wordApp, "Selection").toDispatch();
} catch (com.jacob.com.ComFailException cfe) {
throw new WordException(cfe.getMessage());
} catch (com.jacob.com.ComException ce) {
throw new WordException(ce.getMessage());
}
}
/**
* 插入一段文字.
* @param textToInsert 文字
* @param style 样式
*/
public void insertText(
final String textToInsert,
final String style) {
Dispatch.put(selection, "Text", textToInsert);
Dispatch.put(selection, "Style", getOutlineStyle(style));
Dispatch.call(selection, "MoveRight");
}
/**
* 插入一个图片.
* @param imagePath 图片路径.
* @param style 图片样式
*/
public void insertImage(
final String imagePath,
final String style) {
Dispatch.call(Dispatch.get(selection, "InLineShapes")
.toDispatch(), "AddPicture", imagePath);
Dispatch.call(selection, "MoveRight");
Dispatch.put(selection, "Style", getOutlineStyle(style));
this.enter();
}
/**
* 获取对应名称的Style对象.
* @param style Style名称.
* @return Style对象
*/
public Variant getOutlineStyle(
final String style) {
int index = 1;
while (true) {
try {
return Dispatch.call(
Dispatch.get(this.doc, "Styles").toDispatch(),
"Item", new Variant(style));
} catch (ComFailException e) {
if (index++ >= MAX_RETRY) {
throw e;
} else {
continue;
}
}
}
}
/**
* 插入标题.
* @param text 标题文字.
* @param style 设置标题的类型
*/
public void insertOutline(
final String text,
final String style) {
this.insertText(text, style);
this.enter();
}
/**
* 插入目录.
* tablesOfContents的参数的含义 Add(Range As Range, [UseHeadingStyles],
* [UpperHeadingLevel], [LowerHeadingLevel], [UseFields], [TableID],
* --这两个要不要都可以 [RightAlignPageNumbers],[IncludePageNumbers], [AddedStyles],
* --这个参数必须有值,必须是数字,如果是其它,则报com.jacob.com.ComFailException
* [UseHyperlinks],[HidePageNumbersInWeb], [UseOutlineLevels])
*/
public void insertTablesOfContents() {
Dispatch tablesOfContents = Dispatch.get(this.doc, "TablesOfContents")
.toDispatch();
Dispatch range = Dispatch.get(this.selection, "Range").toDispatch();
// Dispatch.call中的参数最多是9个,如果超过9个,请用Dispatch.callN或者Dispathc.invoke
/*
* Dispatch.invoke(tablesOfContents, "Add", Dispatch.Method,new
* Object[]{range,new Variant(true),new Variant(1), new Variant(3),new
* Variant(true), new Variant(true),new Variant(true) ,new
* Variant("1"),new Variant(true),new Variant(true)},new int[10]);
*/
Dispatch.callN(tablesOfContents, "Add", new Object[] {
range,
new Variant(true),
new Variant(1),
new Variant(3),
new Variant(false),
new Variant(true),
new Variant(true),
new Variant("1"),
new Variant(true),
new Variant(true)});
}
/**
* 从选定内容或插入点开始查找文本.
* @param toFindText 要查找的文本
* @return boolean true-查找到并选中该文本,false-未查找到文本
*/
public boolean find(
final String toFindText) {
if (toFindText == null
|| toFindText.equals("")) {
return false;
}
// 从selection所在位置开始查询
Dispatch find = Dispatch.call(selection, "Find").toDispatch();
// 设置要查找的内容
Dispatch.put(find, "Text", toFindText);
// 向前查找
Dispatch.put(find, "Forward", "True");
// 设置格式
Dispatch.put(find, "Format", "True");
// 大小写匹配
Dispatch.put(find, "MatchCase", "True");
// 全字匹配
Dispatch.put(find, "MatchWholeWord", "True");
// 查找并选中
return Dispatch.call(find, "Execute").getBoolean();
}
/**
* 把选定选定内容设定为替换文本.
* @param toFindText 查找字符串
* @param newText 要替换的内容
* @return boolean true-查找到并选中该文本,false-未查找到文本
*/
public boolean replaceText(
final String toFindText,
final String newText) {
if (!find(toFindText)) {
return false;
}
Dispatch.put(selection, "Text", newText);
return true;
}
/**
* 创建表格.
* @param numCols 列数
* @param numRows 行数
* @param autoFormat 默认格式
* @return 表格对象
*/
public Dispatch createTable(
final int numRows,
final int numCols,
final int autoFormat) {
int index = 1;
while (true) {
try {
Dispatch tables = Dispatch.get(doc, "Tables").toDispatch();
Dispatch range = Dispatch.get(selection, "Range").toDispatch();
Dispatch newTable = Dispatch.call(tables, "Add", range,
new Variant(numRows),
new Variant(numCols)).toDispatch();
Dispatch.call(selection, "MoveRight");
Dispatch.call(newTable, "AutoFormat", new Variant(autoFormat));
return newTable;
} catch (ComFailException e) {
if (index++ >= MAX_RETRY) {
throw e;
} else {
continue;
}
}
}
}
/**
* 在指定的表头里填写数据.
* @param table 表格
* @param cellColIdx 列号
* @param txt 文字
* @param style 样式
*/
public void putTableHeader(
final Dispatch table,
final int cellColIdx,
final String txt,
final String style) {
Dispatch cell = Dispatch.call(table, "Cell", new Variant(1),
new Variant(cellColIdx)).toDispatch();
Dispatch.call(cell, "Select");
Dispatch.put(selection, "Text", txt);
Dispatch.put(this.selection, "Style", getOutlineStyle(style));
}
/**
* 在指定的单元格里填写数据.
* @param table 表格
* @param cellRowIdx 行号
* @param cellColIdx 列号
* @param txt 文字
* @param style 样式
*/
public void putTableCell(
final Dispatch table,
final int cellRowIdx,
final int cellColIdx,
final String txt,
final String style) {
Dispatch cell = Dispatch.call(table, "Cell", new Variant(cellRowIdx),
new Variant(cellColIdx)).toDispatch();
Dispatch.call(cell, "Select");
Dispatch.put(selection, "Text", txt);
Dispatch.put(this.selection, "Style", getOutlineStyle(style));
}
/**
* 关闭当前word文档.
*/
private void closeDocument() {
if (doc != null) {
Dispatch.call(doc, "Save");
Dispatch.call(doc, "Close", new Variant(saveOnExit));
doc = null;
}
}
/**
* 文件保存或另存为.
* @param savePath 保存或另存为路径
*/
public void saveFileAs(
final String savePath) {
Dispatch.call(doc, "SaveAs", savePath);
}
/**
* 关闭文档.
*/
public void close() {
closeDocument();
if (wordApp != null) {
Dispatch.call(wordApp, "Quit");
wordApp = null;
}
selection = null;
}
}
评论
发表评论
-
内存池的实现原理
2024-04-07 16:20 01、内存池的概念 内存池是一种用于管理内存分配和释放的技术 ... -
Java NIO - Buffer
2024-04-06 18:06 0Java NIO中的Buffer用于和NIO通道进行交互。数 ... -
Java NIO - Socket通道
2024-04-06 01:11 01、新的Socket通道类可 ... -
Maven打成Zip包
2013-11-13 17:06 10774如果当前项目是使用Maven管理,并且需要打成Zip,按平 ... -
sigar开发注意点
2013-11-13 16:50 3181<dependency> < ... -
asfasdfasdfasdf
2012-10-11 21:48 0request.setCharacterEncoding(&q ... -
java.lang.NoClassDefFoundError: javax/persistence/EntityListener
2010-12-30 16:08 0正确答案是:添加hibernate3.5.*/lib/jpa/ ... -
共享spket和axis教程
2010-11-26 22:04 1233共享spket和axis教程 -
Try/catch/finally的另一种写法
2010-05-28 21:26 1703从学习Java以来,只是知道try/catch/finally ... -
如何在Eclipse安装反编译工具jad插件
2010-05-01 00:59 32981,将net.sf.jadclipse_3.3.0.jar拷贝 ... -
二分搜寻法(搜寻原则的代表)
2010-04-15 15:42 869如果搜寻的数列已经有排序,应该尽量利用它们已排序的特性,以减少 ... -
如何提高自己的Java编程水平
2010-04-09 00:21 117111. 扎实的基础。数 ... -
把多个任务分派给多个线程去执行
2010-03-28 17:38 2073要把多个任务分派给Java的多个线程去执行,这其中就会有一个任 ... -
剑客vs刀客 Java vs .NET之飘逸的Java
2010-03-28 11:42 713剑,一把好剑,重三两三分,轻如蝉翼,千年寒冰所铸,剑身咖啡色, ... -
Log4j基本使用方法
2010-03-28 10:57 816Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输 ... -
Java GUI 三态导航树
2010-03-27 19:48 19331 通过Java Swing实现的一个三态树组件,包括选择、去 ... -
Directory Chooser API
2010-03-26 23:42 907Java swing provides File choose ... -
[Java]双缓冲技术
2010-03-25 00:59 4389我们很多用Java中的g.drawImage()方法导入图像时 ... -
Java String转Date
2010-03-06 08:37 951Date date = new Date();String s ... -
利用Transaction ProxyFactoryBean 生成事务代理
2010-03-06 08:36 1301采用这种方式的配置时,其配置文件的增加非常快,每个bean 有 ...
相关推荐
在Java操作Word的场景下,我们可以利用Jacob调用Microsoft Word的COM接口,实现对Word文档的各种操作,如读取、写入、修改、保存等。 标题中的“工具类级”意味着我们需要创建一个Java类,这个类将封装Jacob库的...
另一方面,Office_Wrapper是一个更高级的封装库,它基于JACOB或其他COM桥接技术,但提供了一种更简洁、更易于使用的API来操作Word文档。使用Office_Wrapper,你可以更直观地创建、读取、编辑和格式化Word文档,而...
"Java通过word模板配置书签生成word"是一个技术方案,它利用了Java的API来处理Microsoft Word文档,特别是Apache POI库,这是一种强大的工具,允许开发者在Java程序中创建、修改和展示MS Office格式的文件。...
1. **Hutool的Word工具类**:这是一个简洁易用的Java工具库,其提供的Word工具类可以方便地生成简单的Word文档。然而,它的局限在于无法创建包含复杂表格的文档。 2. **Apache POI和FreeMarker**:Apache POI是Java...
`Java2Word.jar`则是主要的Java库,它封装了对Word文档的操作接口和逻辑。通过这个库,开发者可以避免直接处理复杂的COM接口,而是使用Java API来创建和编辑Word文档。它支持添加文本、图片、表格、列表、页眉、页脚...
这个“JAVA生成WORD工具类”提供了一种解决方案,使得开发者可以通过代码动态地生成Word文档,避免手动操作的繁琐和错误。下面将详细介绍这个工具类的工作原理和可能的应用场景。 首先,Java生成Word文档通常涉及到...
java中生成word文件,生成固定文件模板的word文件 封装成工具类,可以更方便的实现需求
Java Word POI Demo是一个关于如何使用Java编程语言和Apache POI库来操作Microsoft Word文档的示例项目。Apache POI是开源项目,专门用于读取、写入和修改Microsoft Office格式的文件,包括Word(.doc和.docx)、...
为了方便地使用Java操作Word文档,可以使用Jacob官方提供的`MSWordManager`类。这个类封装了大多数Java操作Microsoft Office的功能,使得开发者能够更加简单高效地完成任务。 #### 示例代码 以下是一个简化的Java...
POI提供了HWPF(用于老版本的.doc)和XWPF(用于.docx)API,可以创建、修改和显示Word文档内容。 - **PDF解析**:iText或Apache PDFBox是常用的PDF处理库,可以用于读取、创建、修改PDF文档。 - **Excel解析**:...
Apache POI是一个流行的API,用于读写Microsoft Office格式的文件,包括Word文档。首先,你需要加载.dot模板,然后使用Freemarker的API替换模板中的变量,最后保存为.doc文件。 3. **处理Word2007模板(.dotx)**:...
在这个实例中,我们主要会用到它的`XWPFDocument`和`XWPFParagraph`等类来操作Word文档。 以下是实现该功能的基本步骤: 1. **创建或打开Word模板**:使用`XWPFDocument`类创建一个新的Word文档,或者通过`...
这份"java题库word文档"包含了关于Java的综合习题,旨在帮助学习者深入理解和掌握Java的核心概念和技术。以下是对这些习题中可能涵盖的知识点的详细解释: 1. **Java基础知识**:这包括Java的历史、设计原则、JVM...
这个库是用Java语言封装的ActiveX接口,使得开发者能够在Java环境中调用和控制Word的功能,如创建、修改、读取和格式化Word文档。在本文中,我们将深入探讨如何使用Jacob在Word文档中插入其他文档。 首先,理解Java...
综上所述,"javaword文档导出jar包freemarker"提供了一种高效、灵活的方法,使Java开发者能够在后端生成动态的Word文档,无需直接操作前端。这个过程涉及到Freemarker模板引擎的使用、Java后端的数据处理、以及可能...
首先,我们需要引入一个能够处理Word文档的库,Apache POI是Java社区广泛使用的开源库,它可以让我们轻松地创建、修改和读取Microsoft Office格式的文件,包括Word(.doc和.docx)。 1. **Apache POI简介**: ...
在Java开发中,有时我们需要将Word文档转换为PDF格式,以满足不同的应用场景或者跨平台兼容的需求。Apache POI是一个流行的库,主要用于处理Microsoft Office格式的文件,如Word(.doc/.docx)和Excel(.xls/.xlsx)...
Apache POI是一个流行的Java库,它允许开发者创建、修改和显示Microsoft Office格式的文件,包括Word文档。 首先,你需要理解Apache POI的工作原理。Apache POI提供了一组API,可以用来操作Word文档的各个元素,如...