java导出html word文档_java生成带html样式的word文件
最近在項目中需要將通過富文本編輯器處理過的文字轉換為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="http://schemas.microsoft.com/office/2004/12/omml"
xmlns="http://www.w3.org/TR/REC-html40">
以上HTML頭是office的命名空間定義。
3、將使用富文本代碼粘貼到紅色標識的中,并以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文件的配置:
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文件就完成了
轉自:http://blog.itpub.net/25261409/viewspace-1058739/
總結
以上是生活随笔為你收集整理的java导出html word文档_java生成带html样式的word文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20176408李俊 栈和队列
- 下一篇: d3dcompiler_43.dll缺失