本文转自 http://lingceng.iteye.com/blog/1820081/

Displaytag官网有1.01.11.2等,注意找到对应的版本。源码和API可以在Maven库中找到。 
  常规的使用不是问题,这里说说关于Excel导出的问题,中文乱码,使用POI等。我使用的是Displaytag1.1。

基本导出功能 
  这种情况只需引入displaytag-1.1.jar。 
  设置column属性media="html"将不会导出,media="excel"不会页面显示,默认既显示又导出。 
  setProperty也可以写在displaytag.properties中应用于所有表格。

<display:table name="test" export="true" id="currentRowObject">
<display:column property="id" title="ID" />
<display:column property="email" />
<display:column property="status" />
<display:column media="html" property="date" />
<display:setProperty name="export.excel" value="true" />
<display:setProperty name="export.excel.filename" value="export.xls" />
</display:table>

这时候导出的excel打开的时候office会报警,但是能够打开,因为这不是正真的excel,只是csv改了后缀的纯文本格式。可能出现中文乱码,通过重载ExcelView来解决。

Class SimpleChineseExcelView extends ExcelView {
public String getMimeType(){
//原代码是return "application/vnd.ms-excel";
return "application/vnd.ms-excel;charset=gbk";
}
}

修改displaytag.properties中对应条目: 
  export.excel.class=yourpackage.SimpleChineseExcelView 
  
  这样就勉强能用了,只要能够忍受每次都需要另存为excel来避免报警,不用中文文件名,不在bodycontent中使用中文。这样的实现只能是差强人意。中文问题解决

使用POI 
  需要引入额外的displaytag-export-excel-1.1.jar,使用Maven解决依赖。 
  修改displaytag.properties中对应条目: 
  export.excel.class=org.displaytag.export.excel.ExcelHssfView 
  配置export filter

<!--Configure the Filter in your web.xml:-->
<filter>
<filter-name>ResponseOverrideFilter</filter-name>
<filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class>
</filter>
<!--And add mappings for urls the filter will intercept, for example:-->
<filter-mapping>
<filter-name>ResponseOverrideFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>ResponseOverrideFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>

filter-mapping加在struts之前,acegi之后(如果有),放struts之后会出问题。 
  很好地解决各种中文问题,也是真正的excel。

实践Hack: 
  项目中已经有了poi3.6,而displaytag-export-excel-1.1依赖的是poi3.0,版本太高,需要重新写一个ExcelHssfView。其实很简单,找到ExcelHssfView的源码,删除其中的所有的setEncoding方法,setEncoding方法在poi3.6中没有。修改后的代码如下,当然记得修改export.excel.class:

package com.lingceng;  

import java.io.OutputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator; import javax.servlet.jsp.JspException; import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.displaytag.Messages;
import org.displaytag.exception.BaseNestableJspTagException;
import org.displaytag.exception.SeverityEnum;
import org.displaytag.export.BinaryExportView;
import org.displaytag.model.Column;
import org.displaytag.model.ColumnIterator;
import org.displaytag.model.HeaderCell;
import org.displaytag.model.Row;
import org.displaytag.model.RowIterator;
import org.displaytag.model.TableModel; /**
* Excel exporter using POI HSSF.
* @author Fabrizio Giustina
* @author rapruitt
* @version $Revision: 1.2 $ ($Author: fgiust $)
*/
public class MyExcelHssfView implements BinaryExportView
{ /**
* TableModel to render.
*/
private TableModel model; /**
* export full list?
*/
private boolean exportFull; /**
* include header in export?
*/
private boolean header; /**
* decorate export?
*/
private boolean decorated; /**
* Generated sheet.
*/
private HSSFSheet sheet; /**
* @see org.displaytag.export.ExportView#setParameters(TableModel, boolean, boolean, boolean)
*/
public void setParameters(TableModel tableModel, boolean exportFullList, boolean includeHeader,
boolean decorateValues)
{
this.model = tableModel;
this.exportFull = exportFullList;
this.header = includeHeader;
this.decorated = decorateValues;
} /**
* @return "application/vnd.ms-excel"
* @see org.displaytag.export.BaseExportView#getMimeType()
*/
public String getMimeType()
{
return "application/vnd.ms-excel"; //$NON-NLS-1$
} /**
* @see org.displaytag.export.BinaryExportView#doExport(OutputStream)
*/
public void doExport(OutputStream out) throws JspException
{
try
{
HSSFWorkbook wb = new HSSFWorkbook();
sheet = wb.createSheet("-"); int rowNum = 0;
int colNum = 0; if (this.header)
{
// Create an header row
HSSFRow xlsRow = sheet.createRow(rowNum++); HSSFCellStyle headerStyle = wb.createCellStyle();
headerStyle.setFillPattern(HSSFCellStyle.FINE_DOTS);
headerStyle.setFillBackgroundColor(HSSFColor.BLUE_GREY.index);
HSSFFont bold = wb.createFont();
bold.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
bold.setColor(HSSFColor.WHITE.index);
headerStyle.setFont(bold); Iterator iterator = this.model.getHeaderCellList().iterator(); while (iterator.hasNext())
{
HeaderCell headerCell = (HeaderCell) iterator.next(); String columnHeader = headerCell.getTitle(); if (columnHeader == null)
{
columnHeader = StringUtils.capitalize(headerCell.getBeanPropertyName());
} HSSFCell cell = xlsRow.createCell((short) colNum++);
cell.setCellValue(columnHeader);
cell.setCellStyle(headerStyle);
//cell.setEncoding(HSSFCell.ENCODING_UTF_16);
}
} // get the correct iterator (full or partial list according to the exportFull field)
RowIterator rowIterator = this.model.getRowIterator(this.exportFull);
// iterator on rows while (rowIterator.hasNext())
{
Row row = rowIterator.next();
HSSFRow xlsRow = sheet.createRow(rowNum++);
colNum = 0; // iterator on columns
ColumnIterator columnIterator = row.getColumnIterator(this.model.getHeaderCellList()); while (columnIterator.hasNext())
{
Column column = columnIterator.nextColumn(); // Get the value to be displayed for the column
Object value = column.getValue(this.decorated); HSSFCell cell = xlsRow.createCell((short) colNum++);
//cell.setEncoding(HSSFCell.ENCODING_UTF_16); if (value instanceof Number)
{
Number num = (Number) value;
cell.setCellValue(num.doubleValue());
}
else if (value instanceof Date)
{
cell.setCellValue((Date) value);
}
else if (value instanceof Calendar)
{
cell.setCellValue((Calendar) value);
}
else
{
cell.setCellValue(escapeColumnValue(value));
} }
}
wb.write(out);
}
catch (Exception e)
{
throw new ExcelGenerationException(e);
}
} // patch from Karsten Voges
/**
* Escape certain values that are not permitted in excel cells.
* @param rawValue the object value
* @return the escaped value
*/
protected String escapeColumnValue(Object rawValue)
{
if (rawValue == null)
{
return null;
}
String returnString = ObjectUtils.toString(rawValue);
// escape the String to get the tabs, returns, newline explicit as \t \r \n
returnString = StringEscapeUtils.escapeJava(StringUtils.trimToEmpty(returnString));
// remove tabs, insert four whitespaces instead
returnString = StringUtils.replace(StringUtils.trim(returnString), "\\t", " ");
// remove the return, only newline valid in excel
returnString = StringUtils.replace(StringUtils.trim(returnString), "\\r", " ");
// unescape so that \n gets back to newline
returnString = StringEscapeUtils.unescapeJava(returnString);
return returnString;
} /**
* Wraps IText-generated exceptions.
* @author Fabrizio Giustina
* @version $Revision: 1.2 $ ($Author: fgiust $)
*/
static class ExcelGenerationException extends BaseNestableJspTagException
{ /**
* D1597A17A6.
*/
private static final long serialVersionUID = 899149338534L; /**
* Instantiate a new PdfGenerationException with a fixed message and the given cause.
* @param cause Previous exception
*/
public ExcelGenerationException(Throwable cause)
{
super(ExcelHssfView.class, Messages.getString("ExcelView.errorexporting"), cause); //$NON-NLS-1$
} /**
* @see org.displaytag.exception.BaseNestableJspTagException#getSeverity()
*/
public SeverityEnum getSeverity()
{
return SeverityEnum.ERROR;
}
} }

displaytag的Excel导出实践的更多相关文章

  1. java 导出 excel 最佳实践,java 大文件 excel 避免OOM(内存溢出) excel 工具框架

    产品需求 产品经理需要导出一个页面的所有的信息到 EXCEL 文件. 需求分析 对于 excel 导出,是一个很常见的需求. 最常见的解决方案就是使用 poi 直接同步导出一个 excel 文件. 客 ...

  2. appfuse:Excel导出

    1.pom.xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi< ...

  3. VB-机房收费系统之Excel导出

    敲机房很久了,感觉对代码的感知力终于有所提高了,很是开心.今天在敲学生充值记录查询的时候发现,其中有了新的知识,  这时候就该到了分析问题的时候了.不说废话了! 首先 保证自己的笔记本或者电脑上必须有 ...

  4. 百万级别数据Excel导出优化

    前提 这篇文章不是标题党,下文会通过一个仿真例子分析如何优化百万级别数据Excel导出. 笔者负责维护的一个数据查询和数据导出服务是一个相对远古的单点应用,在上一次云迁移之后扩展为双节点部署,但是发现 ...

  5. [moka同学笔记]PHPexcel之excel导出和导入

    原案例来自http://www.sucaihuo.com/有修改 1.目录结构(文件不用解释,应该都可以看得懂,直接看代码)

  6. 偷懒小工具 - Excel导出公共类

    说明 最近接了一个任务,就是做一个列表的Excel导出功能.并且有很多页面都会使用这个功能. 导出的Excel大体格式如图 很简单的列表,标题加背景色,然后不同类型,显示方式不一样.对齐方式不一样.不 ...

  7. 转:POI操作Excel导出

    package com.rd.lh.util.excel; import java.beans.PropertyDescriptor; import java.io.FileOutputStream; ...

  8. TP5.0源生Excel导出

    PHPExcel类在TP5里边并不能很好的兼容,使用起来很麻烦. 不像是tp3.2那样直接import()加进来就能new,因为它里边的命名空间找不到.总是说undefined class. 如果是使 ...

  9. java反射学习之二万能EXCEL导出

    一.EXCEL导出的实现过程 假设有一个对象的集合,现在需要将此集合内的所有对象导出到EXCEL中,对象有N个属性:那么我们实现的方式是这样的: 循环这个集合,在循环集合中某个对象的所有属性,将这个对 ...

随机推荐

  1. 【WebKit内核 CEF3 】 第一篇:下载分支代码并本地编译

    关于CEF  Chromium Embedded Framework 简单说就是  WebKit内核的 对外绑定. 当前主流浏览器内核 一.Trident内核代表产品Internet Explorer ...

  2. 如何架设部署V2EX社区/论坛(Google App Engine版)

    1.What's V2EX? 关于这个问题,我们可以看看其作者Livid早期自己的V2EX社区的介绍: What's V2EX? 这是很多人都问过的问题,而我一直都没有做出一个明确的解答.因为我实在觉 ...

  3. 转发:微信小程序-template模板使用

    转载于CSDN--[向朔1992]处.(部分内容根据实际情况有所修改) 小程序实现主页面调用次级页面的wxml页面内容,如下图:   根据上图,我们可以将图片和图片信息作为一个goodsList.wx ...

  4. DP较为完整的知识

    数位DP 这类题,才刚刚接触,记得去年网络赛,就有道这样的题,我完全不会, 对于这类题基本方法是,是利用数的位数来构造转移方程. 下面给出两篇论文的链接: <数位计数问题解法研究> < ...

  5. 使用SoapUI生成WS请求报文

    WSDL地址示例:http://10.1.84.10:8100/webService/common/mail?wsdl   打开SoapUI,创建一个Project,输入wsdl地址就ok. 1.访问 ...

  6. HDFS配额管理指南

    原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_quota_admin_guide.html Hadoop分布式文件系统(HDFS)允许管理员为每个 ...

  7. Python学习笔记015——readline与readlines的区别

    示例1 读取同样一个文件binary_read_1.txt. 春眠不觉晓,处处闻啼鸟. 夜来风雨声,花落知多少. 其中该文件内容被下段代码读出(注意,这里是采用的readlines) f = open ...

  8. Android特性与系统架构

    Android特性与系统架构 一.Android特性 • 应用程序框架支持组件的重用与替换 • Dalvik 虚拟机专为移动设备优化 • 集成的浏览器基于开源的WebKit 引擎 • 优化的图形库包括 ...

  9. X86 寻址方式、AT&T 汇编语言相关知识、AT&T 与 Intel 汇编语言的比较、gcc 嵌入式汇编

    注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料如<linux内核完全剖析>.<linux c 编程一站式学习>等,只是为了更好 ...

  10. Linux标识进程

    一.前言 其实两年前,本站已经有了一篇关于进程标识的文档,不过非常的简陋,而且代码是来自2.6内核.随着linux container.pid namespace等概念的引入,进程标识方面已经有了天翻 ...