您的当前位置:首页java html内容生成word文件实现代码

java html内容生成word文件实现代码

2022-06-19 来源:乌哈旅游
java html内容生成word文件实现代码

处理HTML标签我用的是Jsoup组件,生成word文档这方面我用的是Jacob组件。有兴趣的朋友可以去Google搜索一下这两个组件。大致思路如下:

先利用jsoup将得到的html代码“标准化”(Jsoup.parse(String html))方法,然后利用FileWiter将此html内容写到本地的template.doc文件中,此时如果文章中包含图片的话,template.doc就会依赖你的本地图片文件路径,如果你将图片更改一个名称或者将路径更改,再打开这个template.doc,图片就会显示不出来(出现一个叉叉)。为了解决此问题,利用jsoup组件循环遍历html文档的内容,将img元素替换成${image_自增值}的标识,取出img元素中的src属性,再以键值对的方式存储起来,例如:

代码如下 复制代码 Map imgMap = new HashMap(); imgMap.put(1,”D:\\lucene.png”);

此时你的html内容会变成如下格式:(举个示例)

代码如下 复制代码

测试消息1

${image_1}

测试消息2

${image_2}

测试消息3

保存到本地文件以后,利用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 代表当前活动文档窗口中的所选内容。如果文档中没有选中任何内容,则此对象代表插入点(即光标所在位置)。
* 每个文档窗口中只能存在一个selection对象,并且在整个应用程序中,只能存在一个活动的selection对象 */

private Dispatch selection = null; /**

* range 对象代表文档中的一个连续的区域。每个range对象由一个起始字符位置与结束字符位置定义。

* 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\ // 禁用宏

this.word.setProperty(\"AutomationSecurity\ }

if (this.documents == null)

this.documents = word.getProperty(\"Documents\").toDispatch(); } /**

* 设置页面方向与页边距 *

* @param orientation

* 页面方向 *

* @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\ Dispatch.put(pageSetup, \"LeftMargin\ Dispatch.put(pageSetup, \"RightMargin\ Dispatch.put(pageSetup, \"TopMargin\ Dispatch.put(pageSetup, \"BottomMargin\ } /**

* 打开word文档 *

* @param docPath

* word文档路径 * @return 打开的文档对象 */

public Dispatch openDocument(String docPath) {

this.document = Dispatch.call(documents, \"Open\ 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\ } /**

* 把插入点移动到文件末尾 */

public void moveEnd() {

Dispatch.call(selection, \"EndKey\ } /**

* 从选定内容或插入点开始查找文本 *

* @param toFindText

* 要查找的内容 * @return 查询到的内容并选中 */

public boolean find(String toFindText) { // 从selection所在位置开始查询

Dispatch find = Dispatch.call(this.selection, \"Find\").toDispatch(); // 设置要查找的?热?br /> Dispatch.put(find, \"Text\ // 向前查找

Dispatch.put(find, \"Forward\ // 设置格式

Dispatch.put(find, \"Format\ // 大小写匹配

Dispatch.put(find, \"MatchCase\ // 全字匹配

Dispatch.put(find, \"MatchWholeWord\ // 查找并选中

return Dispatch.call(find, \"Execute\").getBoolean(); } /**

* 替换选定的内容 *

* @param newText

* 要替换的内容 */

public void replace(String newText) { // 设置替换文本

Dispatch.put(this.selection, \"Text\ } /**

* 全局替换 *

* @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\ } /**

* 合并单元格 *

* @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\ } /**

* 拆分当前单元格 *

* @param numRows

* 拆分的行数,如果不想拆分行,请指定为1 * @param numColumns

* 拆分的列数,如果不想拆分列,请指定为1 */

public void splitCell(int numRows, int numColumns) {

Dispatch.call(this.cell, \"Split\

numColumns)); } /**

* 向表格中写入内容 *

* @param list

* 要写入的内容

* 注:list.size() 应该与表格的rows一致,String数组的length属性应与表格的columns一致 */

public void insertToTable(List 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\ // 将插入点移动至下一??位置 }

this.moveDown(1); } // 换行

this.enterDown(1); } /**

* 向当前插入点插入文本内容 *

* @param list

* 要插入的内容,list.size()代表行数 */

public void insertToDocument(List list) { if (list == null || list.size() <= 0) return;

if (this.document == null) return;

for (String str : list) {

Dispatch.put(this.selection, \"Text\ this.moveDown(1); this.enterDown(1); }

} /**

* 在当前插入点插入文本 *

* @param insertText

* 要插入的文本 */

public void insertToText(String insertText) { Dispatch.put(this.selection, \"Text\ } /**

* 在当前插入点插入字符串,利用此方法插入一行text后,Word会默认选中它,如果再调用此方法,会将原来的内容覆盖掉,所以调用此方法后,记得调用moveRight,将偏移量向右边移动一个位置 。 * @param newText 要插入的新字符串 */

public void insertText(String newText) { Dispatch.put(selection, \"Text\ } /**

* 创建新的表格 *

* @param rowCount

* 行 * @param colCount

* 列 * @param width

* 表格边框 *

* @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\ 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\ 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\ } /**

* 在当前文档末尾拷贝来自另一个文档中的段落 *

* @param anotherDocPath

* 另一个文档的磁盘路径 * @param tableIndex

* 被拷贝的段落在另一格文档中的序号(从1开始) */

public void copyParagraphFromAnotherDoc(String anotherDocPath, int paragraphIndex) {

Dispatch wordContent = Dispatch.get(this.document, \"Content\").toDispatch(); // 取得当前文档的内容 Dispatch.call(wordContent, \"InsertAfter\插入特殊符定位插入点 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\ Dispatch paragraphs = Dispatch.get(doc2, \"Paragraphs\").toDispatch();

Dispatch paragraph = Dispatch.call(paragraphs, \"Item\ 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\ 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\ .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\ 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\ .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\ 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\ } /**

* 在第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\ } /**

* 在最后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\ } /**

* 增加一行 *

* @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\ 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\ 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\

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\ .toDispatch(); return this.row; } /**

* 自动调整当前所有表格 */

public void autoFitTable() {

int count = this.getTablesCount(); for (int i = 0; i < count; i++) {

Dispatch table = Dispatch.call(tables, \"Item\ .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\ Dispatch.call(this.selection, \"TypeText\ } /**

* 设置当前表格边框的粗细 *

* @param width

* 范围:1 < w < 13, 如果是0,就代表?]有框
*/

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\ .toDispatch(); if (width != 0) {

Dispatch.put(border, \"LineWidth\ Dispatch.put(border, \"Visible\ } else if (width == 0) {

Dispatch.put(border, \"Visible\ } } } /**

* 得到指定的表格指定的单元格中的值 *

* @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

*

* @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(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\ new Variant(1), new Variant(3), new Variant(true), new Variant(

\"\"), new Variant(true), new Variant(true)); } /**

* 设置当前selection对齐方式 *

* @param alignmentType *

*/

public void setAlignment(int alignmentType) { if (this.alignment == null) this.getAlignment();

Dispatch.put(this.alignment, \"Alignment\ } /**

* 获取当前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\ Dispatch.put(this.font, \"Bold\ Dispatch.put(this.font, \"Italic\ Dispatch.put(this.font, \"Underline\ Dispatch.put(this.font, \"Color\ Dispatch.put(this.font, \"Scaling\ Dispatch.put(this.font, \"Size\ } /**

* 设置当前选定内容的字体 * @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\ Dispatch.put(font, \"Bold\ Dispatch.put(font, \"Italic\ Dispatch.put(font, \"Underline\ if(!\"\".equals(color))

Dispatch.put(font, \"Color\

Dispatch.put(font, \"Size\ } /**

* 保存文件 *

* @param outputPath

* 保存路径 */

public void saveAs(String outputPath) { if (this.document == null) return;

if (outputPath == null || \"\".equals(outputPath)) return;

Dispatch.call(this.document, \"SaveAs\ } /**

* 另存为HTML内容 *

* @param htmlFile

* html文件路径 */

public void saveAsHtml(String htmlFile) {

Dispatch.invoke(this.document, \"SaveAs\ 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\ } /**

* 执行当前文档打印命令 */

public void printFile() { if (document == null) return;

Dispatch.call(document, \"PrintOut\"); } /**

* 退出Microsoft Office Word程序 */

public void quit() {

word.invoke(\"Quit\ 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\emplates\\zhengfa\\头部.doc\"); // officeUtils.replaceAll(\"${briefreport_year}\// officeUtils.replaceAll(\"${briefreport_issue}\// File file = File.createTempFile(\"test\// System.out.println(file.getAbsolutePath()); // file.delete();

// File file = new File(\"C:\\DOCUME~1\\ADMINI~1\\LOCALS~1\\Temp\est5411720146039914615.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\ Dispatch paragraphs = Dispatch.get(doc2, \"Paragraphs\").toDispatch();

Dispatch paragraph = Dispatch.call(paragraphs, \"Item\

// officeUtils.setFontScale(\"微软雅黑\ // 18);

// officeUtils.setAlignment(1);

// officeUtils.insertToText(\"这是一个测试\"); // officeUtils.moveEnd();

// officeUtils.setFontScale(\"微软雅黑\ // 18);

// officeUtils.insertImage(\"d:\\11.jpg\"); // officeUtils.enterDown(1);

// officeUtils.insertToText(\"这是我的照片\"); // officeUtils.enterDown(1);

// officeUtils.createNewTable(3, 5, 1);

// List list = new ArrayList(); // 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 imgMap = new HashMap(); //存放图片标识符及物理路径 i.e {\"image_1\ private static List files = new ArrayList(); //存入本地生成的各个文章doc的文件名 private static Integer imgIndex = 1; //图片标识

public static void main(String[] args) throws TRSException, IOException {

MSOfficeGeneratorUtils officeUtils = new MSOfficeGeneratorUtils(true); // 将生成过程设置为不可见

String 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:\emplate.doc\"); // 打开template.doc .由trsserver eipdocument库中的dochtmlcon生成的template.doc文件 officeUtils.copy(); // 拷贝整篇文档 officeUtils.close();

officeUtils.createNewDocument(); officeUtils.paste(); // 粘贴整篇文档

for (Entry entry : imgMap.entrySet()) //循环将图片标识位替换成图片 officeUtils.replaceText2Image(entry.getKey(), entry.getValue()); officeUtils.moveStart(); // 将插入点移动至Word文档的最顶点

officeUtils.setFont(true, false, false, \"0,0,0\宋体\"); // 设置字体,具体参数,自己看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(\"

${image_\" + imgIndex + \为img添加同级P标签,内容为

${image_imgIndexNumber}

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\这一句没有必要,因为此img标签已经移除了 imgMap.put(\"${image_\" + imgIndex++ + \ }

} else {

for (Node rNode : node.childNodes()) { sysElementText(rNode); } } } }

因篇幅问题不能全部显示,请点此查看更多更全内容