这是代码,一个工具类得调用
public class WordUtil {
/**
* 基于模板文件导出 word 文档,此方法主要是用来处理文档中需要替换的文本内容,对图片和表格无效
*
* @param templatePath
*模板文件的路径,要求路径中要包含全名,并且模板文件只能是 07 及以上格式,即 docx 的文件
* @param destFilePath
*导出文件的存放路径,包含文件名,例如,E:/test/小区公告.docx
* @param data
*用来替换文档中预定义的字符串,要求预定义的字符串与 data 中的 key 值要相同
*/
public static void exportWordByTemplate(String templatePath,
String destFilePath, Map<String, String>data) {
FileOutputStream out = null
XWPFDocument doc = null
try {
doc = new XWPFDocument(POIXMLDocument.openPackage(templatePath))
List<XWPFRun>listRun
List<XWPFParagraph>listParagraphs = doc.getParagraphs()
for (int i = 0i <listParagraphs.size()i++) {
listRun = listParagraphs.get(i).getRuns()
for (int j = 0j <listRun.size()j++) {
if (data.get(listRun.get(j).getText(0)) != null) {
String val = data.get(listRun.get(j).getText(0))
listRun.get(j).setText(val, 0)
}
}
}
File destFile = new File(destFilePath)
if (!destFile.getParentFile().exists()) {
destFile.getParentFile().mkdirs()
}
out = new FileOutputStream(destFilePath)
doc.write(out)
} catch (IOException e) {
e.printStackTrace()
} finally {
try {
if (out != null)
out.close()
} catch (IOException e) {
e.printStackTrace()
}
}
}
/**
* 基于模板文件导出 word 文档,该方法支持03格式,但是此方法只能保留文档内容,不能保留文档中的样式和图片,建议将模板使用 07 的格式保存
*
* @param templatePath
*模板文件的路径
* @param destFilePath
*导出文件的存放路径,包含文件名,例如,E:/test/小区公告.doc
* @param data
*用来替换文档中预定义的字符串,要求预定义的字符串与 data 中的 key 值要相同
*/
public static void export03WordByTemplate(String templatePath,
String destFilePath, Map<String, String>data) {
try {
WordExtractor doc = new WordExtractor(new FileInputStream(
templatePath))
String content = doc.getText()
for (String key : data.keySet()) {
content = content.replaceAll(key, data.get(key))
}
byte b[] = content.getBytes()
ByteArrayInputStream bais = new ByteArrayInputStream(b)
POIFSFileSystem fs = new POIFSFileSystem()
DirectoryEntry directory = fs.getRoot()
directory.createDocument("WordDocument", bais)
FileOutputStream ostream = new FileOutputStream(destFilePath)
fs.writeFilesystem(ostream)
bais.close()
ostream.close()
} catch (FileNotFoundException e) {
e.printStackTrace()
} catch (IOException e) {
e.printStackTrace()
}
}
public static void main(String[] args) throws Exception {
Map<String, String>maps = new HashMap<String, String>()
maps.put("appellation", "万达公寓业主:")
maps.put(
"main_body",
"输出的内容")
maps.put("date", "2013年1月23日")
exportWordByTemplate("E:/sss 2.docx", "E:/test/test.doc", maps)
}
}
"E:/sss 2.docx模板存放的地址。
E:/test/test.doc 新生成的地址。
1-apache的POI,此方法对Excel的导出做的很好,目前对Word的导出方面的功能尚未完全。2-纯JavaScript脚本实现。主要通过客户端调用本机Office组件来实现。
3-在JSP页面引入头文件实现。
纯JavaScript脚本实现细节方面大体是创建一个word组件ActiveXObject('Word.Application'),用js通过表ID取得表内容然后保存到word,要注意的是js实现有很多不好的地方,例如Internet选项需要把ActiveX空间全部启用,安全级别设置为中。这样的话岂不是每台机器都要配置一下。其次每次生成word文档以后弹出对话框(无法保存此文件,因为它已在别处打开(C:\...\STARTUP\Powerword.dot)),出现此问题就需要把C:\Documents and Settings\当前用户名\Application Data\Microsoft\Word\STARTUP下的Powerword.dot文件删除,每次遇到此问题就需要删除文件来解决,十分不方便。
JSP页面引入来实现Word保存就方便多了,但是也有不足的地方,首先如果需要引入
<meta http-equiv="Content-Type" content="application/mswordcharset=gb2312" />
如果需要下载的话就引入
<%@ page contentType="application/mswordcharset=gb2312" %>
其实如果大家用框架做就方便多了,比如Struts2。在Action里直接写如下代码:
if(out!=null){
String fileName=""
fileName+="评价报告.doc"
try {
HttpServletResponse response = ServletActionContext.getResponse()
response.setHeader("Content-disposition","attachmentfilename="+new String(fileName.getBytes("GB2312"), "8859_1"))
} catch (UnsupportedEncodingException e) {
e.printStackTrace()
}
out是jsp页面表单元素,一个button,用于提交表单到相应Action进行Word下载。Action设置jsp页面头文件。这样每次点击button就可以把相应jsp页面的内容保存到Word中并且支持下载,Word中内容并且是可编辑状态。
不足的地方在于由于表内容是动态生成,有的需要先查看在下载Word,就需要另外建立一个新JSP页面进行Word下载,当然首先要在struts.xml里配置好页面转向。
新建立的页面传值同查看页面要保持一样。