`
tedeyang
  • 浏览: 325057 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Excel领域的Velocity:JXLS,强烈推荐!

阅读更多

Excel领域的Velocity:JXLS,强烈推荐!

我终于找到了导出excel视图的最好实现:JXLS
http://jxls.sourceforge.net/

使用JXLS,能够达到Velocity的效果.将excel视图"模板化" .
而jxls不光能输出字符串,还能输出图像,公式计算,自动由sql生成报表等等.
实在是导出excel必备利器啊!
(实在是了不起的创意!如果Word也能有类似实现,哈哈,想想都爽.)

这种模板方式操作excel比POI,JExcelAPI优越之处:
可视化编辑,实现任意复杂的excel,精确控制版面;
使用简单,不需要调用任何API,能够保持与Velocity一致性.
jxls VS poi == velocity VS servlet
(当然,jxls内部其实是使用poi作为底层api)

实际应用技巧:
JXLS 项目里仅仅提供了与WebWork的集成,我针对Spring MVC扩展了一个JxlsExcelView ,类似于Spring的VelocityView,有了这个,同一个模型的数据能够直接提供给 Velocity或者Jxls解析,分别显示出html和excel,而不需要写任何代码.最近在数据分析系统里成功使用了.

 

下面是源码,如何使用我就不多说了,可以参考Spring官方文档中视图部分。

 

package excel.view;

import java.util.Locale;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jxls.transformer.XLSTransformer;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.LocalizedResourceHelper;
import org.springframework.web.servlet.support.RequestContextUtils;
import org.springframework.web.servlet.view.AbstractView;

public class JxlsExcelView extends AbstractView {

	private static String content_type="application/vnd.ms-excel; charset=UTF-8"; 
	private static String extension=".xls";
	
	private String fileName;
	private String location;
	
	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public String getLocation() {
		return location;
	}

	public void setLocation(String location) {
		this.location = location;
	}
	
	public JxlsExcelView() {
		setContentType(content_type);
	}
	
	protected void renderMergedOutputModel(Map map, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		
		HSSFWorkbook workbook;
		
		LocalizedResourceHelper helper=new LocalizedResourceHelper(getApplicationContext());
		Locale userLocale=RequestContextUtils.getLocale(request);
		Resource inputFile=helper.findLocalizedResource(location, extension, userLocale);
		
		XLSTransformer transformer=new XLSTransformer();
	        workbook=transformer.transformXLS(inputFile.getInputStream(), map);


		
		response.setContentType(getContentType());
		response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
		
		ServletOutputStream out=response.getOutputStream();
		workbook.write(out);
		out.flush();		
	}

}
 

后记:

使用时要注意内存,因为jxls不是基于流操作的。不能转换太大的excel,一般超过10M的xls可能造成OOM。


     当需要导出的数据量逐渐增长时,我们就会看到任务管理器里的内存消耗量“蹭蹭蹭”往上涨,直如牛市一发不可收,轻轻松松就“涨停”—— OutOfMemery了。这种情况可以理解:jxls使用poi进行excel操作,这是要先生成一个完整的Workbook对象后再保存到文件的。这 样内存里就需要存放所有的row和cell对象,而且在最后一条数据对象化前内存是始终得不到释放的。
根据经验,导出的数据(纯文本形式)大小如果为1K,需要消耗内存60K。也就是说比率是1:60。(这个比率目前是我大概估计的)。初步估算一下:如果导出的数据一行为250字节,4000行约为1M,导出excel时就需要60M内存。
因此,内存增长是一个问题,还有一个问题就是excel的2^16行数限制。
解决办法需要多管齐下:
1.多sheet进行分页。
2.多workbook进行分文件存储然后合并。
通过两次动作分解,可以将内存消耗维持在一个稳定的水平上。

具体原理不讲了,就发一段测试代码:。。。

 

【2007-7 bbs】

 

分享到:
评论
2 楼 tedeyang 2011-12-01  
anmijay 写道
你好,刚看到这个微博,不知道jxls是否支持自定义导出????

    * Using SQL queries directly in XLS templates
    * Simple property access notation
    * Full expression language support
    * Complex object graph export
    * Flexible collection export
    * Flow-Control Tags support
    * Dynamic grouping of data
    * Export of a single collection into multiple worksheets
    * Adjacent tables support!
    * Complex formulas support
    * Charts, Macros and many other Excel features in XLS template
    * Dynamic Outlines
    * Dynamic Columns Hiding
    * Dynamic Cell Style processing through custom Processors
    * JDBC ResultSet export
    * Merged Cells support
    * Multiple bean properties in a single cell
    * Reading XLS files

把excel作为视图层,excel本身是可以由你自定义的。这种方式是在excel里写java变量,然后直接输出。
1 楼 anmijay 2011-11-28  
你好,刚看到这个微博,不知道jxls是否支持自定义导出????

相关推荐

    velocity-engine-core-2.3-API文档-中英对照版.zip

    赠送jar包:velocity-engine-core-2.3.jar; 赠送原API文档:velocity-engine-core-2.3-javadoc.jar; 赠送源代码:velocity-engine-core-2.3-sources.jar; 赠送Maven依赖信息文件:velocity-engine-core-2.3.pom;...

    velocity:A node velocity template engine. Node 版 velocity 模板引擎

    快速入门一些示例已为您准备好: $ git clone https://github.com/fool2fish/velocity.git$ cd examples尝试一个简单的命令: $ cd hello$ velocity 输出: Hello, velocity!更多例子方法查询查看依赖从模板中提取...

    velocity-tools-2.0.jar

    velocity-tools-2.0.jar velocity-tools-2.0.jar velocity-tools-2.0.jar velocity-tools-2.0.jar velocity-tools-2.0.jar

    jxls导出模板

    这些数据可以通过Spring的ModelAndView、Velocity的Context或者简单的Java对象传递给jxls。例如,如果你有一个User对象列表,你可以创建一个List并将其传递给jxls,它会自动将对象属性填充到模板对应的位置。 接...

    Seurat-to-RNA-Velocity:将Seurat对象与RNA Velocity结合使用的指南

    本指南将演示如何结合RNA Velocity分析使用已处理/标准化的Seurat对象。 请记住,尽管Seurat是基于R的,但是所有可用的RNA Velocity软件/软件包都是Python,因此我们将在两者之间来回移动。 我们将使用以下程序: ...

    generator-velocity:使用 Java Velocity 模板搭建前端 Web 应用程序

    Java Velocity 项目生成器使用 Jave Velocity 模板构建前端 Web 应用程序的生成器。特征CSS 自动前缀带有 LiveReload 的内置预览服务器自动编译 CoffeeScript & Sass 自动 lint 你的脚本自动将图像内联到 css 文件...

    velocity-engine-core-2.3.jar中文-英文对照文档.zip

    (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...

    java-velocity-snippets:Sublime Text 23 的 Java Velocity 片段

    用于 Sublime 文本的 Java Velocity 片段瓦尔斯[设置] 设置变量描述:设置变量的方法回程:虚空#set($${ 1 : var } = ${ 2 : " " })[var] 使用 var 描述:写变量的方法$ ! {${ 2 : var }}大批[aa] array.add 描述:...

    velocity为空判断

    推荐使用此方法,特别是当判断集合对象是否为null时,非常实用。例如: ```velocity #if($null.isNull()) 变量为null #else 变量不为null #endif ``` ### 2. 判断Velocity变量是否为空 在Velocity中,"空"通常...

    velocity例子

    Velocity是Apache软件基金会的一个开源项目,它是一款Java模板引擎,用于生成动态Web内容。 Velocity的主要目的是将呈现逻辑从业务逻辑中分离出来,使得开发者可以专注于应用程序的后端处理,而设计师则可以自由地...

    brackets-velocity:Velocity 语法高亮

    **Velocity 概述** Velocity 是一个基于 Java 的模板引擎,它设计用于生成静态网页或动态内容,如 HTML、XML、JavaScript、SQL 或者其他任何文本格式。Velocity 被广泛应用于 Apache Struts 和其他 Web 应用框架中...

    mat-velocity:提供velocity模板的渲染功能

    mat-velocity 提供velocity模板的渲染功能 Installation npm install --save mat-velocity Usage var mat = require('mat') var velocity = require('mat-velocity') var rewrite = require('mat-rewrite') mat.task...

    velocity:我在 Velocity EU 的演示项目

    **Velocity EU 演示项目概览** "velocity:我在 Velocity EU 的演示项目"这个标题表明,这是一个在 Velocity EU 大会上展示的项目,重点可能在于速度优化或高性能的 JavaScript 应用。Velocity EU 是一个专注于 web ...

    dropdown-menu-with-velocity:下拉菜单与 Velocity.js 一起使用

    **标题解析:** "dropdown-menu-with-velocity" 这个标题表明我们将探讨一个与下拉菜单相关的主题,特别提到了 "Velocity.js",这是一款快速、轻量级的JavaScript动画库,它被用来实现下拉菜单的动态效果。...

    angular-velocity:Velocity的UI Pack插件的AngularJS ngAnimate集成

    script src =" bower_components/velocity/velocity.min.js " > </ script >< script src =" bower_components/velocity/velocity.ui.min.js " > </ script >< script src =" bower_...

    instantdex-velocity:使用 Meteor+Velocity 进行 InstantDEX 测试

    使用 Meteor/Velocity 进行 InstantDEX 测试 InstantDEX Testing with Meteor+Velocity 先决条件 1) NXT must be running (http://nxt.org/) 2) BTCD must be running (https://github.com/jl777/btcd) 1 安装流星...

    spring-boot-velocity:velocity 和spring boot 只要还是熟悉下velocity的基本使用方法

    spring-boot-velocityvelocity 和spring boot 只要还是熟悉下velocity的基本使用方法开始接触下是spring boot 结合下vm模版引擎学习下。需要注意的是解决乱码问题#需要指定下编码格式spring.velocity.properties....

    velocity-1.7-API文档-中文版.zip

    赠送jar包:velocity-1.7.jar; 赠送原API文档:velocity-1.7-javadoc.jar; 赠送源代码:velocity-1.7-sources.jar; 包含翻译后的API文档:velocity-1.7-javadoc-API文档-中文(简体)版.zip 对应Maven信息:...

    velocity 配置jar包

    ** Velocity 模板引擎配置详解 ** Velocity 是一个开源的 Java 模板引擎,它允许开发者将业务逻辑与页面展示分离,使得 HTML 页面更专注于布局和设计,而将动态数据处理交由后端代码处理。Velocity 通过使用简单的...

    velocity语法.pdf

    ### Velocity语法精析 Velocity是一种基于Java的模板引擎,它允许开发者通过简单的语法来动态生成HTML、XML或任何文本格式的文档。其语法简洁且功能强大,被广泛应用于Web开发中,尤其在Java企业级应用中表现突出。...

Global site tag (gtag.js) - Google Analytics