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

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

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属性,再以键值对的方式存储起来,例如:

此时你的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.close();

msOfficeUtils.quit();

Jacob在sourceforge上的链接

Jsoup官网

MsOfficeGeneratorUtils

package com.to ps tar.test;

import java.io.File;

import java.io.IOException;

import java.util.List;

import com.jacob.activeX.ActiveXComponent;

import https://www.360docs.net/doc/c12200766.html,Thread;

import https://www.360docs.net/doc/c12200766.html,.Dispatch;

import https://www.360docs.net/doc/c12200766.html,.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;

/**

* select ion 代表当前活动文档窗口中的所选内容。如果文档中没有选中任何内容,则此对象代表插入点(即光标所在位置)。

* 每个文档窗口中只能存在一个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", new Variant(visible));

// 禁用宏

this.word.setProperty("AutomationSecurity", new Variant(3));

}

if (this.documents == null)

this.documents = word.getProperty("Documents").toDispatch();

}

/**

* 设置页面方向与页边距

*

* @param orientation

* 页面方向

*

    *

  • 0 横向
  • *

  • 1 纵向
  • *

* @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 || https://www.360docs.net/doc/c12200766.html,stIndexOf(".bmp") != -1 || https://www.360docs.net/doc/c12200766.html,stIndexOf(".jpg") != -1 || https://www.360docs.net/doc/c12200766.html,stIndexOf(".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

* 要写入的内容

* 注: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", strs[j]);

// 将插入点移动至下一??位置

}

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", 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

* 表格边框

*

    *

  • 0 无边框
  • *

  • 1 有边框
  • *

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

java创建txt文件并进行读写修改操作

java创建txt文件并进行读写修改操作 import java.io.*;/** * * 功能描述:创建TXT文件并进行读、写、修改操作* */ public class ReadWriteFile { public static BufferedReader bufread; //指定文件路径和名称 private static String path = "D:/suncity.txt"; private static File filename = new File(path); private static String readStr =""; /** * 创建文本文件. * @throws IOException * */ public static void creatTxtFile() throws IOException{ if (!filename.exists()) { filename.createNewFile(); System.err.println(filename + "已创建!"); }

} /** * 读取文本文件. * */ public static String readTxtFile(){ String read; FileReader fileread; try { fileread = new FileReader(filename); bufread = new BufferedReader(fileread); try { while ((read = bufread.readLine()) != null) { readStr = readStr + read+ "\r\n"; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block

如何能让Java生成复杂Word文档(1)

先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker 模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。 AD:客户要求用程序生成标准的word文档,要能打印,而且不能变形,以前用过很多解决方案,都在客户严格要求下牺牲的无比惨烈。 POI读word文档还行,写文档实在不敢恭维,复杂的样式很难控制不提,想象一下一个20多页,嵌套很多表格和图像的word文档靠POI来写代码输出,对程序员来说比去山西挖煤还惨,况且文档格式还经常变化。 iText操作Excel还行。对于复杂的大量的word也是噩梦。 直接通过JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。 Word从2003开始支持XML格式,用XML还做就很简单了。 大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml 翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。 看看实际效果 首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,图中红线的部分就是我要输出的部分:

将编辑好的文档另存为XML 再用Firstobject free XML editor将xml中我们需要填数据的地方打上FreeMarker标记

学习Java to Html

JavaToHtml 为了方便在blog中粘贴源代码,特意找了这方面的工具(本来琢磨自己写,可惜能力有限,再次受打击了~~~) JavaToHtml开源,Eclipse Plugin 大家都知道读源代码很累,读乱七八糟的源代码那就想吐了,所以格式化源代码还是很有必要的,不信看看下面的例子。 格式化后的漂亮效果: import java.util.Vector; public class Stack { private Vector content; public Stack() { content = new Vector(); } public void push(T t) { content.add(t); } public T peek() { if (content.size() == 0) { return null; } return content.get(content.size() - 1); } public T pop() { if (content.size() == 0) { return null; } return content.remove(content.size() - 1); } public int size() { return content.size(); } public String toString() { return content.toString();

} } 下面是原版的: import java.util.Vector; public class Stack { private Vector content; public Stack() { content = new Vector(); } public void push(T t) { content.add(t); } public T peek() { if (content.size() == 0) { return null; } return content.get(content.size() - 1); } public T pop() { if (content.size() == 0) { return null; } return content.remove(content.size() - 1); } public int size() { return content.size(); } public String toString() { return content.toString(); } } 更有甚者: package com.calculator.base;import java.util.Vector;public class Stack{ private Vectorcontent;public Stack(){content=new Vector();}public void push(T t){content.add(t);}public T peek(){if(content.size()==0){return null;} return content.get(content.size()-1);}public T pop(){if(content.size()==0){

java解析FSN文件

package action; import java.util.ArrayList; import tools.FsnTools; import bean.FsnBody; import bean.FsnModel; public class FsnReaderAction { public final static int intstep=2; //Uint16字节长度 public final static int stringstep=4; //Uint32字节长度 public final static int fsnHeadLengh=32;//fsn文件头字节长度 public final static int fsnPerBodyNoImg=100; //fsn文件体每条记录,不包括图像信息的字节长度 public final static int fsnPerBodyImg=1644; //fsn文件体每条记录,包括图像信息的字节长度 public int filePos=0; //fsn文件字节流当前指针位置 public FsnModel fm; //本实例解析的FsnMedel对象 public String fsnFilePath ;//FSN文件的存储完整路径,包括文件名 public FsnReaderAction(String filePath){ this.fsnFilePath=filePath; } public FsnModel readFsnFile() throws Exception { // FsnModel ret=null; try{ this.fm=new FsnModel(this.fsnFilePath); //hzyimport 把文件转成字节流数组 byte[] fsnbytes =FsnTools.toByteArray(this.fsnFilePath); this.fm.setSize(fsnbytes.length); System.out.println("File Lengh: "+fsnbytes.length); // 读取头文件 setHead(fsnbytes); long counter = this.fm.getCounter(); // 冠字号信息条数// System.out.println("this.fm.getHeadString()[2]="+this.fm.getHeadStr ing()[2]); int size = this.fm.getHeadString()[2] != 0x2D ? fsnPerBodyImg: fsnPerBodyNoImg; // System.out.println("this.fm.getHeadString()[2] ="+this.fm.getHeadString()[2] ); // System.out.println("counter ="+counter); // System.out.println("size="+size); // System.out.println("counter =* size"+counter * size); // System.out.println("fsnHeadLengh="+fsnHeadLengh);

Java生产WORD并下载到本地

1.为你的项目导入freeMarker包 我的项目是依靠maven来维护依赖的,所以引入很方便,只需要在pom文件中加入下面这个依赖就好 [html]view plain copy 1. 2.org.freemarker 3.freemarker 4.2.3.23 5. 如果还是比较传统的话,就像那个链接里的项目一样,把jar包导入项目吧 2.依据模板动态生成word文档,首先你得有个模板 模板是doc类型就好,注意不是docx,docx没有尝试,doc类型已经满足了我的需求,朋友们如果尝试成功了可以告诉我一下 test.doc,注意“产品品质证明书”是一张图片哦,图片会漂亮的留在生成的新文档中。将变量替换成${xxx}即可,这里只选了两 个变量 3.点击文件->另存为将test.doc保存为xml类型,即Word XML文档.xml类型,得到test.xml 4.用notepad或者sublime打开test.xml,你会发现${xxx}会被分割成 ${*********xxx********)的样子,将*******删除,保证它又成了完整的变量 标签,像这样

5.将文件已utf-8编码保存,另存为为.ftl,找不到该格式直接改文件后缀名就行,这样得到test.ftl 6.前台触发事件 我的项目是基于SpringMVC的,所以前台触发只需要在view层的文件里加个按钮事件即可,直接上代码 [javascript]view plain copy 1.function generateMillCertificate(id) {//点击下载按钮触发的事件 2. window.location.href = '../deliveryOrder/exportMillCertificate?id=' + id; 3. } 7.后台生成文件,并返回给客户的浏览器 这里又分为两步 a.controller层接收请求,根据参数拼凑数据,放在map中 [java]view plain copy 1./*** 2. * 导出Word材质单 3. * 4. * @return 5. * @throws Exception 6. */ 7.@RequestMapping(value = "exportMillCertificate", method = RequestMethod. GET) 8.@ResponseBody 9.public void exportMillCertificate(HttpServletRequest request, 10. HttpServletResponse response) throws Exception { 11.//获得数据,系统相关,就不展示了 12. Map map = new HashMap(); 13. map.put("customerShortName",deliveryOrder.getRepositoryName()); 14. map.put("productName",deliveryOrderDetail.getProductName()); 15. WordUtils.exportMillCertificateWord(request,response,map); 16. } b.工具类WordUtils利用传来的map和将要返回给用户的HTTPServletReponse,将map里的数据和模板中${xxx}标签对应的变量值填入, 生成新的文档,通过response返回给浏览器并提供用户下载 [java]view plain copy 1.public class WordUtils { 2.//配置信息,代码本身写的还是很可读的,就不过多注解了 3.private static Configuration configuration = null; 4.//这里注意的是利用WordUtils的类加载器动态获得模板文件的位置

将图片转成base64字符串并在JSP页面显示的Java代码

*本事例主要讲了如下几点: * 1:将图片转换为BASE64加密字符串. * 2:将图片流转换为BASE64加密字符串. * 3:将BASE64加密字符串转换为图片. * 4:在jsp文件中以引用的方式和BASE64加密字符串方式展示图片. 首先看工具类: import ; import ; import ; import ; import ; import ; import ; import ; import ; /** * @author IluckySi 1

* @since */ public class ImageUtil { private static BASE64Encoder encoder = new ; private static BASE64Decoder decoder = new ; /** * 将图片转换为BASE64加密字符串. * @param imagePath 图片路径. * @param format 图片格式. * @return */ public String convertImageToByte(String imagePath, String format) { File file = new File(imagePath); BufferedImage bi = null; ByteArrayOutputStream baos = null; String result = null;

try { bi = ImageIO.read(file); baos = new ByteArrayOutputStream(); ImageIO.write(bi, format == null ? "jpg" : format, baos); byte[] bytes = baos.toByteArray(); result = encoder.encodeBuffer(bytes).trim(); "将图片转换为BASE64加密字符串成功!"); } catch (IOException e) { "将图片转换为BASE64加密字符串失败: " + e); } finally { try { if(baos != null) { baos.close(); baos = null; } } catch (Exception e) { "关闭文件流发生异常: " + e); } 3

(完整word版)JAVA代码规范详细版

JAVA代码规范 本Java代码规范以SUN的标准Java代码规范为基础,为适应我们公司的实际需要,可能会做一些修改。本文档中没有说明的地方,请参看SUN Java标准代码规范。如果两边有冲突,以SUN Java标准为准。 1. 标识符命名规范 1.1 概述 标识符的命名力求做到统一、达意和简洁。 1.1.1 统一 统一是指,对于同一个概念,在程序中用同一种表示方法,比如对于供应商,既可以用supplier,也可以用provider,但是我们只能选定一个使用,至少在一个Java项目中保持统一。统一是作为重要的,如果对同一概念有不同的表示方法,会使代码混乱难以理解。即使不能取得好的名称,但是只要统一,阅读起来也不会太困难,因为阅读者只要理解一次。 1.1.2 达意 达意是指,标识符能准确的表达出它所代表的意义,比如:newSupplier, OrderPaymentGatewayService等;而supplier1, service2,idtts等则不是好的命名方式。准确有两成含义,一是正确,而是丰富。如果给一个代表供应商的变量起名是order,显然没有正确表达。同样的,supplier1, 远没有targetSupplier意义丰富。 1.1.3 简洁 简洁是指,在统一和达意的前提下,用尽量少的标识符。如果不能达意,宁愿不要简洁。比如:theOrderNameOfTheTargetSupplierWhichIsTransfered 太长,transferedTargetSupplierOrderName则较好,但是transTgtSplOrdNm就不好了。省略元音的缩写方式不要使用,我们的英语往往还没有好到看得懂奇怪的缩写。 1.1.4 骆驼法则 Java中,除了包名,静态常量等特殊情况,大部分情况下标识符使用骆驼法则,即单词之间不使用特殊符号分割,而是通过首字母大写来分割。比如: supplierName, addNewContract,而不是supplier_name, add_new_contract。

word域代码转换html丢失解决办法

. Word转html存在域代码丢失。 Aspose ,jacob,poi都无法解决 在使用jocob转换成html时域代码会被包裹 可以统一提取出来转换成latex ,latex转换成图片,解决word域代码丢失问题 private void processFormula(List nodes) throws UnsupportedEncodingException{ for(int i = nodes.size()-1;i>=0;i--){ Node node =nodes.get(i); if(node instanceof Element){ Element e = (Element)node; processFormula(e.childNodes()); }else if(node instanceof Comment){ String commentText = node.toString(); if(commentText.contains("内存内存的数据---->硬盘上把键盘的数据------->内存中 IO技术的应用场景: 导出报表,上传大头照、下载、解释xml文件 ... 数据保存到硬盘上,该数据就可以做到永久性的保存。数据一般是以文件的形式保存到硬盘上 sun使用了一个File类描述了文件或者文件夹的。 File类可以描述一个文件或者一个文件夹。 File类的构造方法: File(String pathname) 指定文件或者文件夹的路径创建一个File文件。 File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

File(String parent, String child) 目录分隔符:在windows机器上的目录分隔符是 \ ,在linux机器上的目录分隔符是/ . 注意:在windows上面\ 与 / 都可以使用作为目录分隔符。而且,如果写/ 的时候只需要写一个即可。 */ public class Demo1 { public static void main(String[] args) { //File file = new File("F:"+File.separator+"a.txt"); // 在linux机器上是不是一个合法路径??? File file = new File("F:/a.txt"); /*File parentFile = new File("F:\\"); File file = new File("F:\\","a.txt");*/ System.out.println("存在吗? "+ file.exists()); // exists 判断该文件是否存在,存在返回true,否则返回false。 // System.out.println("目录分隔符:"+ File.separator); } } package cn.itcast.file; import java.io.File;

java生成word文档

package com.sample; import java.awt.Color; import java.io.FileOutputStream; import java.io.IOException; import com.lowagie.text.Cell; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Element; import com.lowagie.text.Font; import com.lowagie.text.FontFactory; import com.lowagie.text.Image; import com.lowagie.text.PageSize; import com.lowagie.text.Paragraph; import com.lowagie.text.Phrase; import com.lowagie.text.Table; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.rtf.RtfWriter2; /** * * @author wangyanjun * @email bd_wyj@https://www.360docs.net/doc/c12200766.html, * @createDate Jun 12, 2008 */ public class CreateWordDemo { public void createDocContext(String file) throws DocumentException, IOException { // 设置纸张大小 Document document = new Document(PageSize.A4); // 建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中 RtfWriter2.getInstance(document, new FileOutputStream(file)); document.open(); // 设置中文字体 BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); // 标题字体风格 Font titleFont = new Font(bfChinese, 12, Font.BOLD); // 正文字体风格 Font contextFont = new Font(bfChinese, 10, Font.NORMAL); Paragraph title = new Paragraph("标题");

JAVA导出WORD与EXCEL

package ais.mytest.web; /** * 功能:主要实现数据导出Excel和Word功能* 日期:2008-2-28 */ import ais.basic.service.BasicUtil; import https://www.360docs.net/doc/c12200766.html,mons.file.service.FileService; import ais.framework.web.BaseAction; import ais.mytest.model.Employeer; import ais.mytest.service.IemployeerService; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.text.DecimalFormat; import jxl.write.NumberFormat; import java.util.List; import javax.servlet.ServletOutputStream; import jxl.Cell; import jxl.Workbook; import jxl.format.Alignment; import jxl.format.UnderlineStyle; import jxl.format.VerticalAlignment; import jxl.format.Border; import jxl.format.BorderLineStyle; import jxl.format.BoldStyle; import jxl.format.Colour; import jxl.write.Blank; import jxl.write.DateFormat; import jxl.write.DateTime; import https://www.360docs.net/doc/c12200766.html,bel; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableImage; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; //import com.ibm.icu.text.SimpleDateFormat; //import com.lowagie.text.Cell; import com.lowagie.text.Document; import com.lowagie.text.Font; import com.lowagie.text.Image;

相关文档
最新文档