`
bjtale
  • 浏览: 29604 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Jsp2.0环境下的excel下载开发

阅读更多

      首先说一下背景,公司某项目年代久远,大致环境要求如下:不可使用servlet(配置文件更新管理杂乱);基本框架没有,大部分是原始的JSP2.0。这对习惯了热门框架的开发人员来说是一种非常糟糕的体验,不仅维护难度大,并且扩展性极差。但是,还是硬着头皮去做。

主要软件环境:POI3.1,Jsp2.0,JDK1.7

      示例代码如下:

1.前端页面,提供一个下载链接

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Get excel</title>
<script type="text/javascript">
function go_excel(){
	var ff = document.myform;
	ff.action = "/test/pages/do_act.jsp";
	ff.target = "hidden_frame"
	ff.submit();
}
</script>
</head>
<body>
	<form method="post" onsubmit="return false;" name="myform">
		<input type="hidden" name="file_num" value="1">
		<h2>Files to download</h2>
		<a href="javascript:go_excel()">Download</a>
		<iframe name="hidden_frame" src="" frameborder="0" width="0" height="0" scrolling="yes" marginheight="0" marginwidth="0"></iframe>
	</form>
</body>
</html>

2使用JSP作为action处理:

<%@page import="com.yan.service.ExcelExport"%>
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.OutputStream"%>
<%@page import="java.io.File"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String value = request.getParameter("file_num");
	String path = request.getSession().getServletContext().getRealPath("");
	path = path.replace("\\", "/");
	String file_name = "";
	File file = null;
	if("1".equals(value)){
		file_name = "test_xls.xls";
		ExcelExport eep = new ExcelExport(path);
		eep.generateFile(request);
		file = new File(path+"/test_xls.xls");
	}
	response.setHeader("Content-disposition", "attachment;filename="+file_name);
	response.setContentType("application/vnd.ms-excel");
	
	long length = file.length();
	response.setHeader("Content_Length", String.valueOf(length));
	
	OutputStream os = response.getOutputStream();
	byte b[] = new byte[1024];
	FileInputStream in = new FileInputStream(file);
	int len = 0;
	while((len = in.read(b))!=-1){
		os.write(b, 0, len);
	}
	os.flush();
	os.close();//注意下面的用法
	os=null;  
	response.flushBuffer();  
	out.clear();  
	out = pageContext.pushBody();  

	in.close();
%>

值得注意的是:在Jsp中使用OutPutStream时,若不经过特殊处理,程序将会报以下异常:getOutputStream() has already been called for this response。具体原因是因为JSP在编译成Servlet时,在_jspService(HttpServletRequest request, HttpServletResponse response)方法之后有如下的一段代码:

finally {  
     if (_jspxFactory != null)   
          _jspxFactory.releasePageContext(_jspx_page_context);  
}  

 主要作用是释放JSP中使用到的一些内置对象,同时也会调用response.getWriter(),这个方法和response.getOutPutStream()是互相冲突的,因此在输出流使用完毕后需要添加上面的几行特殊处理代码。

3.后端服务程序:

后端程序主要是POI的一些用法,建立excel文件,提供下载。通常在实际应用中,这些数据需要从数据库加载,并非静态数据。

package com.yan.service;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.servlet.http.HttpServletRequest;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

/** 
 * @ClassName: ExcelExport 
 * @Description: (这里用一句话描述这个类的作用) 
 * @author Helen
 * @date 2015年10月6日 上午10:21:39  
 */

public class ExcelExport {
	private String path;

	public String getPath() {
		return path;
	}
	public void setPath(String path) {
		this.path = path;
	}
	public ExcelExport(String path){
		this.path = path;
	}
	
	public void generateFile(HttpServletRequest request){
		HSSFWorkbook workbook = new HSSFWorkbook();
		HSSFSheet sheet = workbook.createSheet("User_info");
		
		sheet.setColumnWidth((short)0, (short)3000);
		sheet.setColumnWidth((short)1, (short)5000);
		sheet.setColumnWidth((short)2, (short)3000);
		
		HSSFRow row = sheet.createRow(0);
		
		HSSFCell cell[] = new HSSFCell[4];
		HSSFCell col_cell = null;
		//DB数据示例
		for (int i = 0; i < cell.length; i++) {
			cell[i] = row.createCell((short)i);
		}
		cell[0].setCellValue(new HSSFRichTextString("编号"));
		cell[1].setCellValue(new HSSFRichTextString("用户名"));
		cell[2].setCellValue(new HSSFRichTextString("性别"));
		cell[3].setCellValue(new HSSFRichTextString("地区"));
		for (int i = 1; i < 11; i++) {
			row = sheet.createRow(i);
			for (int j = 0; j < cell.length; j++) {
				col_cell = row.createCell((short)0);
				col_cell.setCellValue(new HSSFRichTextString("编号"+i));
				col_cell = row.createCell((short)1);
				col_cell.setCellValue(new HSSFRichTextString("用户名"+i));
				col_cell = row.createCell((short)2);
				col_cell.setCellValue(new HSSFRichTextString("性别"+i));
				col_cell = row.createCell((short)3);
				col_cell.setCellValue(new HSSFRichTextString("地区"+i));
			}
		}
		File f = new File(path+"/test_xls.xls");
		if(!f.exists()){
			try {
				f.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		try {
			FileOutputStream os = new FileOutputStream(f);
			workbook.write(os);
			os.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 以上就完成了此次核心功能的开发。

分享到:
评论

相关推荐

    223751-在.NET-2.0下用interop-组件开发报表及在IIS6.0下发布权限解析.doc

    综上所述,该文档提供了一种在.NET 2.0环境下利用Interop组件开发Excel报表的实用方法,同时讨论了在IIS 6.0上部署时可能出现的权限问题及其解决策略,这对于.NET Web开发新手来说是一份有价值的参考资料。

    jSP中导入导出Excel文件

    目前的稳定版本V2.0支持读取Excel公式的计算结果,生成Excel 97格式的数据表,以及对单元格的格式化和颜色操作。 **导入Excel文件** 导入Excel文件通常涉及以下步骤: 1. **创建Workbook对象**:首先,你需要创建...

    在JSP中导出pdf和excel.docx

    在Java Web开发中,JSP(JavaServer Pages)是一种用于创建动态网页的技术。要实现在JSP中导出PDF和Excel文档,通常会利用一些开源库来帮助我们完成这项任务。这里主要涉及到JasperReports、iReport、iText、Apache ...

    脚本批量生成工具,从Excel生成脚本

    项目开发过程中,会做一些重复度较高的开发工作(表结构设计、生成数据库建库脚本、数据字典定义、hibernate映射文件编写、POJO对象文件编写、简单的JSP表单页面).在跨数据库平台的小组中甚至要做到一套程序多套...

    Spring 2.0 开发参考手册

    14.2.3. 帮助简化开发的额外的标签 14.3. Tiles 14.3.1. 需要的资源 14.3.2. 如何集成Tiles 14.4. Velocity和FreeMarker 14.4.1. 需要的资源 14.4.2. Context 配置 14.4.3. 创建模板 14.4.4. 高级配置 ...

    Servlet与JSP核心编程第2版

    2.7 建立开发环境 2.8 测试系统的设置 2.9 实现简化的部署方法 2.10 默认web应用的部署目录:汇总 2.11 web应用:预览 第3章 servlet基础 .3.1 servlet的基本结构 3.2 生成纯文本的servlet 3.3 ...

    Java Web应用开发 59 课堂案例-应用jExcelAPI组件生成Excel文件.docx

    它支持从Excel 2.0到Excel 2007版本的文件格式,并提供了丰富的API来处理这些文件。 - 该组件可以独立使用,也可以集成到Web应用程序或其他Java应用程序中。 - 使用`jExcelAPI`可以方便地创建、读取、修改或保存...

    struts2.0+hibernate3.1+spring2.0实例源码里的jar2

    标题中的"struts2.0+hibernate3.1+spring2.0实例源码里的jar2"指的是一个基于这三个经典技术栈的Web应用程序示例。Struts2、Hibernate和Spring是Java开发中非常流行的开源框架,它们分别用于MVC(模型-视图-控制器)...

    源代码统计工具(SourceCounter) 2.0.9.54

    简介 免费的源代码行数统计工具,支持20多种代码...具有统计迅速、准确的优点,是程序开发人员的必备工具。可以对 VC++/.Net/JAVA/VB/Delphi/ASP/JSP/HTML 等项目的代码进行统计,并能保存统计的结果。 下载地址 ...

    Excel与XML相互转化的Java实现

    3. **JExcelAPI**:用于处理Excel的纯Java API,可从官方网站下载,推荐版本为V2.0。 此外,需设置以下环境变量和文件路径: 1. **PATH环境变量**:包含JDK的安装路径。 2. **CLASSPATH环境变量**:包含JDK库、...

    全面挖掘Java Excel API 使用方法

    Java Excel API 是一个开源项目,专门用于在Java环境中读取、创建和修改Microsoft Excel文件。这个API使得非Windows操作系统上的开发者也能使用纯Java代码处理Excel数据。Java Excel API的稳定版本V2.0支持多种Excel...

    使用Java操纵Excel表.docx

    Java Excel API使得在Web应用程序中处理Excel文件变得更加便捷,例如在JSP或Servlet中生成CSV文件供用户下载,或者通过API直接创建和更新Excel文件,满足数据分析、报表生成等多种需求。由于其跨平台的特性,无论...

    利用 JAVA 操作 EXCEL 文件

    虽然对于Windows用户来说,使用Microsoft Office中的Excel进行日常的数据处理非常直观简便,但对于需要在服务器端或者跨平台环境中处理Excel文件的应用程序而言,使用传统的Office套件就显得不太现实。因此,开发一...

    咖啡智能报表控件 2.0.zip

    咖啡智能报表控件 2.0[下载地址] 咖啡智能报表组件是一个类似Excel风格的报表组件 1、操作风格与EXCEL类似,是一款表格型报表组件,功能强大、操作简单 2、灵活多样性的单元格属性 合并、拆分、对齐方式、背景、...

    jax学习文档和一些学习的例子,利用JAVA操作EXCEL文件

    Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的...

    java操作Excel

    在Web应用中,通常通过JSP或Servlet调用API来实现Excel数据表的访问。 Java Excel API的稳定版本V2.0提供了以下主要功能: 1. 读取不同版本(如Excel 95、97、2000)的数据。 2. 读取Excel 97之后的公式的值。 3. ...

    jsp操作word.doc

    在Web开发中,经常需要处理各种格式的文档,如Word、Excel等。对于Java Server Pages(JSP)而言,利用第三方库或组件来实现对Word文档的操作是一种常见的需求。本文将深入探讨如何使用软航的eOffice2.0组件在JSP...

    jxlreport web组件

    Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的...

Global site tag (gtag.js) - Google Analytics