java使用Jsoup组件生成word文档
先利用jsoup将得到的html代码“标准化”(jsoup.parse(string html))方法,然后利用filewiter将此html内容写到本地的template.doc文件中,此时如果文章中包含图片的话,template.doc就会依赖你的本地图片文件路径,如果你将图片更改一个名称或者将路径更改,再打开这个template.doc,图片就会显示不出来(出现一个叉叉)。为了解决此问题,利用jsoup组件循环遍历html文档的内容,将img元素替换成${image_自增值}的标识,取出img元素中的src属性,再以键值对的方式存储起来,例如:
map<integer,string> imgmap = new hashmap<integer,string>();
imgmap.put(1,”d:\lucene.png”);
此时你的html内容会变成如下格式:(举个示例)
<html>
<head></head>
<body>
<p>测试消息1</p>
<p>${image_1}<p>
<table>
<tr>
<td> <td>
</tr>
</table>
<p>测试消息2</p>
<a href=//www.jb51.net><p>${image_2}</p></a>
<p>测试消息3</p>
</body>
</html>
保存到本地文件以后,利用msofficegeneratorutils类(工具类详见下面,基于开源组件jacob)打开你保存的这个template.doc,调用replacetext2image,将上面代码的图片标识替换为图片,这样就消除了本地图片路径的问题。 然后再调用copy方法,复制整篇文档,关闭template.doc文件,新建一个doc文件(createdocument),调用 paste方法粘贴你刚复制的template.doc里的内容,保存。基本上就ok了。
关于copy整个word文档的内容,也会出现一个隐式问题。就是当复制的内容太多时,关闭word程序的时候,会谈出一个对话框,问你是否将复制的数据应用于其它的程序。对于这个问题解决方法很简单,你可以在调用 quit(退出word程序方法)之前,新建一篇文档,输入一行字,然后调用 copy方法,对于复制的数据比较少时,关闭word程序时,它不会提示你的。见如下代码
//复制一个内容比较少的*.doc文档,防止在关闭word程序时提示有大量的copy内容在内存中,是否应用于其它程序对话框,
msofficeutils.createnewdocument();
msofficeutils.inserttext("测试消息");
msofficeutils.copy();
msofficeutils.close();
msofficeutils.quit();
jacob在sourceforge上的链接
jsoup官网
msofficegeneratorutils
package com.topstar.test;
import java.io.file;
import java.io.ioexception;
import java.util.list;
import com.jacob.activex.activexcomponent;
import com.jacob.com.comthread;
import com.jacob.com.dispatch;
import com.jacob.com.variant;
/**
* 利用jacob对microsoft office word 进行相关操作
*
* @author xiaowu
* @category topstar
* @version 1.0
* @since 2011-12-5
*/
public class msofficegeneratorutils {
/**
* microsoft office word 程序对象
*/
private activexcomponent word = null;
/**
* word 活动文档对象
*/
private dispatch document = null;
/**
* 所有 word 文档对象
*/
private dispatch documents = null;
/**
* selection 代表当前活动文档窗口中的所选内容。如果文档中没有选中任何内容,则此对象代表插入点(即光标所在位置)。<br/>
* 每个文档窗口中只能存在一个selection对象,并且在整个应用程序中,只能存在一个活动的selection对象
*/
private dispatch selection = null;
/**
* range 对象代表文档中的一个连续的区域。每个range对象由一个起始字符位置与结束字符位置定义。<br/>
* range 对象独立于所选内容。你可以定义和处理一个范围而无需改变所选内容。还可以在文档中定义多个范围。但每个文档中只能有一个所选内容
*/
private dispatch range = null;
/**
* pagesetup 对象包含文档所有页面的设置属性(如纸张大小,左边距,下边距)
*/
private dispatch pagesetup = null;
/**
* 文档中的所有表格对象
*/
private dispatch tables = null;
/** 单个表格对象 */
private dispatch table = null;
/** 表格所有行对象 */
private dispatch rows = null;
/** 表格所有列对象 */
private dispatch cols = null;
/** 表格指定行对象 */
private dispatch row = null;
/** 表格指定列对象 */
private dispatch col = null;
/** 表格中指定的单元格 */
private dispatch cell = null;
/** 字体 */
private dispatch font = null;
/** 对齐方式 */
private dispatch alignment = null;
/**
* 构造方法
*
* @param visible
* 设置在生成word文档时,程序是否可见
*/
public msofficegeneratorutils(boolean visible) {
if (this.word == null) {
// 初始化microsoft office word 实例
this.word = new activexcomponent("word.application");
this.word.setproperty("visible", new variant(visible));
// 禁用宏
this.word.setproperty("automationsecurity", new variant(3));
}
if (this.documents == null)
this.documents = word.getproperty("documents").todispatch();
}
/**
* 设置页面方向与页边距
*
* @param orientation
* 页面方向
* <ul>
* <li>0 横向</li>
* <li>1 纵向</li>
* </ul>
* @param leftmargin
* 左边距
* @param rightmargin
* 右边距
* @param topmargin
* 上边距
* @param buttommargin
* 下边距
*/
public void setpagesetup(int orientation, int leftmargin, int rightmargin,
int topmargin, int buttommargin) {
if (this.pagesetup == null)
this.getpagesetup();
dispatch.put(pagesetup, "orientation", orientation);
dispatch.put(pagesetup, "leftmargin", leftmargin);
dispatch.put(pagesetup, "rightmargin", rightmargin);
dispatch.put(pagesetup, "topmargin", topmargin);
dispatch.put(pagesetup, "bottommargin", buttommargin);
}
/**
* 打开word文档
*
* @param docpath
* word文档路径
* @return 打开的文档对象
*/
public dispatch opendocument(string docpath) {
this.document = dispatch.call(documents, "open", docpath).todispatch();
this.getselection();
this.getrange();
this.getalignment();
this.getfont();
this.getpagesetup();
return this.document;
}
/**
* 创建一篇新文档
*
* @return 文档对象
*/
public dispatch createnewdocument() {
this.document = dispatch.call(documents, "add").todispatch();
this.getselection();
this.getrange();
this.getpagesetup();
this.getalignment();
this.getfont();
return this.document;
}
/**
* 获取选定的内容或插入点
*
* @return selection
*/
public dispatch getselection() {
this.selection = word.getproperty("selection").todispatch();
return this.selection;
}
/**
* 获取当前文档中可以修改的部分,前提是必须存在选中内容
*
* @return range
*/
public dispatch getrange() {
this.range = dispatch.get(this.selection, "range").todispatch();
return this.range;
}
/**
* 获得当前文档的页面属性
*/
public dispatch getpagesetup() {
if (this.document == null)
return this.pagesetup;
this.pagesetup = dispatch.get(this.document, "pagesetup").todispatch();
return this.pagesetup;
}
/**
* 把选中内容或插入点向上移动
*
* @param count
* 移动的距离
*/
public void moveup(int count) {
for (int i = 0; i < count; i++)
dispatch.call(this.selection, "moveup");
}
/**
* 把选中内容或插入点向下移动
*
* @param count
* 移动的距离
*/
public void movedown(int count) {
for (int i = 0; i < count; i++)
dispatch.call(this.selection, "movedown");
}
/**
* 把选中内容或插入点向左移动
*
* @param count
* 移动的距离
*/
public void moveleft(int count) {
for (int i = 0; i < count; i++)
dispatch.call(this.selection, "moveleft");
}
/**
* 把选中内容或插入点向右移动
*
* @param count
* 移动的距离
*/
public void moveright(int count) {
for (int i = 0; i < count; i++)
dispatch.call(this.selection, "moveright");
}
/**
* 执行硬换行(回车键)
*
* @param count
* 换行数
*/
public void enterdown(int count) {
for (int i = 0; i < count; i++)
dispatch.call(this.selection, "typeparagraph");
}
/**
* 把插入点移动到文件首位置
*/
public void movestart() {
dispatch.call(this.selection, "homekey", new variant(6));
}
/**
* 把插入点移动到文件末尾
*/
public void moveend() {
dispatch.call(selection, "endkey", new variant(6));
}
/**
* 从选定内容或插入点开始查找文本
*
* @param tofindtext
* 要查找的内容
* @return 查询到的内容并选中
*/
public boolean find(string tofindtext) {
// 从selection所在位置开始查询
dispatch find = dispatch.call(this.selection, "find").todispatch();
// 设置要查找的?热?br /> 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 newtext
* 要替换的内容
*/
public void replace(string newtext) {
// 设置替换文本
dispatch.put(this.selection, "text", newtext);
}
/**
* 全局替换
*
* @param oldtext
* 要替换的内容
* @param replaceobj
* 被替换的内容
*/
public void replaceall(string oldtext, object replaceobj) {
// 将插入点移到文件开头
movestart();
// 表格替换方式
string newtext = (string) replaceobj;
// 图片替换方式
if (oldtext.indexof("image") != -1 || newtext.lastindexof(".bmp") != -1 || newtext.lastindexof(".jpg") != -1 || newtext.lastindexof(".gif") != -1) {
while (find(oldtext)) {
insertimage(newtext);
dispatch.call(this.selection, "moveright");
}
// 文本方式
} else {
while (find(oldtext)) {
replace(newtext);
dispatch.call(this.selection, "moveright");
}
}
}
/**
* 将指定的内容替换成图片
* @param replacetext 指定的内容
* @param imgpath 图片路径
*/
public void replacetext2image(string replacetext,string imgpath){
movestart();
while(find(replacetext)){
insertimage(imgpath);
moveend();
enterdown(1);
}
}
/**
* 向当前插入点替换图片
*
* @param imagepath
* 图片的路径
*/
public void insertimage(string imagepath) {
dispatch.call(dispatch.get(selection, "inlineshapes").todispatch(), "addpicture", imagepath);
}
/**
* 合并单元格
*
* @param tableindex
* 表格下标,从1开始
* @param fstcellrowidx
* 开始行
* @param fstcellcolidx
* 开始列
* @param seccellrowidx
* 结束行
* @param seccellcolidx
* 结束列
*/
public void mergecell(int tableindex, int fstcellrowidx, int fstcellcolidx,
int seccellrowidx, int seccellcolidx) {
gettable(tableindex);
dispatch fstcell = dispatch.call(table, "cell",
new variant(fstcellrowidx), new variant(fstcellcolidx))
.todispatch();
dispatch seccell = dispatch.call(table, "cell",
new variant(seccellrowidx), new variant(seccellcolidx))
.todispatch();
dispatch.call(fstcell, "merge", seccell);
}
/**
* 拆分当前单元格
*
* @param numrows
* 拆分的行数,如果不想拆分行,请指定为1
* @param numcolumns
* 拆分的列数,如果不想拆分列,请指定为1
*/
public void splitcell(int numrows, int numcolumns) {
dispatch.call(this.cell, "split", new variant(numrows), new variant(
numcolumns));
}
/**
* 向表格中写入内容
*
* @param list
* 要写入的内容<br/>
* 注:list.size() 应该与表格的rows一致,string数组的length属性应与表格的columns一致
*/
public void inserttotable(list<string[]> list) {
if (list == null || list.size() <= 0)
return;
if (this.table == null)
return;
for (int i = 0; i < list.size(); i++) {
string[] strs = list.get(i);
for (int j = 0; j < strs.length; j++) {
// 遍历表格中每一??单元格,遍历次数所要填入的?热菔?肯嗤?br /> dispatch cell = this.getcell(i + 1, j + 1);
// 选中此单元格
dispatch.call(cell, "select");
// 写入?热莸酱说ピ?裰?br /> dispatch.put(this.selection, "text", strs[j]);
// 将插入点移动至下一??位置
}
this.movedown(1);
}
// 换行
this.enterdown(1);
}
/**
* 向当前插入点插入文本内容
*
* @param list
* 要插入的内容,list.size()代表行数
*/
public void inserttodocument(list<string> list) {
if (list == null || list.size() <= 0)
return;
if (this.document == null)
return;
for (string str : list) {
dispatch.put(this.selection, "text", str);
this.movedown(1);
this.enterdown(1);
}
}
/**
* 在当前插入点插入文本
*
* @param inserttext
* 要插入的文本
*/
public void inserttotext(string inserttext) {
dispatch.put(this.selection, "text", inserttext);
}
/**
* 在当前插入点插入字符串,利用此方法插入一行text后,word会默认选中它,如果再调用此方法,会将原来的内容覆盖掉,所以调用此方法后,记得调用moveright,将偏移量向右边移动一个位置 。
* @param newtext 要插入的新字符串
*/
public void inserttext(string newtext) {
dispatch.put(selection, "text", newtext);
}
/**
* 创建新的表格
*
* @param rowcount
* 行
* @param colcount
* 列
* @param width
* 表格边框
* <ul>
* <li>0 无边框</li>
* <li>1 有边框</li>
* </ul>
* @return 表格对象
*/
public dispatch createnewtable(int rowcount, int colcount, int width) {
if (this.tables == null)
this.gettables();
this.getrange();
if (rowcount > 0 && colcount > 0)
this.table = dispatch.call(this.tables, "add", this.range,
new variant(rowcount), new variant(colcount),
new variant(width)).todispatch();
return this.table;
}
/**
* 获取当前document对象中的所有表格对象
*
* @return tables
*/
public dispatch gettables() {
if (this.document == null)
return this.tables;
this.tables = dispatch.get(this.document, "tables").todispatch();
return this.tables;
}
/**
* 获取当前文档中的所有表格数量
*
* @return 表格数量
*/
public int gettablescount() {
if (this.tables == null)
this.gettables();
return dispatch.get(tables, "count").getint();
}
/**
* 根据索引获得table对象
*
* @param tableindex
* 索引
* @return table
*/
public dispatch gettable(int tableindex) {
if (this.tables == null)
this.gettables();
if (tableindex >= 0)
this.table = dispatch.call(this.tables, "item", new variant(tableindex)).todispatch();
return this.table;
}
/**
* 在指定的单元格里填写数据
*
* @param tableindex
* 表格索引
* @param cellrowidx
* 行索引
* @param cellcolidx
* 列索引
* @param txt
* 文本
*/
public void puttxttocell(int tableindex, int cellrowidx, int cellcolidx, string txt) {
gettable(tableindex);
getcell(cellrowidx, cellcolidx);
dispatch.call(this.cell, "select");
dispatch.put(this.selection, "text", txt);
}
/**
* 在当前文档末尾拷贝来自另一个文档中的段落
*
* @param anotherdocpath
* 另一个文档的磁盘路径
* @param tableindex
* 被拷贝的段落在另一格文档中的序号(从1开始)
*/
public void copyparagraphfromanotherdoc(string anotherdocpath, int paragraphindex) {
dispatch wordcontent = dispatch.get(this.document, "content").todispatch(); // 取得当前文档的内容
dispatch.call(wordcontent, "insertafter", "$selection$");// 插入特殊符定位插入点
copyparagraphfromanotherdoc(anotherdocpath, paragraphindex, "$selection$");
}
/**
* 在当前文档指定的位置拷贝来自另一个文档中的段落
*
* @param anotherdocpath
* 另一个文档的磁盘路径
* @param tableindex
* 被拷贝的段落在另一格文档中的序号(从1开始)
* @param pos
* 当前文档指定的位置
*/
public void copyparagraphfromanotherdoc(string anotherdocpath, int paragraphindex, string pos) {
dispatch doc2 = null;
try {
doc2 = dispatch.call(documents, "open", anotherdocpath).todispatch();
dispatch paragraphs = dispatch.get(doc2, "paragraphs").todispatch();
dispatch paragraph = dispatch.call(paragraphs, "item", new variant(paragraphindex)).todispatch();
dispatch range = dispatch.get(paragraph, "range").todispatch();
dispatch.call(range, "copy");
if (this.find(pos)) {
getrange();
dispatch.call(this.range, "paste");
}
} catch (exception e) {
e.printstacktrace();
} finally {
if (doc2 != null) {
dispatch.call(doc2, "close", new variant(true));
doc2 = null;
}
}
}
/**
* 在当前文档指定的位置拷贝来自另一个文档中的表格
*
* @param anotherdocpath
* 另一个文档的磁盘路径
* @param tableindex
* 被拷贝的表格在另一格文档中的序号(从1开始)
* @param pos
* 当前文档指定的位置
*/
public void copytablefromanotherdoc(string anotherdocpath, int tableindex,
string pos) {
dispatch doc2 = null;
try {
doc2 = dispatch.call(documents, "open", anotherdocpath)
.todispatch();
dispatch tables = dispatch.get(doc2, "tables").todispatch();
dispatch table = dispatch.call(tables, "item",
new variant(tableindex)).todispatch();
dispatch range = dispatch.get(table, "range").todispatch();
dispatch.call(range, "copy");
if (this.find(pos)) {
getrange();
dispatch.call(this.range, "paste");
}
} catch (exception e) {
e.printstacktrace();
} finally {
if (doc2 != null) {
dispatch.call(doc2, "close", new variant(true));
doc2 = null;
}
}
}
/**
* 在当前文档指定的位置拷贝来自另一个文档中的图片
*
* @param anotherdocpath
* 另一个文档的磁盘路径
* @param shapeindex
* 被拷贝的图片在另一格文档中的位置
* @param pos
* 当前文档指定的位置
*/
public void copyimagefromanotherdoc(string anotherdocpath, int shapeindex,
string pos) {
dispatch doc2 = null;
try {
doc2 = dispatch.call(documents, "open", anotherdocpath)
.todispatch();
dispatch shapes = dispatch.get(doc2, "inlineshapes").todispatch();
dispatch shape = dispatch.call(shapes, "item",
new variant(shapeindex)).todispatch();
dispatch imagerange = dispatch.get(shape, "range").todispatch();
dispatch.call(imagerange, "copy");
if (this.find(pos)) {
getrange();
dispatch.call(this.range, "paste");
}
} catch (exception e) {
e.printstacktrace();
} finally {
if (doc2 != null) {
dispatch.call(doc2, "close", new variant(true));
doc2 = null;
}
}
}
/**
* 在指定的表格的指定行前面增加行
*
* @param tableindex
* word文件中的第n张表(从1开始)
* @param rowindex
* 指定行的序号(从1开始)
*/
public void addtablerow(int tableindex, int rowindex) {
gettable(tableindex);
gettablerows();
gettablerow(rowindex);
dispatch.call(this.rows, "add", new variant(this.row));
}
/**
* 在第1行前增加一行
*
* @param tableindex
* word文档中的第n张表(从1开始)
*/
public void addfirsttablerow(int tableindex) {
gettable(tableindex);
gettablerows();
dispatch row = dispatch.get(rows, "first").todispatch();
dispatch.call(this.rows, "add", new variant(row));
}
/**
* 在最后1行前增加一行
*
* @param tableindex
* word文档中的第n张表(从1开始)
*/
public void addlasttablerow(int tableindex) {
gettable(tableindex);
gettablerows();
dispatch row = dispatch.get(this.rows, "last").todispatch();
dispatch.call(this.rows, "add", new variant(row));
}
/**
* 增加一行
*
* @param tableindex
* word文档中的第n张表(从1开始)
*/
public void addrow(int tableindex) {
gettable(tableindex);
gettablerows();
dispatch.call(this.rows, "add");
}
/**
* 增加一列
*
* @param tableindex
* word文档中的第n张表(从1开始)
*/
public void addcol(int tableindex) {
gettable(tableindex);
gettablecolumns();
dispatch.call(this.cols, "add").todispatch();
dispatch.call(this.cols, "autofit");
}
/**
* 在指定列前面增加表格的列
*
* @param tableindex
* word文档中的第n张表(从1开始)
* @param colindex
* 指定列的序号 (从1开始)
*/
public void addtablecol(int tableindex, int colindex) {
gettable(tableindex);
gettablecolumns();
gettablecolumn(colindex);
dispatch.call(this.cols, "add", this.col).todispatch();
dispatch.call(this.cols, "autofit");
}
/**
* 在第1列前增加一列
*
* @param tableindex
* word文档中的第n张表(从1开始)
*/
public void addfirsttablecol(int tableindex) {
gettable(tableindex);
dispatch cols = gettablecolumns();
dispatch col = dispatch.get(cols, "first").todispatch();
dispatch.call(cols, "add", col).todispatch();
dispatch.call(cols, "autofit");
}
/**
* 在最后一列前增加一列
*
* @param tableindex
* word文档中的第n张表(从1开始)
*/
public void addlasttablecol(int tableindex) {
gettable(tableindex);
dispatch cols = gettablecolumns();
dispatch col = dispatch.get(cols, "last").todispatch();
dispatch.call(cols, "add", col).todispatch();
dispatch.call(cols, "autofit");
}
/**
* 获取当前表格的列数
*
* @return 列总数
*/
public int gettablecolumnscount() {
if (this.table == null)
return 0;
return dispatch.get(this.cols, "count").getint();
}
/**
* 获取当前表格的行数
*
* @return 行总数
*/
public int gettablerowscount() {
if (this.table == null)
return 0;
return dispatch.get(this.rows, "count").getint();
}
/**
* 获取当前表格的所有列对象
*
* @return cols
*/
public dispatch gettablecolumns() {
if (this.table == null)
return this.cols;
this.cols = dispatch.get(this.table, "columns").todispatch();
return this.cols;
}
/**
* 获取当前表格的所有行对象
*
* @return rows
*/
public dispatch gettablerows() {
if (this.table == null)
return this.rows;
this.rows = dispatch.get(this.table, "rows").todispatch();
return this.rows;
}
/**
* 根据索引获得当前表格的列对象
*
* @param columnindex
* 列索引
* @return col
*/
public dispatch gettablecolumn(int columnindex) {
if (this.cols == null)
this.gettablecolumns();
if (columnindex >= 0)
this.col = dispatch.call(this.cols, "item",
new variant(columnindex)).todispatch();
return this.col;
}
/**
* 根据索引获得当前表格的行对象
*
* @param rowindex
* 行索引
* @return row
*/
public dispatch gettablerow(int rowindex) {
if (this.rows == null)
this.gettablerows();
if (rowindex >= 0)
this.row = dispatch.call(this.rows, "item", new variant(rowindex))
.todispatch();
return this.row;
}
/**
* 自动调整当前所有表格
*/
public void autofittable() {
int count = this.gettablescount();
for (int i = 0; i < count; i++) {
dispatch table = dispatch.call(tables, "item", new variant(i + 1))
.todispatch();
dispatch cols = dispatch.get(table, "columns").todispatch();
dispatch.call(cols, "autofit");
}
}
/**
* 根据行索引与列索引获取当前表格中的单元格
*
* @param cellrowidx
* 行索引
* @param cellcolidx
* 列索引
* @return cell对象
*/
public dispatch getcell(int cellrowidx, int cellcolidx) {
if (this.table == null)
return this.cell;
if (cellrowidx >= 0 && cellcolidx >= 0)
this.cell = dispatch.call(this.table, "cell",
new variant(cellrowidx), new variant(cellcolidx))
.todispatch();
return this.cell;
}
public void selectcell(int cellrowidx, int cellcolidx) {
if (this.table == null)
return;
getcell(cellrowidx, cellcolidx);
if (cellrowidx >= 0 && cellcolidx >= 0)
dispatch.call(this.cell, "select");
}
/**
* 设置当前文档的标题
*
* @param title 标题
* @param alignmenttype 对齐方式
* @see setalignment
*/
public void settitle(string title, int alignmenttype) {
if (title == null || "".equals(title))
return;
if (this.alignment == null)
this.getalignment();
if(alignmenttype != 0 && alignmenttype != 1 && alignmenttype != 2)
alignmenttype = 0;
dispatch.put(this.alignment, "alignment", alignmenttype);
dispatch.call(this.selection, "typetext", title);
}
/**
* 设置当前表格边框的粗细
*
* @param width
* 范围:1 < w < 13, 如果是0,就代表?]有框<br/>
*/
public void settableborderwidth(int width) {
if (this.table == null)
return;
/*
* 设置表格线的粗细 1:代表最上边一条线 2:代表最左边一条线 3:最下边一条线 4:最右边一条线 5:除最上边最下边之外的所有横线
* 6:除最左边最右边之外的所有竖线 7:从左上角到右下角的斜线 8:从左下角到右上角的斜线
*/
dispatch borders = dispatch.get(table, "borders").todispatch();
dispatch border = null;
for (int i = 1; i < 7; i++) {
border = dispatch.call(borders, "item", new variant(i))
.todispatch();
if (width != 0) {
dispatch.put(border, "linewidth", new variant(width));
dispatch.put(border, "visible", new variant(true));
} else if (width == 0) {
dispatch.put(border, "visible", new variant(false));
}
}
}
/**
* 得到指定的表格指定的单元格中的值
*
* @param tableindex
* 表格索引(从1开始)
* @param rowindex
* 行索引(从1开始)
* @param colindex
* 列索引(从1开始)
* @return
*/
public string gettxtfromcell(int tableindex, int rowindex, int colindex) {
string value = "";
// 设置为当前表格
gettable(tableindex);
getcell(rowindex, colindex);
if (cell != null) {
dispatch.call(cell, "select");
value = dispatch.get(selection, "text").tostring();
value = value.substring(0, value.length() - 2); // 去掉最后的回车符;
}
return value;
}
/**
* 对当前选中的内容设置项目符号与列表
*
* @param tabindex
* <ul>
* <li>1.项目编号</li>
* <li>2.编号</li>
* <li>3.多级编号</li>
* <li>4.列表样式</li>
* </ul>
* @param index
* 0表示没有,其它数字代表是该tab页中的第几项内容
*/
public void applylisttemplate(int tabindex, int index) {
// 取得listgalleries对象列表
dispatch listgalleries = dispatch.get(this.word, "listgalleries")
.todispatch();
// 取得列表中一个对象
dispatch listgallery = dispatch.call(listgalleries, "item",
new variant(tabindex)).todispatch();
dispatch listtemplates = dispatch.get(listgallery, "listtemplates")
.todispatch();
if (this.range == null)
this.getrange();
dispatch listformat = dispatch.get(this.range, "listformat")
.todispatch();
dispatch.call(listformat, "applylisttemplate",
dispatch.call(listtemplates, "item", new variant(index)),
new variant(true), new variant(1), new variant(0));
}
/**
* 增加文档目录
*/
public void addtablesofcontents() {
// 取得activedocument、tablesofcontents、range对象
dispatch activedocument = word.getproperty("activedocument")
.todispatch();
dispatch tablesofcontents = dispatch.get(activedocument,
"tablesofcontents").todispatch();
dispatch range = dispatch.get(this.selection, "range").todispatch();
// 增加目录
dispatch.call(tablesofcontents, "add", range, new variant(true),
new variant(1), new variant(3), new variant(true), new variant(
""), new variant(true), new variant(true));
}
/**
* 设置当前selection对齐方式
*
* @param alignmenttype
* <ul>
* <li>0.居左</li>
* <li>1.居中</li>
* <li>2.居右</li>
* </ul>
*/
public void setalignment(int alignmenttype) {
if (this.alignment == null)
this.getalignment();
dispatch.put(this.alignment, "alignment", alignmenttype);
}
/**
* 获取当前selection的对齐方式
*
* @return alignment
*/
public dispatch getalignment() {
if (this.selection == null)
this.getselection();
this.alignment = dispatch.get(this.selection, "paragraphformat")
.todispatch();
return this.alignment;
}
/**
* 获取字体对象
*
* @return font
*/
public dispatch getfont() {
if (this.selection == null)
this.getselection();
this.font = dispatch.get(this.selection, "font").todispatch();
return this.font;
}
/**
* 设置当前selection的字体
*
* @param fontname
* 字体名称,如“微软雅黑”
* @param isbold
* 是否粗体
* @param isitalic
* 是否斜体
* @param isunderline
* 是否下划线
* @param rgbcolor
* 颜色值"1,1,1,1"
* @param scale
* 字体间距
* @param fontsize
* 字体大小
*/
@deprecated
public void setfontscale(string fontname, boolean isbold, boolean isitalic,
boolean isunderline, string rgbcolor, int scale, int fontsize) {
dispatch.put(this.font, "name", fontname);
dispatch.put(this.font, "bold", isbold);
dispatch.put(this.font, "italic", isitalic);
dispatch.put(this.font, "underline", isunderline);
dispatch.put(this.font, "color", rgbcolor);
dispatch.put(this.font, "scaling", scale);
dispatch.put(this.font, "size", fontsize);
}
/**
* 设置当前选定内容的字体
* @param isbold 是否为粗体
* @param isitalic 是否为斜体
* @param isunderline 是否带下划线
* @param color rgb 字体颜色 例如:红色 255,0,0
* @param size 字体大小 12:小四 16:三号
* @param name 字体名称 例如:宋体,新宋体,楷体,隶书
*/
public void setfont(boolean isbold,boolean isitalic,boolean isunderline,string color,string size,string name) {
dispatch font = dispatch.get(getselection(), "font").todispatch();
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(!"".equals(color))
dispatch.put(font, "color", color);
dispatch.put(font, "size", size);
}
/**
* 保存文件
*
* @param outputpath
* 保存路径
*/
public void saveas(string outputpath) {
if (this.document == null)
return;
if (outputpath == null || "".equals(outputpath))
return;
dispatch.call(this.document, "saveas", outputpath);
}
/**
* 另存为html内容
*
* @param htmlfile
* html文件路径
*/
public void saveashtml(string htmlfile) {
dispatch.invoke(this.document, "saveas", dispatch.method, new object[] {
htmlfile, new variant(8) }, new int[1]);
}
/**
* saveformat | member name description 0 | wdformatdocument microsoft word
* format. 1 | wdformattemplate microsoft word template format. 2 |
* wdformattext microsoft windows text format. 3 | wdformattextlinebreaks
* microsoft windows text format with line breaks preserved. 4 |
* wdformatdostext microsoft dos text format. 5 | wdformatdostextlinebreaks
* microsoft dos text with line breaks preserved. 6 | wdformatrtf rich text
* format (rtf). 7 | wdformatencodedtext encoded text format. 7 |
* wdformatunicodetext unicode text format. 8 | wdformathtml standard html
* format. 9 | wdformatwebarchive web archive format. 10 |
* wdformatfilteredhtml filtered html format. 11 | wdformatxml extensible
* markup language (xml) format.
*/
/**
* 关闭当前word文档
*/
public void close() {
if (document == null)
return;
dispatch.call(document, "close", new variant(0));
}
/**
* 执行当前文档打印命令
*/
public void printfile() {
if (document == null)
return;
dispatch.call(document, "printout");
}
/**
* 退出microsoft office word程序
*/
public void quit() {
word.invoke("quit", new variant[0]);
comthread.release();
}
/**
* 选中整篇文档
*/
public void selectallcontent(){
dispatch.call(this.document,"select");
}
/**
* 复制整篇文档
* @param target
*/
public void copy(){
dispatch.call(this.document,"select");
dispatch.call(this.selection,"copy");
}
/**
* 在当前插入点位置粘贴选中的内容
*/
public void paste(){
dispatch.call(this.selection,"paste");
}
public static void main(string[] args) throws ioexception {
msofficegeneratorutils officeutils = new msofficegeneratorutils(true);
// officeutils.opendocument("d:\trs\trswcmv65hbtcis\tomcat\webapps\wcm\eipv65\briefreport\templates\zhengfa\头部.doc");
// officeutils.replaceall("${briefreport_year}", "2011");
// officeutils.replaceall("${briefreport_issue}", "3");
// file file = file.createtempfile("test", ".tmp");
// system.out.println(file.getabsolutepath());
// file.delete();
// file file = new file("c:\docume~1\admini~1\locals~1\temp\test5411720146039914615.tmp");
// system.out.println(file.exists());
officeutils.createnewdocument();
// officeutils.createnewtable(1, 1, 1);
// officeutils.inserttext("发表时间:2011-11-11");
// officeutils.moveright(1);
// officeutils.inserttext("t");
// officeutils.moveright(1);
// officeutils.inserttext("所在频道:宏观环境/社会环境");
// officeutils.moveright(1);
// officeutils.inserttext("t");
// officeutils.moveright(1);
// officeutils.inserttext("文章作者:杨叶茂");
// officeutils.moveright(1);
officeutils.inserttext("i'm chinese");
officeutils.moveright(1);
officeutils.enterdown(1);
officeutils.inserttext("i'm not chinese");
officeutils.moveright(1);
/* doc2 = dispatch.call(documents, "open", anotherdocpath).todispatch();
dispatch paragraphs = dispatch.get(doc2, "paragraphs").todispatch();
dispatch paragraph = dispatch.call(paragraphs, "item", new variant(paragraphindex)).todispatch();*/
// officeutils.setfontscale("微软雅黑", true, true, true, "1,1,1,1", 100,
// 18);
// officeutils.setalignment(1);
// officeutils.inserttotext("这是一个测试");
// officeutils.moveend();
// officeutils.setfontscale("微软雅黑", false, false, false, "1,1,1,1", 100,
// 18);
// officeutils.insertimage("d:\11.jpg");
// officeutils.enterdown(1);
// officeutils.inserttotext("这是我的照片");
// officeutils.enterdown(1);
// officeutils.createnewtable(3, 5, 1);
// list<string[]> list = new arraylist<string[]>();
// for (int i = 0; i < 3; i++) {
// string[] strs = new string[5];
// for (int j = 0; j < 5; j++) {
// strs[j] = j + i + "";
// }
// list.add(strs);
// }
// officeutils.inserttotable(list);
// officeutils.createnewtable(10, 10, 1);
// officeutils.moveend();
// officeutils.enterdown(1);
// officeutils.createnewtable(3,2,1);
// officeutils.mergecell(1, 1, 7, 1, 9);
// officeutils.mergecell(1, 2, 2, 3, 7);
// officeutils.mergecell(1, 3, 4, 9, 10);
// officeutils.inserttext("123");
// officeutils.getcell(1, 2);
// officeutils.splitcell(2 , 4);
// officeutils.selectcell(1, 2);
// officeutils.inserttext("split");
// officeutils.selectcell(1, 5);
// officeutils.inserttext("split1");
// officeutils.selectcell(1, 6);
// officeutils.inserttext("yy");
// officeutils.selectcell(2, 4);
// officeutils.inserttext("ltg");
// officeutils.saveas("d:\" + system.currenttimemillis() + ".doc");
// officeutils.close();
// officeutils.quit();
}
}
testjsoupcomponent
package com.topstar.test;
import java.io.file;
import java.io.filewriter;
import java.io.ioexception;
import java.util.arraylist;
import java.util.hashmap;
import java.util.list;
import java.util.map;
import java.util.map.entry;
import java.util.uuid;
import org.jsoup.jsoup;
import org.jsoup.nodes.document;
import org.jsoup.nodes.element;
import org.jsoup.nodes.node;
import com.eprobiti.trs.trsexception;
/** * 基本思路:得到html内容,因为是非标准的html内容,利用jsoup组件将读取出来的内容转换为标准的html文件内容,
* 然后遍历每个节点,找到img标签,记录其索引,再根据其文件名规则拼接出图片的物理路径,将其替换为${image_index}标识,而后将{索引,路径}
* 以键值对的方式丰入map中, 如
* "${image_1,d:lucene.png}"格式,然后利用jacob组件打开template.doc,选中整篇文档并复制,而后新建一篇文档,粘贴刚复制的内
* 容 查找图片标识位,将其替换为图片
*
* @since 2011-12-09
* @author xioawu
* @cateogry topstar
* @version 1.0
*/
public class testjsoupcomponent {
private static document document;
private static map<string, string> imgmap = new hashmap<string, string>(); //存放图片标识符及物理路径 i.e {"image_1","d:\lucene.png"};
private static list<string> files = new arraylist<string>(); //存入本地生成的各个文章doc的文件名
private static integer imgindex = 1; //图片标识
public static void main(string[] args) throws trsexception, ioexception {
msofficegeneratorutils officeutils = new msofficegeneratorutils(true); // 将生成过程设置为不可见
string html = "<html>.....</html>";// 得到正文内容 , 此处自己填写html内容
string header = "测试标题"; // 得到文章标题
document = jsoup.parse(html);
// system.out.println(document.html());
for (element element : document.body().select("body > *"))
// 递归遍历body下的所有直接子元素,找出img标签,@see syselementtext method
syselementtext(element);
file file = new file("d:" + file.separator + "template.doc");
file.createnewfile(); // 创建模板html
filewriter fw = new filewriter(file);
fw.write(document.html(), 0, document.html().length());// 写入文件
fw.flush(); // 清空filewriter缓冲区
fw.close();
officeutils.opendocument("d:\template.doc"); // 打开template.doc .由trsserver eipdocument库中的dochtmlcon生成的template.doc文件
officeutils.copy(); // 拷贝整篇文档
officeutils.close();
officeutils.createnewdocument();
officeutils.paste(); // 粘贴整篇文档
for (entry<string, string> entry : imgmap.entryset()) //循环将图片标识位替换成图片
officeutils.replacetext2image(entry.getkey(), entry.getvalue());
officeutils.movestart(); // 将插入点移动至word文档的最顶点
officeutils.setfont(true, false, false, "0,0,0", "20", "宋体"); // 设置字体,具体参数,自己看api
officeutils.settitle(header, 1); // 设置标题
officeutils.enterdown(1); // 设置一行回车
string filename = uuid.randomuuid().tostring();
files.add(filename); // 记录文件名,
officeutils.saveas("d:" + file.separator + filename + ".doc"); // 生成d:\uuid.doc文件,利用uuid防止同名
officeutils.close(); // 关闭office word创建的文档
officeutils.quit(); // 退出office word程序
msofficegeneratorutils msofficeutils = new msofficegeneratorutils(false); // 整合过程设置为可见
msofficeutils.createnewdocument();
msofficeutils.saveas("d:" + file.separator + "complete.doc");
msofficeutils.close();
for (string filename : files) {
msofficeutils.opendocument("d:" + file.separator + filename + ".doc");
msofficeutils.copy();
msofficeutils.close();
msofficeutils.opendocument("d:" + file.separator + "complete.doc");
msofficeutils.moveend();
msofficeutils.enterdown(1);
msofficeutils.paste();
msofficeutils.saveas("d:" + file.separator + "complete.doc");
msofficeutils.close();
}
//复制一个内容比较少的*.doc文档,防止在关闭word程序时提示有大量的copy内容在内存中,是否应用于其它程序对话框,
msofficeutils.createnewdocument();
msofficeutils.inserttext("测试消息");
msofficeutils.copy();
msofficeutils.close();
msofficeutils.quit();
imgindex = 1;
imgmap.clear();
}
public static void syselementtext(node node) {
if (node.childnodes().size() == 0) {
if (node.nodename().equals("img")) { // 处理图片路径问题
node.after("<p>${image_" + imgindex + "}</p>"); // 为img添加同级p标签,内容为<p>${image_imgindexnumber}</p>
string src = node.attr("src");
node.remove(); // 删除img标签。
stringbuffer imgurl = new stringbuffer("d:\trs\trswcmv65hbtcis\wcmdata\webpic\"); // 暂时将路径直接写死,正式应用上应将此处改写为webpic的配置项
imgurl.append(src.substring(0, 8)).append("\").append(src.subsequence(0, 10)).append("\").append(src);
// node.attr("src", imgurl.tostring()); //这一句没有必要,因为此img标签已经移除了
imgmap.put("${image_" + imgindex++ + "}", imgurl.tostring());
}
} else {
for (node rnode : node.childnodes()) {
syselementtext(rnode);
}
}
}
}
推荐阅读
-
java使用Jsoup组件生成word文档
-
java使用dom4j生成与解析xml文档的方法示例
-
Java 在 Word 文档中使用新文本替换指定文本
-
Java 在 Word 文档中使用新文本替换指定文本的方法
-
java使用dom4j生成与解析xml文档的方法示例
-
FreemarkerJavaDemo【Android将表单数据生成Word文档的方案之一(基于freemarker2.3.28,只能java生成)】
-
在Windows系统下使用PHP生成Word文档的教程
-
Java 在 Word 文档中使用新文本替换指定文本
-
Android使用模板生成支持手机直接查看的Word文档
-
Java使用freemarker导出带图片的word文档