在Strtus环境下用POI导出valuelist的查询结果为Excel表 - -
作者:王者之剑
关键词:POI Excel ValueList Struts
注意:本文针对对Struts,Value List有一定使用经验的开发人员,如果你不是在web环境下使用POI,建议你直接去看POI的教程。
1.问题由来
在此之前,我一直用valuelist来完成查询并显示结果,效果不错。valuelist可以导出excel,csv,但是一用之下,并没有相象的那么好,它导出的excel并不是真正的excel文件,是一个html的文本文件,这样由于某些处理上的不完善,在我这里出现了导出的文件在打开时,表头和下面的内容错开,并且有多余的空列。如果对它的有关源代码进行修改,做到正常显示是没问题的,但是如果客户的需求再变一点点,比如要设置一定的格式,用它来做就不太方便了。所以我只好寻求另一种方案,最后终于找到POI,看它的介绍很不错,按照它的指南一试之下,也很简单,于是决定就用它了。现在的问题就是怎样取得valuelist的查询结果,并且用POI导出到Excel中。
2.从web页面动作时调用的Action
在我们真正用到的查询action里只要设置好三个属性值就可以了.
package com.sogoodsoft.test.export.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.*;
import com.sogoodsoft.framework.exporter.ExportBaseAction;
/**
* 导出查询的excel表
*
* @author Albert Song
* @version 1.0
*/
public class ExportQueryAction extends ExportBaseAction {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//列名,必须和applicationContext.xml中对应的sql的列名一致。
// 顺序不必一致
String colNames[]={"stu_no","stu_name"};
//Excel表的表头,列名对应的中文,必须和列名的顺序对应
String titleNames[]={"学号","姓名"};
//applicataionContext.xml中sql对应的id
String valueListName="testList";
// 这三项必须设置
setColNames(colNames);
setTitleNames(titleNames);
setValueListName(valueListName);
return super.export(mapping,form,request,response);
}
}
3.在ExportBaseAction 中取得valuelist的查询结果
valuelist可以不用Struts单独使用,我这里是在Struts中的用法,代码大概像这样
package com.sogoodsoft.framework.exporter;
import java.util.List;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.struts.action.*;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import net.mlw.vlh.*;
import net.mlw.vlh.web.ValueListRequestUtil;
import com.sogoodsoft.util.BaseAction;
/**
*
*
* @author Albert Song
* @version 1.0
*/
public class ExportBaseAction extends BaseAction {
/*
*可导出的最大记录数
*/
private final static int MAX_NUM_PER_PAGE=10000;
private ValueListHandler getValueListHandler() {
WebApplicationContext context = WebApplicationContextUtils
.getWebApplicationContext(getServlet().getServletContext());
return (ValueListHandler) context.getBean("valueListHandler",
ValueListHandler.class);
}
public ActionForward export(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
ValueListInfo vli=ValueListRequestUtil.buildValueListInfo(request);
vli.setPagingNumberPer(MAX_NUM_PER_PAGE);
ValueList valueList = getValueListHandler().getValueList(valueListName,
vli);
List ls=new ArrayList();
ls.add(titleNames);
int colWidths[]=new int[colNames.length];//列宽
for(int i=0;i<colNames.length;i++)
{
colWidths[i]=titleNames[i].length();
}
while(valueList.hasNext())
{
String cols[]=new String[colNames.length];
Object bean=valueList.next();
try {
for(int i=0;i<colNames.length;i++)
{
Object value=PropertyUtils.getProperty(bean,colNames[i]);//关键点
if(value==null)
value="-";
cols[i]=(String)value;
if(colWidths[i]<cols[i].length())
{
colWidths[i]=cols[i].length();
}
}
ls.add(cols);
} catch (Exception e) {
System.out.println("获取valueList的属性值时发生错误");
break;
}
}
ExcelExporter.export(ls,response,colWidths);
return null;
}
/**
* @param colNames返回的记录集的列名.
*/
public void setColNames(String[] colNames) {
this.colNames = colNames;
}
/**
* @param titleNames 表头汉字的字符串数组.
*/
public void setTitleNames(String[] titleNames) {
this.titleNames = titleNames;
}
/**
* @param valueListName 查询用的value list的sql的entry key .
*/
public void setValueListName(String valueListName) {
this.valueListName = valueListName;
}
}
4.真正导出excel的类
这里只是简单的将传入的字符串数组的List导出
package com.sogoodsoft.framework.exporter;
import java.util.List;
import java.io.*;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.*;
/**
* @author Albert Song
*
* 导出数据到Excel文件中
*
*/
public class ExcelExporter {
public static void export(List exportStringArrayList,
HttpServletResponse response) throws Exception {
export(exportStringArrayList,response,null);
}
public static void export(List exportStringArrayList,
HttpServletResponse response,int colWidths[]) throws Exception {
//仅仅为了防止系统抛出空指针异常,这应该算POI的一个bug吧,这个问题花了我半天时间,现在还没搞明白
//总之设置之后就可以用了:)
System.setProperty("org.apache.poi.util.POILogger","org.apache.poi.util.POILogger");
List ls=exportStringArrayList;
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("sheet1");
if(colWidths!=null)
{
for(int i=0;i<colWidths.length;i++)
{
sheet.setColumnWidth((short)i,(short)(colWidths[i]*600));
}
}
for(int i=0;i<ls.size();i++)
{
HSSFRow row = sheet.createRow(i);
String[] strs=(String[])ls.get(i);
for(int j=0;j<strs.length;j++)
{
HSSFCell cell = row.createCell((short) j);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(strs[j]);
}
}
// Get output stream
response.setContentType("application/x-msdownload");
response.setHeader("content-disposition",
"attachment; filename=dataexport.xls");
OutputStream os = response.getOutputStream();
wb.write(os);
os.close();
}
}
5.小结
这不能算是文章,只能算是一个抛砖引玉的笔记,本人学习POI也才一天半,贴出来的目的是为了感谢同样贴出文章的同仁们,他们的无私奉献给了我不少启示,节省了我的时间,因此我觉得花一点时间将我的经验和大家分享是值得的。
分享到:
相关推荐
以下是一个简化的示例,演示了如何使用POI导出Excel: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io....
java使用POI导出 Excel+图片工具类 ,里面含有poi jar包,只调用接口即可直接保存Excel。使用的时候需先把数据封装,具体包装需根据实际导出数据进行处理。文件demo中只提供包装格式。
在这个“POI导出Excel表格”的实例中,我们将深入探讨如何利用Apache POI进行Excel文件的导入与导出操作。 首先,我们需要在项目中集成Apache POI库。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```...
在Java中,如果你需要导出Excel文件,Java POI是一个非常实用的工具。下面将详细介绍如何使用Java POI来实现Excel的导出。 1. **引入依赖** 在Java项目中使用POI,首先需要在项目的构建文件(如Maven的pom.xml或...
POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI...
poi作为导出excel常用的工具,方便快捷。对于excel指定下拉列表的列,如何生成呢?本文提供如何生成下拉列表的excel列
"poi导出excel需要的jar"指的是在使用Apache POI进行Excel导出时,你需要包含特定的JAR依赖文件。 首先,要实现POI导出Excel的功能,你需要下载Apache POI相关的JAR文件。这些文件通常包括以下核心组件: 1. **poi...
在本案例中,我们关注的是如何使用 Apache POI 库来导出 Excel 文件,特别是根据模板导出和简单列表导出。下面将详细介绍这个过程。 1. **Apache POI 概述** Apache POI 提供了 Java API 来读写 Microsoft Office ...
springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式...
在Excel导出中,POI提供了HSSF(Horrible Spreadsheet Format)用于处理老版本的.xls文件,而XSSF则用于处理较新的.xlsx文件。 1. **准备工作**:首先,你需要在项目中引入Apache POI库。如果是Maven项目,可以在...
POI导出Excel参考方法 POI(Poor Obfuscation Implementation)是一个Java的API,用于操作Microsoft Office文档,包括Excel、Word、PowerPoint等。下面是POI导出Excel参考方法的相关知识点: 1. POI的基本概念 ...
本教程将详细讲解如何使用Apache POI在Web环境中导出Excel表格,避免生成不必要的临时文件,从而优化系统资源管理。 一、Apache POI简介 Apache POI 是一个开源项目,它提供了Java API来处理Microsoft的Office格式...
### POI的EXCEL导出,自动换行 在日常工作中,经常需要处理大量的数据导入导出任务,尤其是在企业级应用开发中,Excel文件的处理成为了一项必不可少的能力。Apache POI项目提供了一系列用于读写Microsoft Office...
Java Poi 导出excel(支持各种设置字体、颜色、垂直居中)
标签“源码”和“工具”表明这涉及到实际的代码实现和可以作为工具使用的方法,帮助开发者更便捷地完成Excel导出任务。 压缩包文件“excel-poi”可能包含了相关的示例代码或者已经封装好的POI通用类库,你可以解压...
本篇文章将深入讲解如何使用POI库在Java中实现Excel的导出功能,以及涉及到的相关jar包及其作用。 首先,`poi-ooxml-schemas-3.15-beta1.jar`是POI库中的XML schema定义,用于解析和创建符合Office Open XML标准的...
本主题将深入探讨如何使用POI库导出EXCEL表格,以及如何结合提供的关键代码实现这一功能。 首先,我们需要理解Apache POI库的核心组件——HSSF(Horrible Spreadsheet Format)用于处理.xls格式的Excel文件,而XSSF...
当我们需要导出Excel并设置打印参数时,Apache POI 提供了丰富的功能。 1. **创建Excel工作簿和工作表** 在使用Apache POI导出Excel时,首先需要创建一个`XSSFWorkbook`对象作为工作簿,然后通过工作簿创建`...
在这个场景中,我们关注的是如何使用POI来创建一个功能丰富的Excel导出工具类,它能够自动设置标题、列名、文件名,并且支持插入图片以及合并单元格。下面将详细介绍这些功能的实现。 首先,要创建一个Excel工作簿...