java生成帶html樣式的word檔案

livedba發表於2012-07-05

參考:http://blog.csdn.net/xiexl/article/details/6652230

最近在專案中需要將透過富文字編輯器處理過的文字轉換為Word,查了很久,大家通常的解決辦法是使用Jacob或POI等元件直接生成Word,但是都無法將富文字編輯器處理過的文字保留樣式並儲存為Word,最終以失敗而告終,無奈只有自己研究Word的格式轉換;

分析了轉換過程,總體分兩個步驟:

1、實現富文字中樣式程式碼的分離;

2、保留CSS樣式;

其實以上兩個步驟是相互矛盾的處理過程,無法透過Jacob或POI元件加正規表示式過濾解決,於是進行了以下步驟的實驗:

1、首先建立了一個空白word文件,格式(office 2003格式或office 2007格式)不限;

2、將word格式儲存為html格式,透過Edit Plus開啟,發現程式碼中使用了office的名稱空間,同時使用了office名稱空間的標籤定義了CSS樣式,自己測試了一下,將生成的html檔案頭和尾複製出來:程式碼如下:

xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns:m=""
xmlns="">

<!-- 富文字程式碼區 --&gt

以上HTML頭是office的名稱空間定義。

3、將使用富文字程式碼貼上到紅色標識的<!-- 富文字程式碼區 --&gt中,並以doc或docx格式儲存檔案

4、大功告成,開啟檔案時,Word將會以“Web版檢視”完美顯示了富文字樣式,成功解決了富文字程式碼中樣式程式碼,並同時保留了格式;

目前研究的僅能儲存文字,未處理有圖片的程式碼,朋友們可以再研究一下帶圖片的富文字程式碼的轉換;

[@more@]

根據上面的,現在我們只需要在伺服器建一個.doc的檔案,然後再把我們的帶html樣式的文字寫到這個檔案中,再下載到客戶端就可以了

下面實現的程式碼,首先寫一個工具類用來生成word檔案

package net.uni.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

/**
* 處理內容:生成帶html樣式的word文件
* @version: 1.0
* @see:net.uni.util.JavaWordUtil.java
* @date:2012-7-5
* @author:孫偉
*/
public class JavaWordUtil {

private JavaWordUtil(){}

private static String CHARSET = "gbk";//編碼格式

private static String PATH = "E:uploadword";//本地測試路徑

//private static String PATH = "/home/upload/base/word/";//伺服器檔案存放路徑

/**
* @param fileName
* @param content
* @return
* @方法說明 生成word文件,如果返回null,則表示生成失敗
* @date 2012-7-5
* @author 孫偉
*/
public static String createWordFile(String fileName,String content){
OutputStreamWriter os = null;
FileOutputStream fos = null;
try{
if(fileName.indexOf(".doc")>-1){
fileName = fileName.substring(0, fileName.length()-4);
}

File file = new File(PATH);

//如果目錄不存在就建立
if (!(file.exists() && file.isDirectory())) {
file.mkdirs();
}

fileName = PATH + "" + fileName + "-" +System.currentTimeMillis() + ".doc";

//建立檔案
File targetFile = new File(fileName);
if(!targetFile.exists()){
targetFile.createNewFile();
}
fos = new FileOutputStream(fileName);
os = new OutputStreamWriter(fos,CHARSET);
os.append(content.toString());
os.flush();
return fileName;
}catch(Exception e){
return null;
}finally{
try{
os.close();
fos.close();
}catch(Exception e){
return null;
}
}
}
}

然後就是struts2配置下載檔案的步驟:

action裡定義兩個屬性

private String conFileName;//生成的合同模板的word檔名稱
private InputStream inputStream;//下載商務合同模板流

注意這兩個屬性的檔名稱的get方法有些不同,為了處理檔名中文亂碼的問題

public String getConFileName() {
String downFileName = conFileName;
try {
downFileName = new String(downFileName.getBytes(), "ISO8859-1");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return downFileName;
}

然後是action的主方法

/**
* @return
* @throws ActionException
* @方法說明 下載商務合同模板
* @date 2012-7-5
* @author 孫偉
*/
public String downLoadCustCon() throws ActionException{
try{
StringBuffer content = new StringBuffer();

Long conId = this.cscustcon.getId();
this.cscustcon = this.csCustConService.findCsCustConbyID(conId);
List conHead = csCustConService.findCustConHeadInfo(conId);
//合同頭資訊
for(String s : conHead){
content.append(s);
}
//合同條款已經條款的內容
List> conItem = csCustConService.findCustConContent(conId);
for(List ls : conItem){
for(String sl : ls){
content.append(sl);
}
}

String filePath = JavaWordUtil.createWordFile(cscustcon.getContName(), content.toString());

if(filePath==null||filePath.trim().equals("")) throw new ActionException("合同模板下載失敗");

File file = new File(filePath);

if(!file.exists()){
throw new ActionException("檔案不存在!");
}

conFileName = cscustcon.getContName()+".doc";

inputStream = new FileInputStream(file);

}catch(Exception e){
throw new ActionException("下載商務合同模板失敗",e);
}
return SUCCESS;
}

struts.xml檔案的配置:

<!--商務合同下載--&gt



inputStream

application/octet-stream;charset=ISO8859-1

attachment;filename=${conFileName}
2048

頁面的寫法:

window.location.href=getBasePath()+"/cs/downLoadCustCon.action?cscustcon.id="+conId+"&itemContent="+$("#itemContentId").val();

到此下面帶html樣式的word檔案就完成了

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25261409/viewspace-1058739/,如需轉載,請註明出處,否則將追究法律責任。

相關文章