参考: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="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<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文件的更多相关文章

  1. T4 模板自动生成带注释的实体类文件

    T4 模板自动生成带注释的实体类文件 - 只需要一个 SqlSugar.dll 生成实体就是这么简单,只要建一个T4文件和 文件夹里面放一个DLL. 使用T4模板教程 步骤1 创建T4模板 如果你没有 ...

  2. 利用freemarker生成带fusioncharts图片的word简报

    /**  * 利用freemarker生成带fusioncharts图片的word简报  *         烟台海颐软件技术论坛  *         作者  牟云飞 新建 *         毕业 ...

  3. C#生成带项目编号的Word段落

    using System; using Microsoft.Office.Interop.Word; using Word = Microsoft.Office.Interop.Word; names ...

  4. [转载]Java开发在线打开编辑保存Word文件

    Java调用logo是“P”图标的第三方插件,实现在线编辑保存Word文件(以jsp调用为例,支持SSM.SSH.SpringMVC等流行框架) 工具/原料   Eclipse或MyEclipse等j ...

  5. [原创]Java开发在线打开编辑保存Word文件(支持多浏览器)

    Java调用PageOffice实现在线编辑保存Word文件(以jsp调用为例,支持SSM.SSH.SpringMVC等流行框架) 1. 下载PageOffice开发包:http://www.zhuo ...

  6. Java生成带小图标的二维码-google zxing 工具类

    近期一直忙于开发微信商城项目,应客户要求,要开发个有图标的二维码.经过两次改版,终于实现了该功能(第一次没有小图标,这次才整合好的),如下是完整代码 . 该代码使用Java7开发,另外使用 core- ...

  7. [转载]Java集成PageOffice在线打开编辑word文件 - Spring Boot

    开发环境:JDK1.8.Eclipse.Sping Boot + Thymeleaf框架. 一. 构建Sping Boot + Thymeleaf框架的项目(不再详述): 1. 新建一个maven p ...

  8. [原创]Java集成PageOffice在线打开编辑word文件 - Spring Boot

    开发环境:JDK1.8.Eclipse.Sping Boot + Thymeleaf框架. 一. 构建Sping Boot + Thymeleaf框架的项目(不再详述): 1. 新建一个maven p ...

  9. Intellij IDEA 通过数据库表逆向生成带注释的实体类文件超级详细步骤,附详细解决方案

    参考:https://blog.csdn.net/qq_34371461/article/details/80571281  https://blog.csdn.net/mqchenrong/arti ...

随机推荐

  1. fullscreen DXGI DX11

    these days i am fullfilling full screen https://github.com/rufelt/simpled3d11window put this one  in ...

  2. mysql导出导入某张表

    一般表数据少的话都用图形界面了,看着比较方便. 如果表中数据比较多,用图形界面极容易卡死,这个时候就要用到命令行了. 用命令行导出导入大量数据还是比较快的,方法如下: 导出库db1中的表table1: ...

  3. Silverlight编程模型

    Silverlight支持Javascript API编程模型和托管API编程模型这两种编程模型,它们的基本作用都是用于XAML界面文件中的XAML对象,基于托管API编程的XAML应用程序是通过x: ...

  4. UML概述(转载)

    UML是一种标准语言,用于指定,可视化,构造和文档的软件系统. UML是OMG在1997年1月提出了创建由对象管理组织(OMG)和UML1.0规范草案. OMG不断努力,使一个真正的行业标准. UML ...

  5. Lua require搜索路径指定方法

    在自己的lua文件中,如果使用到了自己写的C库或者第三方库,想让lua编译到自己指定的目录下寻找*.lua或*.so文件的时候,可以再自己的Lua代码中添加如下代码,可以指定require搜索的路径. ...

  6. unity3d中dllimport方法的使用,以接入腾讯平台为例!!!

    说到有关dllimport方法可能还有很多人比较陌生,其实我自己也说不太清楚,大概说说什么时候要用它. 事实上功能类似于调用android的第三包,我们想要使用苹果上特定的api或者第三方平台的一些东 ...

  7. 本地安装xssing

    本地安装xssing 环境为apache+mysql+php,linux下和Windows均进行了尝试. 步骤: (1)Mysql中创建xing数据库,将xssing.sql中的语句复制并在xing数 ...

  8. 分布式数据存储 - MySQL主从复制高可用方案

    前面几篇文章说道MySQL数据库的高可用方案主从复制.主从复制的延迟产生原因.延迟检测及延迟解决方案(并未从根本上解决),这种主从复制方案保证数据的冗余的同时可以做读写分离来分担系统压力但是并非是高可 ...

  9. 评论 “App死亡潮:400万应用僵尸超八成,周期仅10月”

    点这里 原文: App死亡潮:400万应用僵尸超八成,周期仅10月 时间 2015-04-05 22:48:19  和讯科技相似文章 (16)原文  http://tech.hexun.com/201 ...

  10. 在.NET中使用Newtonsoft.Json转换,读取,写入的方法介绍

    全局引用 using Newtonsoft.Json; using Newtonsoft.Json.Converters; //把Json字符串反序列化为对象 目标对象 = JavaScriptCon ...