首先我用的技術(shù)是 poi
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:空間域名、虛擬主機(jī)、營銷軟件、網(wǎng)站建設(shè)、叢臺(tái)網(wǎng)站維護(hù)、網(wǎng)站推廣。
這是代碼,一個(gè)工具類得調(diào)用
public class WordUtil {
/**
* 基于模板文件導(dǎo)出 word 文檔,此方法主要是用來處理文檔中需要替換的文本內(nèi)容,對(duì)圖片和表格無效
*
* @param templatePath
* 模板文件的路徑,要求路徑中要包含全名,并且模板文件只能是 07 及以上格式,即 docx 的文件
* @param destFilePath
* 導(dǎo)出文件的存放路徑,包含文件名,例如,E:/test/小區(qū)公告.docx
* @param data
* 用來替換文檔中預(yù)定義的字符串,要求預(yù)定義的字符串與 data 中的 key 值要相同
*/
public static void exportWordByTemplate(String templatePath,
String destFilePath, MapString, String data) {
FileOutputStream out = null;
XWPFDocument doc = null;
try {
doc = new XWPFDocument(POIXMLDocument.openPackage(templatePath));
ListXWPFRun listRun;
ListXWPFParagraph listParagraphs = doc.getParagraphs();
for (int i = 0; i listParagraphs.size(); i++) {
listRun = listParagraphs.get(i).getRuns();
for (int j = 0; j 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();
}
}
}
/**
* 基于模板文件導(dǎo)出 word 文檔,該方法支持03格式,但是此方法只能保留文檔內(nèi)容,不能保留文檔中的樣式和圖片,建議將模板使用 07 的格式保存
*
* @param templatePath
* 模板文件的路徑
* @param destFilePath
* 導(dǎo)出文件的存放路徑,包含文件名,例如,E:/test/小區(qū)公告.doc
* @param data
* 用來替換文檔中預(yù)定義的字符串,要求預(yù)定義的字符串與 data 中的 key 值要相同
*/
public static void export03WordByTemplate(String templatePath,
String destFilePath, MapString, 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 {
MapString, String maps = new HashMapString, String();
maps.put("appellation", "萬達(dá)公寓業(yè)主:");
maps.put(
"main_body",
"輸出的內(nèi)容");
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,此方法對(duì)Excel的導(dǎo)出做的很好,目前對(duì)Word的導(dǎo)出方面的功能尚未完全。
2-純JavaScript腳本實(shí)現(xiàn)。主要通過客戶端調(diào)用本機(jī)Office組件來實(shí)現(xiàn)。
3-在JSP頁面引入頭文件實(shí)現(xiàn)。
純JavaScript腳本實(shí)現(xiàn)細(xì)節(jié)方面大體是創(chuàng)建一個(gè)word組件ActiveXObject('Word.Application'),用js通過表ID取得表內(nèi)容然后保存到word,要注意的是js實(shí)現(xiàn)有很多不好的地方,例如Internet選項(xiàng)需要把ActiveX空間全部啟用,安全級(jí)別設(shè)置為中。這樣的話豈不是每臺(tái)機(jī)器都要配置一下。其次每次生成word文檔以后彈出對(duì)話框(無法保存此文件,因?yàn)樗言趧e處打開(C:\...\STARTUP\Powerword.dot)),出現(xiàn)此問題就需要把C:\Documents and Settings\當(dāng)前用戶名\Application Data\Microsoft\Word\STARTUP下的Powerword.dot文件刪除,每次遇到此問題就需要?jiǎng)h除文件來解決,十分不方便。
JSP頁面引入來實(shí)現(xiàn)Word保存就方便多了,但是也有不足的地方,首先如果需要引入
meta http-equiv="Content-Type" content="application/msword; charset=gb2312" /
如果需要下載的話就引入
%@ page contentType="application/msword; charset=gb2312" %
其實(shí)如果大家用框架做就方便多了,比如Struts2。在Action里直接寫如下代碼:
if(out!=null){
String fileName="";
fileName+="評(píng)價(jià)報(bào)告.doc";
try {
HttpServletResponse response = ServletActionContext.getResponse();
response.setHeader("Content-disposition","attachment; filename="+new String(fileName.getBytes("GB2312"), "8859_1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
out是jsp頁面表單元素,一個(gè)button,用于提交表單到相應(yīng)Action進(jìn)行Word下載。Action設(shè)置jsp頁面頭文件。這樣每次點(diǎn)擊button就可以把相應(yīng)jsp頁面的內(nèi)容保存到Word中并且支持下載,Word中內(nèi)容并且是可編輯狀態(tài)。
不足的地方在于由于表內(nèi)容是動(dòng)態(tài)生成,有的需要先查看在下載Word,就需要另外建立一個(gè)新JSP頁面進(jìn)行Word下載,當(dāng)然首先要在struts.xml里配置好頁面轉(zhuǎn)向。
新建立的頁面?zhèn)髦低榭错撁嬉3忠粯印?/p>
java導(dǎo)出word代碼如下:
package com.bank.util;
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;
public class WordTools {
public void createDocContext(String file) throws DocumentException,
IOException {
// 設(shè)置紙張大小
Document document = new Document(PageSize.A4);
// 建立一個(gè)書寫器(Writer)與document對(duì)象關(guān)聯(lián),通過書寫器(Writer)可以將文檔寫入到磁盤中
RtfWriter2.getInstance(document, new FileOutputStream(file));
document.open();
// 設(shè)置中文字體
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light",
"UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
// 標(biāo)題字體風(fēng)格
Font titleFont = new Font(bfChinese, 12, Font.BOLD);
// 正文字體風(fēng)格
Font contextFont = new Font(bfChinese, 10, Font.NORMAL);
Paragraph title = new Paragraph("標(biāo)題");
// 設(shè)置標(biāo)題格式對(duì)齊方式
title.setAlignment(Element.ALIGN_CENTER);
title.setFont(titleFont);
document.add(title);
String contextString = "iText是一個(gè)能夠快速產(chǎn)生PDF文件的java類庫。"
+ " \n"http:// 換行
+ "iText的java類對(duì)于那些要產(chǎn)生包含文本,"
+ "表格,圖形的只讀文檔是很有用的。它的類庫尤其與java Servlet有很好的給合。"
+ "使用iText與PDF能夠使你正確的控制Servlet的輸出。";
Paragraph context = new Paragraph(contextString);
// 正文格式左對(duì)齊
context.setAlignment(Element.ALIGN_LEFT);
context.setFont(contextFont);
// 離上一段落(標(biāo)題)空的行數(shù)
context.setSpacingBefore(5);
// 設(shè)置第一行空的列數(shù)
context.setFirstLineIndent(20);
document.add(context);
//利用類FontFactory結(jié)合Font和Color可以設(shè)置各種各樣字體樣式
/**
* Font.UNDERLINE 下劃線,F(xiàn)ont.BOLD 粗體
*/
Paragraph underline = new Paragraph("下劃線的實(shí)現(xiàn)", FontFactory.getFont(
FontFactory.HELVETICA_BOLDOBLIQUE, 18, Font.UNDERLINE,
new Color(0, 0, 255)));
document.add(underline);
// 設(shè)置 Table 表格
Table aTable = new Table(3);
int width[] = {25,25,50};
aTable.setWidths(width);//設(shè)置每列所占比例
aTable.setWidth(90); // 占頁面寬度 90%
aTable.setAlignment(Element.ALIGN_CENTER);//居中顯示
aTable.setAlignment(Element.ALIGN_MIDDLE);//縱向居中顯示
aTable.setAutoFillEmptyCells(true); //自動(dòng)填滿
aTable.setBorderWidth(1); //邊框?qū)挾?/p>
aTable.setBorderColor(new Color(0, 125, 255)); //邊框顏色
aTable.setPadding(0);//襯距,看效果就知道什么意思了
aTable.setSpacing(0);//即單元格之間的間距
aTable.setBorder(2);//邊框
//設(shè)置表頭
/**
* cell.setHeader(true);是將該單元格作為表頭信息顯示;
* cell.setColspan(3);指定了該單元格占3列;
* 為表格添加表頭信息時(shí),要注意的是一旦表頭信息添加完了之后, \
* 必須調(diào)用 endHeaders()方法,否則當(dāng)表格跨頁后,表頭信息不會(huì)再顯示
*/
Cell haderCell = new Cell("表格表頭");
haderCell.setHeader(true);
haderCell.setColspan(3);
aTable.addCell(haderCell);
aTable.endHeaders();
Font fontChinese = new Font(bfChinese, 12, Font.NORMAL, Color.GREEN);
Cell cell = new Cell(new Phrase("這是一個(gè)測(cè)試的 3*3 Table 數(shù)據(jù)", fontChinese ));
cell.setVerticalAlignment(Element.ALIGN_TOP);
cell.setBorderColor(new Color(255, 0, 0));
cell.setRowspan(2);
aTable.addCell(cell);
aTable.addCell(new Cell("#1"));
aTable.addCell(new Cell("#2"));
aTable.addCell(new Cell("#3"));
aTable.addCell(new Cell("#4"));
Cell cell3 = new Cell(new Phrase("一行三列數(shù)據(jù)", fontChinese ));
cell3.setColspan(3);
cell3.setVerticalAlignment(Element.ALIGN_CENTER);
aTable.addCell(cell3);
document.add(aTable);
document.add(new Paragraph("\n"));
//添加圖片
// Image img=Image.getInstance("");
// img.setAbsolutePosition(0, 0);
// img.setAlignment(Image.RIGHT);//設(shè)置圖片顯示位置
// img.scaleAbsolute(12,35);//直接設(shè)定顯示尺寸
// img.scalePercent(50);//表示顯示的大小為原尺寸的50%
// img.scalePercent(25, 12);//圖像高寬的顯示比例
// img.setRotation(30);//圖像旋轉(zhuǎn)一定角度
// document.add(img);
document.close();
}
public static void main(String[] args){
WordTools b=new WordTools();
try {
b.createDocContext("d:/demo.doc");
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}