`

struts2 freemarker 导出word

阅读更多

1.最近忙于锻炼身体,好久不写文章了,简单写一个导出word的例子,很多管理系统中会有一个常用的功能就是导出word文件,excel文件,pdf文件等,不必多说,好处您懂的。
直接上代码了,不写文字描述了。

public class UserAction extends ActionSupport {

           private User user;//省略get和set
         /**
	 * 导出word
	 */
	public void exportObj() {
		if (null != pkId && pkId.trim().length() > 0) {
			user = this.userService.getById(User.class,pkId);
		}
		Configuration configuration = new Configuration();
		configuration.setDefaultEncoding("utf-8");
		Map data = new HashMap();
		data.put("user", this.getUser());
		configuration.setClassForTemplateLoading(getClass(),
				"/com/test/yale/template");
		Template t = null;
		try {
			t = configuration.getTemplate("user.ftl");//载入模版文件(把要导出的word模版另存为word xml就可以了)
			t.setEncoding("utf-8");
		} catch (IOException e) {
			e.printStackTrace();
		}
		String fileName = "人员确认书.doc";
			//人员头像导出
			if(null!=this.getUser().getPhoto()){
				try {
					String address = ServletActionContext.getServletContext()
							.getRealPath("/");
					String dir = address + "images/orgseal/"
							+ this.getUser().getPhoto();//获得图片位置包括图片全名
					String image = getImageBase64Data(dir);//把图片转换成BASE64形式
					if (image == null) {
						data.put("photo","无头像");
					} else {
						data.put("photo", image);
					}
				} catch (Exception e) {
					data.put("stuphoto", "无头像");
				}
			}
		
		ActionContext ctx = ActionContext.getContext();
		HttpServletResponse response = (HttpServletResponse) ctx
				.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse");
		response.setContentType("application/msword");
		try {
			response.addHeader("Content-Disposition", "attachment; filename="
					+ URLEncoder.encode(fileName, "UTF-8"));

			response.setCharacterEncoding("utf-8");
			PrintWriter out = response.getWriter();
			t.process(data, out);
			out.close();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		}

	}
}

下面看图片转换BASE64方法:
/**
	 * 获得图片64位编码数据
	 * @param imgSrc
	 * @return
	 */
	private String getImageBase64Data(String imgSrc){
		InputStream in =null;
		byte[] data = null;
		try{
			in = new FileInputStream(imgSrc);
			data = new byte[in.available()];
			in.read(data);
			in.close();
		}catch(IOException ex){
			ex.printStackTrace();
		}
		Base64EncoderNew encoder = new Base64EncoderNew();
		return encoder.encode(data);
	}

其中Base64EncoderNew 在网上可以找到 是重写sun 的
public class Base64EncoderNew {
  
      private static char[] codec_table = { 'A', 'B', 'C', 'D', 'E', 'F', 'G',
              'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
              'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
             'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
             'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6',
             '7', '8', '9', '+', '/' };
 
     public Base64EncoderNew() {
 
     }
 
     public String encode(byte[] a) {
         int totalBits = a.length * 8;
         int nn = totalBits % 6;
         int curPos = 0;// process bits
         StringBuffer toReturn = new StringBuffer();
         while (curPos < totalBits) {
             int bytePos = curPos / 8;
             switch (curPos % 8) {
            case 0:
                toReturn.append(codec_table[(a[bytePos] & 0xfc) >> 2]);
                 break;
            case 2:
 
                 toReturn.append(codec_table[(a[bytePos] & 0x3f)]);
                 break;
             case 4:
                if (bytePos == a.length - 1) {
                     toReturn
                            .append(codec_table[((a[bytePos] & 0x0f) << 2) & 0x3f]);
                 } else {                     int pos = (((a[bytePos] & 0x0f) << 2) | ((a[bytePos + 1] & 0xc0) >> 6)) & 0x3f;
                     toReturn.append(codec_table[pos]);
                }
                break;
             case 6:
                 if (bytePos == a.length - 1) {
                     toReturn
                             .append(codec_table[((a[bytePos] & 0x03) << 4) & 0x3f]);
                 } else {
                     int pos = (((a[bytePos] & 0x03) << 4) | ((a[bytePos + 1] & 0xf0) >> 4)) & 0x3f;
                     toReturn.append(codec_table[pos]);
                 }
                 break;
             default:
                 //never hanppen
                 break;
             }
             curPos+=6;
         }
         if(nn==2)
         {
            toReturn.append("==");
         }
         else if(nn==4)
         {
             toReturn.append("=");
         }
         return toReturn.toString();
 
     }
 
 }

use.ftl 主要内容
<#--定义变量 赋值-->
<#assign euserdata={}/>
<#assign img={}/>
<#if user??>
<#assign userdata=user/>
</#if>
<#if photo??>
<#assign img=photo/>
</#if>
<#--显示数据-->
用户名:${userdata.userName!''}
注册时间:${userdata.regDate?string('yyyy-MM-dd')}
用户头像:
<w:pict>
								<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
									<v:stroke joinstyle="miter"/>
									<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0"/>
										<v:f eqn="sum @0 1 0"/>
										<v:f eqn="sum 0 0 @1"/>
										<v:f eqn="prod @2 1 2"/>
										<v:f eqn="prod @3 21600 pixelWidth"/>
										<v:f eqn="prod @3 21600 pixelHeight"/>
										<v:f eqn="sum @0 0 1"/>
										<v:f eqn="prod @6 1 2"/>
										<v:f eqn="prod @7 21600 pixelWidth"/>
										<v:f eqn="sum @8 21600 0"/>
										<v:f eqn="prod @7 21600 pixelHeight"/>
										<v:f eqn="sum @10 21600 0"/>
									</v:formulas>
									<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
									<o:lock v:ext="edit" aspectratio="t"/>
								</v:shapetype>
								<w:binData w:name="wordml://03000001.png" xml:space="preserve">${img}</w:binData>
								<v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:68.25pt;height:62.25pt">
									<v:imagedata src="wordml://03000001.png" o:title="seal"/>
								</v:shape>
							</w:pict>

简单说这些吧,对了,还有一个重点,就是word模版另存为xml的时候,记得用office2003,要不然图片无法显示,07的word xml格式有改动!!!!
分享到:
评论

相关推荐

    freemarker导出word完整案例

    Freemarker是一个强大的模板引擎,常用于Web应用中的视图层渲染,比如JavaEE的Struts2、Spring MVC等框架。它允许开发者使用简单的模板语言来分离业务逻辑和视图展示,使得页面设计更为灵活。在本案例中,我们将探讨...

    struts2教程word文档格式

    9. **插件Plugin**:Struts2有众多插件支持,如Tiles插件用于页面布局,Freemarker或Velocity插件作为视图模板引擎,以及Spring插件整合Spring框架等。 10. **AJAX支持**:Struts2提供了一套基于JSON的Ajax支持,...

    struts2参考文档(word版)

    第四章可能涉及Struts2的视图技术,如JSP标签库的使用,以及如何与FreeMarker、Velocity等模板引擎集成,以创建动态HTML页面。第五章可能涵盖Struts2的模型部分,包括数据持久化、DAO设计模式以及与ORM框架(如...

    freemarker+action+word

    在Web应用中,如果需要将动态数据导出为Word报告,可以利用Freemarker和Apache POI的组合,Freemarker生成模板,Apache POI将模板转换为Word文档。 结合这三个技术,我们可以构建一个系统,用户在前端进行某些操作...

    Struts2实现饼状图形报表

    Struts2是一个强大的Java web应用程序框架,它基于MVC(Model-View-Controller)设计模式,主要用于构建可维护性高、结构清晰的企业级应用。在实际项目中,数据可视化是必不可少的一部分,饼状图形报表就是一种常用...

    freemarker-2.3.8.jar

    `freemarker-2.3.8.jar` 是一个基于Java的开源模板引擎,主要用于生成动态HTML、XML、PDF、...同时,对于大型项目,还需要考虑与其他技术(如Spring MVC、Struts2等)的集成,以及模板的管理、调试和性能优化等问题。

    ssh框架所需依赖包(完整亲测可用)

    SSH框架是Java开发中常用的三大框架整合,包括Struts2、Spring和Hibernate。这个压缩包提供的是一套完整的、经过测试可用的SSH框架依赖包,适用于构建基于Java的企业级Web应用程序。 1. **Struts2**: Struts2是MVC...

    ssh三大框架所有所需的jar包

    ooxml-schemas-3.11-20141221.jar`、`poi-3.11-20141221.jar`、`poi-ooxml-3.11-20141221.jar`这些文件与Apache POI库相关,主要用于读写Microsoft Office格式的文件,如Excel、Word等,它们在报表生成、数据导出等...

    试验上传试验上传试验上传

    它结合了Model2架构和Action Servlet,提供了拦截器机制,支持多种视图技术如JSP、FreeMarker等,增强了Web应用的可扩展性和灵活性。 3. **Apache POI**: poi-3.0.1-FINAL-20070705.jar 和 poi-scratchpad-3.0.1-...

    java开源包5

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    JEECG 开发指南v2.1.0

    5. 报表整合:JEECG集成了Excel简易导出工具和Highcharts图形报表,方便开发者快速生成各种报表,包括PDF、Excel和Word格式。 6. 工作流设计器:JEECG集成了jbpm工作流设计器,允许开发者在页面配置流程转向,从而...

    java开源包2

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包1

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包11

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包3

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包6

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包10

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包4

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包8

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包7

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

Global site tag (gtag.js) - Google Analytics