`

displaytag的Excel导出实践

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

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

online demo
  <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;
        }
    }

}




2
0
分享到:
评论
2 楼 semmy 2014-02-06  
赞一个
1 楼 李君寻 2013-09-25  

相关推荐

    displaytag-1.1 源码

    3. `displaytag-export-poi`: 这部分代码可能与数据导出功能有关,特别是使用Apache POI库来生成Excel或Word文档。POI是一个流行的API,允许Java程序创建、修改和读取Microsoft Office格式的文件,这对于从Web应用中...

    displaytag简单项目

    6. **导出功能**:可以将表格数据导出为CSV、Excel、PDF等格式,便于数据分析或打印。 在这个"displaytag简单项目"中,你可能需要关注以下几个关键点: 1. **配置DisplayTag**:在项目的web.xml中,你需要配置...

    displaytag简单实例

    4. **下载功能**:DisplayTag支持导出表格数据到各种格式,如CSV、Excel或PDF,使得用户可以方便地保存和共享数据。 5. **国际化与本地化**:DisplayTag支持多种语言,可以根据用户浏览器的设置自动调整标签的文本...

    displaytag-DEMO.zip_DEMO_displaytag de_displaytag demo_displayta

    DisplayTag内置了多种数据导出格式,包括CSV、Excel、PDF和XML。只需简单配置,用户就可以将表格数据导出为这些格式,这对于数据交换和备份具有很高的实用性。 5. **自定义样式和模板** DisplayTag允许开发者通过...

    displaytag

    5. **导出功能**:DisplayTag允许将表格数据导出为CSV、Excel、PDF等多种格式,这在数据分析和报告生成时非常有用。 6. **自定义行为**:DisplayTag的标签可以扩展,允许开发者添加自定义的行为和样式,以满足特定...

    displaytag的使用 eclipse工程

    6. **导出功能**:DisplayTag支持导出表格数据为CSV、Excel、PDF等格式。通过设置`export`属性为true并指定`exportNames`,可以开启导出功能。 7. **国际化与本地化**:DisplayTag允许开发者使用资源包来支持多语言...

    displaytag1.2及所需全部jar包和实例

    5. **导出功能**:DisplayTag可以将表格数据导出为CSV、Excel、PDF等多种格式,便于数据分析和共享。 6. **可扩展性**:DisplayTag提供了丰富的扩展接口,可以添加自定义的行为和功能,如自定义列渲染、过滤器等。 ...

    displaytag-1.1.rar_displaytag

    - **导出**:DisplayTag还支持将表格数据导出为CSV、Excel、PDF等多种格式。 4. **自定义和扩展**:DisplayTag提供了丰富的API和接口,允许开发者自定义显示行为,如创建新的标签、过滤器、格式化器等。通过扩展...

    分页组件displaytag使用笔记

    用户可以通过点击DisplayTag提供的导出链接,将表格数据导出为CSV、Excel或PDF格式。只需设置`export`属性为true,并配置相应的导出参数即可。 9. **自定义样式** DisplayTag允许开发者通过CSS来定制表格的样式,...

    displayTag应用代码

    5. **导出功能**:DisplayTag提供了将表格数据导出为CSV、Excel、PDF等格式的功能,只需添加相应的导出链接即可。 6. **条件渲染**:你可以使用DisplayTag的条件渲染功能,根据数据的值来决定单元格的样式或内容。 ...

    displaytag 例子

    7. **导出功能**:DisplayTag支持将表格数据导出为CSV、Excel、PDF等多种格式,只需设置`export`属性即可。 在"自己做的小例子"这个文件中,你可能会找到一些具体的代码示例,演示如何在实际项目中集成和使用...

    displaytag 详解

    - **导出**:使用`export`属性,可以将表格数据导出为CSV、Excel、XML等多种格式。 3. **样式与CSS** DisplayTag允许开发者使用CSS来控制表格的外观。例如,可以使用`class`属性为行或列设置CSS类,或者使用`...

    displaytag小小研究

    5. **导出功能**:DisplayTag可以将表格数据导出为CSV、Excel、PDF等多种格式,方便用户进行数据的离线分析。 6. **自定义样式和模板**:DisplayTag允许开发者使用CSS和JSP标签来自定义表格的外观和布局,提高表格...

    diaplayTag学习资料

    - **导出功能**:能够将表格数据导出为CSV、Excel、PDF等多种格式,便于数据分析和共享。 - **可扩展性**:通过扩展标记库和自定义标签,可以实现复杂的数据呈现逻辑。 2. **DisplayTag安装与配置** 在项目中...

    diplaytag例子

    5. **导出功能**:DisplayTag可以将表格数据导出为CSV、Excel、PDF等多种格式,方便用户进一步处理或打印。 6. **自定义样式**:通过使用CSS,你可以轻松调整表格的外观,使其符合网站的整体设计。 7. **列隐藏与...

    Dislay分页

    4. **功能丰富**:除了分页,还包括列排序、筛选、导出(如CSV、PDF、Excel)等实用功能。 5. **兼容性**:DisplayTag与主流的Java Web框架如Struts、Spring MVC等良好集成,可以无缝地融入到现有项目中。 `...

    dispalytag demo

    - 数据导出:通过`export`属性,可以将表格数据导出为CSV、Excel或PDF格式。 5. **整合Spring MVC**: 如果项目使用了Spring MVC,DisplayTag可以与之完美结合。数据模型可以通过ModelAndView或者Model对象传递...

    display tag使用总结文档

    - **导出**:启用`export`属性后,用户可以选择导出表格数据为CSV、Excel或PDF格式。 - **国际化**:Display Tag支持多语言,可以使用`bundle`和`locale`属性指定资源包和语言环境。 5. **自定义行为和样式** - ...

Global site tag (gtag.js) - Google Analytics