- 浏览: 233943 次
- 性别:
- 来自: 青岛
最新评论
-
石头茨:
请问下楼主,用的什么工作流引擎?
也来show一下我的EXT成果 -
dongdyj:
看完这篇文章犹如看到知音,描述的很好啊。
答复: 如何在敏捷开发中进行数据库设计 -
freezingsky:
这个解决方案极好,之前也曾想过这类问题的解决方法。但明显不如此 ...
将Grails的Flash Scope移植到Struts2 -
xzcgeorge:
将Grails的Flash Scope移植到Struts2 -
yongtree:
liuxuejin 写道例子还不错。但是你说的情景。我真不懂。 ...
基于MongoDB MapReduce的统计分析
Excel这个大家几乎每天都用到的工具,为我们的工作带来了极大的方便。在现在的B/S系统中,特别是很多大型的办公系统中,大量的 报表需要处理,导出EXCEL的功能就显得尤为重要了。导出Excel已经是相当成熟的技术了,但是在java中却不是一件容易的事。特别是在JSF架构的系统中,由于使用的人数和学习的资料都很少,实现导出Excel的功能也颇费周折。由于项目的需要,本人需要实现这样的功能,经过对大量代码的改造,实现了JSF下的生成EXCEL并在客户端实现下载的功能。下面的例子中,我用的是POI来生成Excel。Apache的Jakata项目的POI子项目,目标是处理ole2对象。 POI可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 下载。 编译好的jar主要有这样4个:poi包,poi Browser包,poi hdf包,poi hssf例程包。实际运行时,需要有poi包就可以了。
在下面的工具类中,我通过private static void downloadFile(String strfileName) 这个方法在生成EXCEL以后实现在客户端的下载。在这个类中,这个方法就是经过改造的JSF实现。不过这个工具类有个不足之处就是,传递给downloadFile(String strfileName) 的文件名不支持中文,希望大家注意,也希望各位能给出解决办法。
package mj.util.excel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
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;
/**
* 本工具类解决了java到处Excel,并同时实现了客户端下载 不足之处:下载方法传入的文件名不支持中文
*
* @author yongtree
*
*/
public class ExcelUtils {
private static String sheetName = "data";
private HSSFWorkbook wb;
private HSSFSheet sheet;
private HSSFRow row;
private HSSFCell cell;
private HSSFFont font;
private HSSFCellStyle cellStyle;
private FileOutputStream fileOut;
public ExcelUtils() {
wb = new HSSFWorkbook();
}
/**
* @param excelName
* excel名称。
* @param list
* 这个list里面存放的是对象数组。数组元素可以转化为字符串显示的。这个对象数组一般对应数据库里的几列。
* @param firstRowValue
*/
public void outputExcel(String excelName, List list, String[] firstRowValue) {
try {
this.createSheet(firstRowValue);
this.setValueToRow(excelName, list);
} catch (Exception ex) {
System.out.print(ex);
}
// System.out.println("文件名是:" + excelName);
downloadFile(excelName);
}
public void outputExcel(String excelName, List list) {
try {
this.setValueToRow(excelName, list);
} catch (Exception e) {
// TODO: handle exception
}
downloadFile(excelName);
}
private void setValueToRow(String excelName, List list) {
// 获得JSF上下文环境
FacesContext context = FacesContext.getCurrentInstance();
// 获得ServletContext对象
ServletContext servletContext = (ServletContext) context
.getExternalContext().getContext();
// 取得文件的绝对路径
excelName = servletContext.getRealPath("/UploadFile") + "/" + excelName;
System.out.println("生成文件的路径是:" + excelName);
Object[] obj;
try {
for (int i = 0; i < list.size(); i++) {
row = sheet.createRow(i + 1);
obj = (Object[]) list.get(i);
this.createCell(row, obj);
}
fileOut = new FileOutputStream(excelName);
wb.write(fileOut);
} catch (Exception ex) {
System.out.print("生成报表有误:" + ex);
} finally {
try {
fileOut.flush();
fileOut.close();
} catch (Exception e) {
System.out.println("ExcelUtil.setValueToRow()");
}
}
}
private void createSheet(String[] firstRowValue) {
try {
sheet = wb.createSheet(ExcelUtils.sheetName);
row = sheet.createRow(0);
font = wb.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
cellStyle = wb.createCellStyle();
cellStyle.setFont(font);
for (int i = 0; i < firstRowValue.length; i++) {
cell = row.createCell((short) i);
cell.setCellStyle(cellStyle);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(firstRowValue[i]);
}
} catch (Exception ex) {
System.out.print(ex);
}
}
private void createCell(HSSFRow row, Object[] obj) {
try {
for (int i = 0; i < obj.length; i++) {
cell = row.createCell((short) i);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(obj[i].toString());
}
} catch (Exception ex) {
System.out.print(ex);
}
}
/**
* <p>
* 功能说明:根据提供的文件名下载文件,不支持中文文件名
* </p>
* 此方法由yongtree添加,实现文件生成后的下载
*
* @param strfileName
* String
* @return void
*/
private static void downloadFile(String strfileName) {
try {
// 获得JSF上下文环境
FacesContext context = FacesContext.getCurrentInstance();
// 获得ServletContext对象
ServletContext servletContext = (ServletContext) context
.getExternalContext().getContext();
// 取得文件的绝对路径
String excelName = servletContext.getRealPath("/UploadFile") + "/"
+ strfileName;
File exportFile = new File(excelName);
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
.getCurrentInstance().getExternalContext().getResponse();
ServletOutputStream servletOutputStream = httpServletResponse
.getOutputStream();
httpServletResponse.setHeader("Content-disposition",
"attachment; filename=" + strfileName);
httpServletResponse.setContentLength((int) exportFile.length());
httpServletResponse.setContentType("application/x-download");
// httpServletResponse.setContentType("application/vnd.ms-excel");
byte[] b = new byte[1024];
int i = 0;
FileInputStream fis = new java.io.FileInputStream(exportFile);
while ((i = fis.read(b)) > 0) {
servletOutputStream.write(b, 0, i);
}
} catch (IOException e) {
e.printStackTrace();
}
FacesContext.getCurrentInstance().responseComplete();
}
}
评论
http://purebit.net/showtopic.aspx?page=end&topicid=9744#11013
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
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;
/**
* 本工具类解决了java到处Excel,并同时实现了客户端下载 不足之处:下载方法传入的文件名不支持中文
*
* @author Java程序员,专注于Java领域的开发和新技术的研究
*
*/
public class ExcelUtils {
private static String sheetName = "data";
private HSSFWorkbook wb;
private HSSFSheet sheet;
private HSSFRow row;
private HSSFCell cell;
private HSSFFont font;
private HSSFCellStyle cellStyle;
private FileOutputStream fileOut;
public ExcelUtils() {
wb = new HSSFWorkbook();
}
/**
* @param excelName
* excel名称。
* @param list
* 这个list里面存放的是对象数组。数组元素可以转化为字符串显示的。这个对象数组一般对应数据库里的几列。
* @param firstRowValue
*/
public void outputExcel(String excelName, List list, String[] firstRowValue) {
try {
this.createSheet(firstRowValue);
this.setValueToRow(excelName, list);
} catch (Exception ex) {
System.out.print(ex);
}
// System.out.println("文件名是:" + excelName);
downloadFile(excelName);
}
public void outputExcel(String excelName, List list) {
try {
this.setValueToRow(excelName, list);
} catch (Exception e) {
// TODO: handle exception
}
downloadFile(excelName);
}
private void setValueToRow(String excelName, List list) {
// 获得JSF上下文环境
FacesContext context = FacesContext.getCurrentInstance();
// 获得ServletContext对象
ServletContext servletContext = (ServletContext) context.getExternalContext().getContext();
// 取得文件的绝对路径
excelName = servletContext.getRealPath("/UploadFile") + "/" + excelName;
System.out.println("生成文件的路径是:" + excelName);
ArrayList obj;
try {
for (int i = 0; i < list.size(); i++) {
row = sheet.createRow(i + 1);
obj = (ArrayList)list.get(i);
this.createCell(row, obj);
}
fileOut = new FileOutputStream(excelName);
wb.write(fileOut);
} catch (Exception ex) {
System.out.print("生成报表有误:" + ex);
} finally {
try {
fileOut.flush();
fileOut.close();
} catch (Exception e) {
System.out.println("ExcelUtil.setValueToRow()");
}
}
}
private void createSheet(String[] firstRowValue) {
try {
sheet = wb.createSheet(ExcelUtils.sheetName);
row = sheet.createRow(0);
font = wb.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
cellStyle = wb.createCellStyle();
cellStyle.setFont(font);
for (int i = 0; i < firstRowValue.length; i++) {
cell = row.createCell((short) i);
cell.setCellStyle(cellStyle);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(firstRowValue[i]);
}
} catch (Exception ex) {
System.out.print(ex);
}
}
private void createCell(HSSFRow row, ArrayList obj) {
try {
for (int i = 0; i < obj.size(); i++) {
cell = row.createCell((short) i);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(obj.get(i).toString());
}
} catch (Exception ex) {
System.out.print(ex);
}
}
/**
* <p>
* 功能说明:根据提供的文件名下载文件,不支持中文文件名
* </p>
* 此方法由yongtree添加,实现文件生成后的下载
*
* @param strfileName
* String
* @return void
*/
private static void downloadFile(String strfileName) {
try {
// 获得JSF上下文环境
FacesContext context = FacesContext.getCurrentInstance();
// 获得ServletContext对象
ServletContext servletContext = (ServletContext) context.getExternalContext().getContext();
// 取得文件的绝对路径
String excelName = servletContext.getRealPath("/UploadFile") + "/" + strfileName;
File exportFile = new File(excelName);
HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
httpServletResponse.setHeader("Content-disposition",
"attachment; filename=" + strfileName);
httpServletResponse.setContentLength((int) exportFile.length());
httpServletResponse.setContentType("application/x-download");
// httpServletResponse.setContentType("application/vnd.ms-excel");
byte[] b = new byte[1024];
int i = 0;
FileInputStream fis = new java.io.FileInputStream(exportFile);
while ((i = fis.read(b)) > 0) {
servletOutputStream.write(b, 0, i);
}
} catch (IOException e) {
e.printStackTrace();
}
FacesContext.getCurrentInstance().responseComplete();
}
}
生成报表有误:java.lang.ClassCastException: java.util.ArrayList cannot be cast to [Ljava.lang.Object;
在执行setValueToRow(String excelName, List list)方法中的
obj = (Object[]) list.get(i);行时会抛一个java.lang.ClassCastException:com.tplife.orgadmin.orginfo.vo.OrgView 异常
我的list.get(i)得到的是数据库查询的一条记录
请问我该怎样改
<result type="stream">
<param name="contentType">${attachment.mimeType};charset=GBK</param>
<param name="contentLength">${attachment.content.length()}</param>
<param name="inputName">attachment.content.binaryStream</param>
<param name="contentDisposition">
attachment;filename="${@my.util.CommonUtils@toAnotherCharset(attachment.name,'GBK','ISO-8859-1')}"</param>
<param name="bufferSize">1024</param>
</result>
</action>
</pre> <p> </p>
不知道各位对生成很大的excel文件有何好的解决方法?
strfileName = java.net.URLEncoder.encode(strfileName, "UTF-8");
把上面这句加在你的downloadFile方法中,具体的位置我就不描述了,一看就知道了
用Excel做好模板,存为html格式,改为.jsp,将
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
改为
<meta http-equiv=Content-Type content="application/vnd.ms-excel; charset=gb2312">
在需要显示数据的地方增加脚本。
这样一个正常的JSP,返回到用户时就是一个excel了。
发表评论
-
将Grails的Flash Scope移植到Struts2
2010-03-31 23:38 2239原文:http://www.po-soft.com ... -
解决Struts2和FckEditor冲突最简单的方法
2009-12-16 17:50 1656没用 struts2.0之前 , fck能正常上传图片。 用了 ... -
发现了一个resin和struts2中的一个问题
2008-12-22 13:36 1152在将struts2的工程由tomcat移植到resin中后,突 ... -
hibernate升级到3.2带来EHCache的问题
2008-11-21 08:48 2723hibernte升级到3.2后,工程突然启动不了了,报以下的错 ... -
hibernate升级到3.2带来的count、sum等查询的兼容性问题
2008-11-13 14:25 1270今天调试程序,以前好好的hibernate查询,突然 ... -
SQL Server2005连接自动关闭问题
2008-02-19 09:18 3518数据库从2000升到2005后,换了微软提供的2005驱动,就 ... -
工作流系统一定要使用xml来描述流程吗?
2007-11-27 17:44 3100工作流的数据还是使用数据库存储,但是过程还要xml描述,能不能 ... -
对开源工作流引擎的选择?
2007-11-02 15:45 4512公司要开发OA系统,要在OA系统中加入工作流,我们以前都没做过 ... -
请推荐一下工作流引擎
2007-10-29 14:56 2020公司要做OA系统,要在OA系统中加入工作流。对于这个OA中的工 ...
相关推荐
生成Excel并在客户端下载的JSF实现
在JSF中,可以创建一个动作监听器,调用后端服务生成Excel文件,然后通过HTTP响应头设置Content-Disposition为attachment,引导浏览器下载。 整合上述技术的具体步骤可能包括: 1. 配置JSF,添加必要的库和部署描述...
它支持将资源(如图像、JavaScript和CSS)与Java类打包到jar文件中,同时提供了一种快速生成二进制资源的能力,比如生成图像或Excel电子表格。此外,它还引入了可换肤功能,允许开发者轻松定义和管理颜色方案,通过...
本方案宝典着重探讨了如何在JavaEE环境中高效地实现报表打印,旨在为开发者提供一系列实用的技术选择和最佳实践。以下是针对报表打印方案的重点内容: 1. **JasperReports**: JasperReports是一款开源的报表工具,...
- **Servlet**:Servlet是一种运行在服务器端的Java类,用于处理客户端的HTTP请求并生成响应。它是Java Web开发的核心技术之一,可以用来创建动态的Web页面。 - **JSP (Java Server Pages)**:JSP是一种将HTML、XML...
3. **资源生成**:资源框架还能快速生成各类二进制资源,如图像、音频文件甚至Excel表格,简化了开发过程,提高了生产率。 #### 四、皮肤技术与用户界面设计 RichFaces引入了基于皮肤的设计理念,使用户界面的外观...
Java Web报表库使得开发者能够在服务器端生成报表,并通过HTTP响应发送到客户端,以HTML、PDF或Excel等形式显示。这样,用户可以在浏览器中查看、打印或下载报表,极大地提升了数据的可读性和分析能力。 Java Web...
报表可以通过HTTP请求动态地传送到客户端,支持多种输出格式,如PDF、HTML、Excel、CSV等。 **3. 报表参数** 在Web应用中,报表通常需要动态参数,这些参数可能由用户输入或从Web应用程序中获取。JasperReports...
这个练习集主要是针对JavaEE技术栈的学习与实践,通过"J2EE习题甲.xls"和"J2EE习题乙.xls"两个Excel文件,我们可以深入理解和掌握JavaEE的核心概念和技术。 JavaEE的主要组件包括: 1. **Servlet**:Servlet是...
2.5.6. 对JSF 1.2支持 2.5.7. JAX-WS支持 2.6. 其他 2.6.1. 动态语言支持 2.6.2. 增强的测试支持 2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 ...
2.5.6. 对JSF 1.2支持 2.5.7. JAX-WS支持 2.6. 其他 2.6.1. 动态语言支持 2.6.2. 增强的测试支持 2.6.3. JMX 支持 2.6.4. 将Spring 应用程序上下文部署为JCA adapter 2.6.5. 计划任务 2.6.6. 对Java 5 ...
word、 excel等运行在木机上的应用就属」桌面应用。 2:企业级应用 先解释一下企业级应用:简单的说是大规模的应用,一般使用人数较多,数据量较大, 对系统的稳定性、安全性、可扩展性和可装配性等都有比较高的要求 这是...