Java生成Word文档目录?1. **创建文档:** 首先,创建一个`XWPFDocument`对象表示Word文档。2. **添加内容:** 向文档中添加正文内容,包括需要在目录中显示的标题和文本。3. **添加目录:** 在文档的开头或结尾添加一个包含目录的段落。4. **插入** 为每个需要在目录中显示的标题添加一个超链接。那么,Java生成Word文档目录?一起来了解一下吧。
public static void outputString1(String str, File file) {
try {
out = new PrintWriter(file);
byte bytes[] = str.getBytes();
int i = 0;
while ((bytes.length - i) != 0) {
out.write(bytes[i]);
i++;
}
out.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
* @param str
*要写入文件的字符串
* @param file
*要写入字符串的文件名,如new File("C:/test.doc")
首先是action的createDoc方法:
[java]
/**
* 通过HttpCient调用报告服务器的方法生成报告 DOC
*/
public String createDoc() throws Exception {
//定义放回成功与否的判断码
String prMsg="";
// 获取当前登录的用户
UserVo userVo = CommonUtils.getUserMessage();
//获取模版类型
docType = Struts2Utils.getParameter("docType");
//重新创建文档
String creatOrnot = Struts2Utils.getParameter("creatOrnot");
//获取组组编号参数
workgroupId = Struts2Utils.getParameter("workgroupId");
//获取评估用例实例ID参数
evtcaseInstId = Struts2Utils.getParameter("evtcaseInstId");
if(CommonUtils.isNotNull(docType)){
//获取项目Id
projectId = Struts2Utils.getParameter("projectId");
if(!CommonUtils.isNotNull(projectId)){
if(CommonUtils.isNotNull(this.getIdFromSession("PM_PROJECTID"))){
projectId = this.getIdFromSession("PM_PROJECTID").toString();
}else{
Struts2Utils.getRequest().setAttribute("msg", "请先选择项目!");
}
}
if(CommonUtils.isNotNull(projectId)){
prMsg = infoSystemDescService.downloadFileByUrl(projectId, userVo.getUserId(), workgroupId, evtcaseInstId, docType, creatOrnot);
}
}
return "docList";
}
注:在我贴出来的代码中,能看懂就行了,有些不用管他(可能是其他业务方面的判断),关于最后返回的prMsg---代表各种状态 主要表示成功与否或者是出错的信息。
一 准备工作
先了解一下概念 JACOB 就是 JAVA Bridge的缩写 提供自动化的访问的功能 也是通过JNI功能访问windows平台下的组件或者win 系统库的 这是一个开始于 年的开源项目的成果 有很多使用者对该项目进行了修改 做出了自己的贡献
Jacob下载地址 ?group_id= &package_id=
我在这里下载了Jacob 和jacob 的版本两个版本
这里下载的是目前最新的Jacob 的Release版
另外java操作word方式还有(个人认为通过jacob最好 自己可以扩展 网上除poi之外几乎全是java 技术实现的):
( ):Apache POI Java API To Access Microsoft Format Files();对word处理不够强处理Excel功能可以 但是全是通过java完成的 不需 要组件支持;
( ):java word 是一个在java程序中调用 MS Office Word 文档的组件(类库) 该组件提供了一组简单的接口 以便java程序调用他的服务操作Word 文档 (好象也是用的java 技术);
( )web开发语言操作word的功能最好还是用第三方的控件 看看这个SOAOFFICE 还可以使用js 写VBA呢
二 安装Jacob
Jacob的安装非常的简单 我们解开下载的jacob_ zip 在文件夹中找到jacob dll和jacob jar两个文件 如果是 Jacob 则是jacob x dll( 位 机和jacob x dll( 位)和 jacob jar两个文件 Jacob dll直接放到系统的system 文件夹下就行了 连注册都不用的(或者拷贝到jdk或者jre的bin目 录下也行 当前测试文件所在的目录也行 就是只要在java library path中就可以) 而jacob jar设置到classpath中去就 可以了 或者在IDE开发环境的工程中设置扩展库也一样的 我是这样使用的将jacob x dll或复制 到%Tomcat %\bin目录下将jacob jar复制到%Tomcot %\Share\lib目录下 我使用过程中感觉放到这里是一个最终解决 办法 当你放哪都有问题的时候 我这样用之后再没有出过因为系统不一样出现的各种各样的问题 当然你作的是web的项目
注意使用jacob一写要安装word 我装的word 如果是操作word 就不用jacob了(好像这方面的API)
对jacob dll几种配置方法 (网上看到)
: :
把jacob dll文件 复制到 windows\system 目录下 (注 我用的时候这个方法不能运行)
把jacob dll放入 Java\jdk _ \jre\bin目录下 把jacob jar放入 Java\jdk _ \jre\lib\ext目录下 可以正常运行
把jacob dll放入 \glc\src目录下 把jacob jar放入WEB INF\lib目录下 也是可以正常运行
三 使用(以下是我改写的一个word操作类 希望有兴趣的朋友完善 记得发给我一份)
//注意java操作word关键是定位操作对象;
import jacob activeX ActiveXComponent;
import Dispatch;
import Variant;
/**
* jacob操作MSword类
* @author
*/
public class WordBean {
// word文档
private Dispatch doc;
// word运行程序对象
private ActiveXComponent word;
// 所有word文档集合
private Dispatch documents;
// 选定的范围或插入点
private Dispatch selection;
private boolean saveOnExit = true;
public WordBean()throws Exception{
if (word == null) {
word = new ActiveXComponent( Word Application );
word setProperty( Visible new Variant(false)); //不可见打开word
word setProperty( AutomationSecurity new Variant( )); //禁用宏
}
if (documents == null)
documents = word getProperty( Documents ) toDispatch();
}
/**
* 设置退出时参数
*
* @param saveOnExit
* boolean true 退出时保存文件 false 退出时不保存文件
*/
public void setSaveOnExit(boolean saveOnExit) {
this saveOnExit = saveOnExit;
}
/**
* 创建一个新的word文档
*
*/
public void createNewDocument() {
doc = Dispatch call(documents Add ) toDispatch();
selection = Dispatch get(word Selection ) toDispatch();
}
/**
* 打开一个已存在的文档
*
* @param docPath
*/
public void openDocument(String docPath) {
closeDocument();
doc = Dispatch call(documents Open docPath) toDispatch();
selection = Dispatch get(word Selection ) toDispatch();
}
/**
*只读 打开一个保护文档
* @param docPath 文件全名
* @param pwd 密码
*/
public void openDocumentOnlyRead(String docPath String pwd)throws Exception {
closeDocument();
// doc = Dispatch invoke(documents Open Dispatch Method
// new Object[]{docPath new Variant(false) new Variant(true) new Variant(true) pwd}
// new int[ ]) toDispatch();//打开word文件
doc = Dispatch callN(documents Open new Object[]{docPath new Variant(false)
new Variant(true) new Variant(true) pwd new Variant(false)}) toDispatch();
selection = Dispatch get(word Selection ) toDispatch();
}
public void openDocument(String docPath String pwd)throws Exception {
closeDocument();
doc = Dispatch callN(documents Open new Object[]{docPath new Variant(false)
new Variant(false) new Variant(true) pwd}) toDispatch();
selection = Dispatch get(word Selection ) toDispatch();
}
/**
* 把选定的内容或插入点向上移动
*
* @param pos
* 移动的距离
*/
public void moveUp(int pos) {
if (selection == null)
selection = Dispatch get(word Selection ) toDispatch();
for (int i = ; i < pos; i++)
Dispatch call(selection MoveUp );
}
/**
* 把选定的内容或者插入点向下移动
*
* @param pos
* 移动的距离
*/
public void moveDown(int pos) {
if (selection == null)
selection = Dispatch get(word Selection ) toDispatch();
for (int i = ; i < pos; i++)
Dispatch call(selection MoveDown );
}
/**
* 把选定的内容或者插入点向左移动
*
* @param pos
* 移动的距离
*/
public void moveLeft(int pos) {
if (selection == null)
selection = Dispatch get(word Selection ) toDispatch();
for (int i = ; i < pos; i++) {
Dispatch call(selection MoveLeft );
}
}
/**
* 把选定的内容或者插入点向右移动
*
* @param pos
* 移动的距离
*/
public void moveRight(int pos) {
if (selection == null)
selection = Dispatch get(word Selection ) toDispatch();
for (int i = ; i < pos; i++)
Dispatch call(selection MoveRight );
}
/**
* 把插入点移动到文件首位置
*
*/
public void moveStart() {
if (selection == null)
selection = Dispatch get(word Selection ) toDispatch();
Dispatch call(selection HomeKey new Variant( ));
}
/**
* 从选定内容或插入点开始查找文本
*
* @param toFindText
* 要查找的文本
* @return boolean true 查找到并选中该文本 false 未查找到文本
*/
@SuppressWarnings( static access )
public boolean find(String toFindText) {
if (toFindText == null || toFindText equals( ))
return false;
// 从selection所在位置开始查询
Dispatch find = word call(selection Find ) toDispatch();
// 设置要查找的内容
Dispatch put(find Text toFindText);
// 向前查找
Dispatch put(find Forward True );
// 设置格式
Dispatch put(find Format True );
// 大小写匹配
Dispatch put(find MatchCase True );
// 全字匹配
Dispatch put(find MatchWholeWord True );
// 查找并选中
return Dispatch call(find Execute ) getBoolean();
}
/**
* 把选定选定内容设定为替换文本
*
* @param toFindText
* 查找字符串
* @param newText
* 要替换的内容
* @return
*/
public boolean replaceText(String toFindText String newText) {
if (!find(toFindText))
return false;
Dispatch put(selection Text newText);
return true;
}
/**
* 全局替换文本
*
* @param toFindText
* 查找字符串
* @param newText
* 要替换的内容
*/
public void replaceAllText(String toFindText String newText) {
while (find(toFindText)) {
Dispatch put(selection Text newText);
Dispatch call(selection MoveRight );
}
}
/**
* 在当前插入点插入字符串
*
* @param newText
* 要插入的新字符串
*/
public void insertText(String newText) {
Dispatch put(selection Text newText);
}
/**
*
* @param toFindText
* 要查找的字符串
* @param imagePath
* 图片路径
* @return
*/
public boolean replaceImage(String toFindText String imagePath) {
if (!find(toFindText))
return false;
Dispatch call(Dispatch get(selection InLineShapes ) toDispatch()
AddPicture imagePath);
return true;
}
/**
* 全局替换图片
*
* @param toFindText
* 查找字符串
* @param imagePath
* 图片路径
*/
public void replaceAllImage(String toFindText String imagePath) {
while (find(toFindText)) {
Dispatch call(Dispatch get(selection InLineShapes ) toDispatch()
AddPicture imagePath);
Dispatch call(selection MoveRight );
}
}
/**
* 在当前插入点插入图片
*
* @param imagePath
* 图片路径
*/
public void insertImage(String imagePath) {
Dispatch call(Dispatch get(selection InLineShapes ) toDispatch()
AddPicture imagePath);
}
/**
* 合并单元格
*
* @param tableIndex
* @param fstCellRowIdx
* @param fstCellColIdx
* @param secCellRowIdx
* @param secCellColIdx
*/
public void mergeCell(int tableIndex int fstCellRowIdx int fstCellColIdx
int secCellRowIdx int secCellColIdx) {
// 所有表格
Dispatch tables = Dispatch get(doc Tables ) toDispatch();
// 要填充的表格
Dispatch table = Dispatch call(tables Item new Variant(tableIndex))
toDispatch();
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 tableIndex
* @param cellRowIdx
* @param cellColIdx
* @param txt
*/
public void putTxtToCell(int tableIndex int cellRowIdx int cellColIdx
String txt) {
// 所有表格
Dispatch tables = Dispatch get(doc Tables ) toDispatch();
// 要填充的表格
Dispatch table = Dispatch call(tables Item new Variant(tableIndex))
toDispatch();
Dispatch cell = Dispatch call(table Cell new Variant(cellRowIdx)
new Variant(cellColIdx)) toDispatch();
Dispatch call(cell Select );
Dispatch put(selection Text txt);
}
/**
* 获得指定的单元格里数据
*
* @param tableIndex
* @param cellRowIdx
* @param cellColIdx
* @return
*/
public String getTxtFromCell(int tableIndex int cellRowIdx int cellColIdx) {
// 所有表格
Dispatch tables = Dispatch get(doc Tables ) toDispatch();
// 要填充的表格
Dispatch table = Dispatch call(tables Item new Variant(tableIndex))
toDispatch();
Dispatch cell = Dispatch call(table Cell new Variant(cellRowIdx)
new Variant(cellColIdx)) toDispatch();
Dispatch call(cell Select );
String ret = ;
ret = Dispatch get(selection Text ) toString();
ret = ret substring( ret length() ); //去掉最后的回车符;
return ret;
}
/**
* 在当前文档拷贝剪贴板数据
* @param pos
*/
public void pasteExcelSheet(String pos) {
moveStart();
if (this find(pos)) {
Dispatch textRange = Dispatch get(selection Range ) toDispatch();
Dispatch call(textRange Paste );
}
}
/**
* 在当前文档指定的位置拷贝表格
*
* @param pos
* 当前文档指定的位置
* @param tableIndex
* 被拷贝的表格在word文档中所处的位置
*/
public void copyTable(String pos int tableIndex) {
// 所有表格
Dispatch tables = Dispatch get(doc 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)) {
Dispatch textRange = Dispatch get(selection Range ) toDispatch();
Dispatch call(textRange Paste );
}
}
/**
* 在当前文档指定的位置拷贝来自另一个文档中的表格
*
* @param anotherDocPath
* 另一个文档的磁盘路径
* @param tableIndex
* 被拷贝的表格在另一格文档中的位置
* @param pos
* 当前文档指定的位置
*/
public void copyTableFromAnotherDoc(String anotherDocPath int tableIndex
String pos) {
Dispatch doc = null;
try {
doc = Dispatch call(documents Open anotherDocPath)
toDispatch();
// 所有表格
Dispatch tables = Dispatch get(doc 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)) {
Dispatch textRange = Dispatch get(selection Range )
toDispatch();
Dispatch call(textRange Paste );
}
} catch (Exception e) {
e printStackTrace();
} finally {
if (doc != null) {
Dispatch call(doc Close new Variant(saveOnExit));
doc = null;
}
lishixinzhi/Article/program/Java/hx/201311/26342先下载jacob_1.10.1.zip。
解压后将jacob.dll放到windows/system32下面或\j2sdk\bin下面。
将jacob.jar加入项目。
/*
* Java2word.java
*
* Created on 2007年8月13日, 上午10:32
*
* To
change this template, choose Tools | Template Manager
* and open the template
in the editor.
*/
/*
* 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段,Value代表用来替换的值。
*
word模板中所有要替换的字段(即HashMap中的Key)以特殊字符开头和结尾,如:$code$、$date$……,
以免执行错误的替换。
*
所有要替换为图片的字段,Key中需包含image或者Value为图片的全路径(目前只判断文件后缀名为:.bmp、
.jpg、.gif)。
*
要替换表格中的数据时,HashMap中的Key格式为“table$R@N”,其中:R代表从表格的第R行开始替换,N代表
word模板中的第N张表格;Value为ArrayList对象,ArrayList中包含的对象统一为String[],一条String[]代
表一行数据,ArrayList中第一条记录为特殊记录,记录的是表格中要替换的列号,如:要替换第一列、第三列、
第五列的数据,则第一条记录为String[3]
{“1”,”3”,”5”}。
如果电脑里装的有WORD,可以通过JS新建一个WORD,并把页面文件拷贝进去。
我这有操作Excel的,word的差不多。
function method1(tableid) {//整个表格拷贝到EXCEL中
var curTbl = document.getElementById(tableid);
var oXL = new ActiveXObject("Excel.Application");
//创建AX对象excel
var oWB = oXL.Workbooks.Add();
//获取workbook对象
var oSheet = oWB.ActiveSheet;
//激活当前sheet
var sel = document.body.createTextRange();
sel.moveToElementText(curTbl);
//把表格中的内容移到TextRange中
sel.select();
//全选TextRange中内容
sel.execCommand("Copy");
//复制TextRange中内容
oSheet.Paste();
//粘贴到活动的EXCEL中
oXL.Visible = true;
//设置excel可见属性
}
function method2(tableid) //读取表格中每个单元到EXCEL中
{
var curTbl = document.getElementById(tableid);
var oXL = new ActiveXObject("Excel.Application");
//创建AX对象excel
var oWB = oXL.Workbooks.Add();
//获取workbook对象
var oSheet = oWB.ActiveSheet;
//激活当前sheet
var Lenr = curTbl.rows.length;
//取得表格行数
for (i = 0; i < Lenr; i++)
{
var Lenc = curTbl.rows(i).cells.length;
//取得每行的列数
for (j = 0; j < Lenc; j++)
{
oSheet.Cells(i + 1, j + 1).value = curTbl.rows(i).cells(j).innerText;
//赋值
}
}
oXL.Visible = true;
//设置excel可见属性
}
function getXlsFromTbl(inTblId, inWindow) {
try {
var allStr = "";
var curStr = "";
//alert("getXlsFromTbl");
if (inTblId != null && inTblId != "" && inTblId != "null") {
curStr = getTblData(inTblId, inWindow);
}
if (curStr != null) {
allStr += curStr;
}
else {
alert("你要导出的表不存在!");
return;
}
var fileName = getExcelFileName();
doFileExport(fileName, allStr);
}
catch(e) {
alert("导出发生异常:" + e.name + "->" + e.description + "!");
}
}
function getTblData(inTbl, inWindow) {
var rows = 0;
//alert("getTblData is " + inWindow);
var tblDocument = document;
if (!!inWindow && inWindow != "") {
if (!document.all(inWindow)) {
return null;
}
else {
tblDocument = eval(inWindow).document;
}
}
var curTbl = tblDocument.getElementById(inTbl);
var outStr = "";
if (curTbl != null) {
for (var j = 0; j < curTbl.rows.length; j++) {
//alert("j is " + j);
for (var i = 0; i < curTbl.rows[j].cells.length; i++) {
//alert("i is " + i);
if (i == 0 && rows > 0) {
outStr += " \t";
rows -= 1;
}
outStr += curTbl.rows[j].cells[i].innerText + "\t";
if (curTbl.rows[j].cells[i].colSpan > 1) {
for (var k = 0; k < curTbl.rows[j].cells[i].colSpan - 1; k++) {
outStr += " \t";
}
}
if (i == 0) {
if (rows == 0 && curTbl.rows[j].cells[i].rowSpan > 1) {
rows = curTbl.rows[j].cells[i].rowSpan - 1;
}
}
}
outStr += "\r\n";
}
}
else {
outStr = null;
alert(inTbl + "不存在!");
}
return outStr;
}
function getExcelFileName() {
var d = new Date();
var curYear = d.getYear();
var curMonth = "" + (d.getMonth() + 1);
var curDate = "" + d.getDate();
var curHour = "" + d.getHours();
var curMinute = "" + d.getMinutes();
var curSecond = "" + d.getSeconds();
if (curMonth.length == 1) {
curMonth = "0" + curMonth;
}
if (curDate.length == 1) {
curDate = "0" + curDate;
}
if (curHour.length == 1) {
curHour = "0" + curHour;
}
if (curMinute.length == 1) {
curMinute = "0" + curMinute;
}
if (curSecond.length == 1) {
curSecond = "0" + curSecond;
}
var fileName = "leo_zhang" + "_" + curYear + curMonth + curDate + "_" + curHour + curMinute + curSecond + ".csv";
//alert(fileName);
return fileName;
}
function doFileExport(inName, inStr) {
var xlsWin = null;
if (!!document.all("glbHideFrm")) {
xlsWin = glbHideFrm;
}
else {
var width = 6;
var height = 4;
var openPara = "left=" + (window.screen.width / 2 - width / 2)
+ ",top=" + (window.screen.height / 2 - height / 2)
+ ",scrollbars=no,width=" + width + ",height=" + height;
xlsWin = window.open("", "_blank", openPara);
}
xlsWin.document.write(inStr);
xlsWin.document.close();
xlsWin.document.execCommand('Saveas', true, inName);
xlsWin.close();
}
以上就是Java生成Word文档目录的全部内容,其次每次生成word文档以后弹出对话框(无法保存此文件,因为它已在别处打开(C:\\STARTUP\Powerword.dot)),出现此问题就需要把C:\Documents and Settings\当前用户名\Application Data\Microsoft\Word\STARTUP下的Powerword.dot文件删除,每次遇到此问题就需要删除文件来解决,十分不方便。