`

POI与Struts2的使用 poi-2.5.1.jar

阅读更多

一.POI 简介

Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API

目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。

 

二.HSSF概况

HSSF 是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。

HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。

 

三.开始编码

 

可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi / 最新的POI 工具包

 

HSSFWorkbook excell 文档对象介绍
HSSFSheet excell的表单
HSSFRow excell的行
HSSFCell excell的格子单元
HSSFFont excell字体
HSSFName 名称
HSSFDataFormat 日期格式
在poi1.7中才有以下2项:
HSSFHeader sheet头
HSSFFooter sheet尾
和这个样式
HSSFCellStyle cell样式
辅助操作包括
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表

(以上部分转自http://ltc603.iteye.com/blog/30184)

 

在我们在Service编写操作如下:

package com.mengya.service.imple;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.apache.commons.lang.RandomStringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.mengya.dao.UsersDaoInter;
import com.mengya.entity.Users;
import com.mengya.service.UsersServiceInter;

public class UsersService implements UsersServiceInter {

	private UsersDaoInter usersdao = null;

	public void setUsersdao(UsersDaoInter usersdao) {
		this.usersdao = usersdao;
	}

	@SuppressWarnings("unchecked")
	public InputStream exportUsers() {
		// 创建一个HSSFWorkbook
		HSSFWorkbook wb = new HSSFWorkbook();
		// 由HSSFWorkbook创建一个HSSFSheet
		HSSFSheet sheet = wb.createSheet();
		// 由HSSFSheet创建HSSFRow
		HSSFRow row = sheet.createRow(0);

		HSSFCell cell = row.createCell((short) 0);
		cell.setEncoding(HSSFCell.ENCODING_UTF_16);
		cell.setCellValue("序号");

		cell = row.createCell((short) 1);
		cell.setEncoding(HSSFCell.ENCODING_UTF_16);
		cell.setCellValue("姓");

		cell = row.createCell((short) 2);
		cell.setEncoding(HSSFCell.ENCODING_UTF_16);
		cell.setCellValue("名字");

		cell = row.createCell((short) 3);
		cell.setEncoding(HSSFCell.ENCODING_UTF_16);
		cell.setCellValue("年龄");

		List<Users> userList = this.findAll();
		for (int i = 0; i < userList.size(); i++) {
			Users user = userList.get(i);
			row = sheet.createRow(i + 1);
			cell = row.createCell((short) 0);
			cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			cell.setCellValue(i+1);

			cell = row.createCell((short) 1);
			cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			cell.setCellValue(user.getUfristName());

			cell = row.createCell((short) 2);
			cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			cell.setCellValue(user.getUlastName());

			cell = row.createCell((short) 3);
			cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			cell.setCellValue(user.getUage());
		}
		
		//方法一:生成xls文件到硬盘上,然后再删除该文件(启动一个线程或Servlet启动时删除)
		//自己的方法产生随机的字符串作为文件名
                //参见(http://zmx.iteye.com/admin/blogs/477460)
		//String fileName=RandomFileName2.getRandomString(10);
		//使用apache的commons-lang.jar产生随机的字符串作为文件名
		String fileName=RandomStringUtils.randomAlphanumeric(10);
		//生成xls文件名必须要是随机的,确保每个线程访问都产生不同的文件
		StringBuffer sb=new StringBuffer(fileName);
		final File file = new File(sb.append(".xls").toString());
		try {
			OutputStream os=new FileOutputStream(file);
			try {
				wb.write(os);
				os.close();
			} catch (IOException e) {
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		
		InputStream is=null;
		try {
			is=new FileInputStream(file);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		
		//生成一个线程,splee15秒删除该文件
		new Thread(new Runnable(){

			public void run() {
				try {
					Thread.sleep(15000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				file.delete();
			}
			
		}).start();
		
		return is;

	}
}

 

   对于上面的方法如果服务器停止可能导致有些文件没有删除可能会越来越多,对于tomcat该文件放在tomcat的bin目录中。故我们可以用一个Servlet在服务器启动时删除这些垃圾文件。Servlet如下:

/**
 * 服务器启动时清除服务器中的垃圾文件
 * 
 * @author 张明学
 * 
 */
@SuppressWarnings("serial")
public class DeleteExlFileServlet extends HttpServlet {

	public void destroy() {
		super.destroy();
	}

	public void init() throws ServletException {
		/**第一种方式删除
		 * File file = new File(".");对于tomcat得到的是bin目录
		File file = new File(".");
		File[] subFiles = file.listFiles();
		for (File f : subFiles) {
			if (f.getName().endsWith(".xls")) {
				f.delete();
			}
		}
		**/
		
		File file = new File(".");
		File[] subFiles = file.listFiles(new FileFilter() {
			public boolean accept(File pathname) {
				if (pathname.getName().endsWith(".xls")) {
					return true;
				}
				return false;
			}
		});
		for (File f : subFiles) {
			f.delete();
		}
	}

}

 该Servlet在web.xml中配置如下:

<!-- 该serlvet不需用户访问服务启时执行init就可以了-->
	<servlet>
		<description>服务器启动时删除服务器中的垃圾文件</description>
		<servlet-name>DeleteExlFileServlet</servlet-name>
		<servlet-class>
			com.mengya.servlet.DeleteExlFileServlet
		</servlet-class>
                <!-- 指定服务器启动时执行的次序 -->
		<load-on-startup>10</load-on-startup>
	</servlet>

action中调用该service:

@SuppressWarnings("serial")
public class ExportUsersAction extends ActionSupport {
	private UsersServiceInter userService;

	public void setUserService(UsersServiceInter userService) {
		this.userService = userService;
	}

	@Override
	public String execute() throws Exception {

		return SUCCESS;
	}

	public InputStream getDownloadFile

() {
		return userService.exportUsers();
	}
}

 

struts.xml中的配置如下:

<!-- 将用户信息用Excel导出 -->
		<action name="exportUsers" class="exportUsersAction">
			<result name="success" type="stream">
				<!-- 指定文件下载类型 -->
				<param name="contentType">application/vnd.ms-excel</param>
				<!-- 对于第一个参数默认值为inline这样的话若在线打开的话会生成两个xls文件 -->
				<param name="contentDisposition">attachment;filename="allUsers.xls"</param>
				<param name="inputName">downloadFile

</param>
			</result>
		</action>

 

 

到些第一种方法就写完了,还有一种方法可以不生成Excel文件而是返回一个该xls文件的InputStream

Service中的方法如下:

 

import java.util.List;

import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.mengya.dao.UsersDaoInter;
import com.mengya.entity.Users;
import com.mengya.service.UsersServiceInter;

public class UsersService implements UsersServiceInter {

	private UsersDaoInter usersdao = null;
        
        public void setUsersdao(UsersDaoInter usersdao) {
		this.usersdao = usersdao;
	}   
        
	@SuppressWarnings("unchecked")
	public InputStream exportUsers() {
		// 创建一个HSSFWorkbook
		HSSFWorkbook wb = new HSSFWorkbook();
		// 由HSSFWorkbook创建一个HSSFSheet
		HSSFSheet sheet = wb.createSheet();
		// 由HSSFSheet创建HSSFRow
		HSSFRow row = sheet.createRow(0);

		HSSFCell cell = row.createCell((short) 0);
		cell.setEncoding(HSSFCell.ENCODING_UTF_16);
		cell.setCellValue("序号");

		cell = row.createCell((short) 1);
		cell.setEncoding(HSSFCell.ENCODING_UTF_16);
		cell.setCellValue("姓");

		cell = row.createCell((short) 2);
		cell.setEncoding(HSSFCell.ENCODING_UTF_16);
		cell.setCellValue("名字");

		cell = row.createCell((short) 3);
		cell.setEncoding(HSSFCell.ENCODING_UTF_16);
		cell.setCellValue("年龄");

		List<Users> userList = this.findAll();
		for (int i = 0; i < userList.size(); i++) {
			Users user = userList.get(i);
			row = sheet.createRow(i + 1);
			cell = row.createCell((short) 0);
			cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			cell.setCellValue(i+1);

			cell = row.createCell((short) 1);
			cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			cell.setCellValue(user.getUfristName());

			cell = row.createCell((short) 2);
			cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			cell.setCellValue(user.getUlastName());

			cell = row.createCell((short) 3);
			cell.setEncoding(HSSFCell.ENCODING_UTF_16);
			cell.setCellValue(user.getUage());
		}
		
		/**
		 * 方法二:在内存中返回该InputStream,不生成文件到硬盘上 
		 */
		ByteArrayOutputStream os=new ByteArrayOutputStream();
		try {
			wb.write(os);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		byte[] bytes=os.toByteArray();
		InputStream is=new ByteArrayInputStream(bytes);
		return is;
	}
}

 action中的调用和struts.xml中配置同上面的一样。

 

分享到:
评论
2 楼 kevin_zhm 2012-04-27  
还是不明白。你是怎么调用实现导出的是你页面生成的表
1 楼 rain_08 2011-11-24  
问题 解决了 谢咯

相关推荐

    JavaJar包大全2

    28.struts2-core-2.1.6.jar 29.struts2-spring-plugin-2.1.6.jar 30.woden-api-1.0M8.jar 31.wsdl4j-1.6.2.jar 32.wstx-asl-3.2.4.jar 33.xbean-spring-3.4.jar 34.XmlSchema-1.4.2.jar 35.xwork-2.1.2.jar 36....

    学生选课系统中所用的60个jar包

    java-3.1.12-bin.jar poi-2.5.1.jar quartz-1.5.1.jar spring.jar struts.jar toplink-api.jar velocity-1.4.jar velocity-tools-generic-1.2.jar velocity-tools-view-1.1.jar xapool.jar xerces-2.6.2.jar xml-...

    培训体系管理系统-oracle-ssh

    Oracle10g.jar oscache-2.1.jar persistence.jar poi-2.5.1.jar portlet-api.jar proxool-0.8.3.jar spring-agent.jar spring-aop-2.0.xsd spring-aop.jar spring-beans-2.0.xsd spring-beans.jar spring-context....

    spring-hibernate-dwr实例

    spring-hibernate-dwr做的AJAX操作CRUD实例 ...1.3.jar poi-2.5.1.jar cos.jar velocity-1.5.jar velocity-tools-view-1.3.jar commons-codec.jar dwr-2.0.rc2.jar asm.jar files.lst

    s2sh--lib.rar_s2sh_s2sh l_spring l_ssh_struts2

    8. **poi-2.5.1.jar**:Apache POI是一个用于读写Microsoft Office格式文件的库,这里的版本可能较旧,但仍然用于处理Excel文件。 9. **struts2-core-2.1.6.jar**:Struts2的核心库,包含了控制器、拦截器、结果...

    spring+struts+hibernate+dwr+jstl做的实例

    api.jar jxl.jar itext-1.3.jar poi-2.5.1.jar cos.jar velocity-1.5.jar velocity-tools-view-1.3.jar commons-codec.jar antlr.jar commons-beanutils.jar commons-digester.jar...

    网上购物系统

    &lt;classpathentry kind="lib" path="WebRoot/WEB-INF/lib/poi-2.5.1.jar"/&gt; &lt;classpathentry kind="lib" path="WebRoot/WEB-INF/lib/spring.jar"/&gt; &lt;classpathentry kind="lib" path="WebRoot/WEB-INF/lib/...

    (struts,spring,hibernate) jar 包大全(六)

    - `poi-2.5.1.jar`:Apache POI 是用来处理Microsoft Office格式文件的库,如Excel,Word等。 - `quartz-1.5.2.jar`:Quartz 是一个作业调度框架,用于计划和执行周期性的任务。 - `ratesapi.jar`:可能是某个汇率...

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

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

    ssh2 jar包(还包括Mysql,oracle和验证码的jar包)

    8. `poi-2.5.1.jar`:Apache POI是用于处理Microsoft Office格式(如Excel)的Java库。 9. `mysql-connector-java-5.1.7-bin.jar`:MySQL的Java连接器,用于连接Java应用和MySQL数据库。 10. `commons-collections...

    happycoding_libs_02

    6. **struts.jar** - 这可能是Struts1的库文件,是一个早期的MVC框架,尽管已被Struts2取代,但在一些遗留系统中仍可能被使用。 7. **javassist.jar** - Javaassist是一个用于操作字节码的库,常用于动态代理和AOP...

    instantmessage-lib

    4. **Struts2**: `struts2-core-2.0.11.1.jar`是Apache Struts2框架的一部分,这是一个用于构建MVC(模型-视图-控制器)架构的Java Web应用程序的框架。它简化了开发流程,并提供了丰富的插件和扩展来增强功能。 5....

    SSHJAR包part02

    2. **poi-2.5.1.jar**:Apache POI 是一个用于读写Microsoft Office格式文件的Java库,如Word(DOC)、Excel(XLS)和PowerPoint(PPT)。在Java程序中,可以使用POI来生成、读取和修改这些文件,尤其在数据导入导出...

    ssh项目依赖jar包合集

    7. **poi-2.5.1.jar**:Apache POI是用于处理Microsoft Office格式文件(如Excel)的Java库。在SSH项目中,如果需要读写Excel数据,例如报表导出,那么POI是不可或缺的。 8. **spring-orm-3.2.4.RELEASE-javadoc....

    ssh框架所需依赖包(完整亲测可用)

    8. **POI**: poi-2.5.1.jar是Apache POI项目的一部分,用于读写Microsoft Office格式的文件,如Word、Excel等。在Java应用中,POI可以帮助处理Excel数据。 这些依赖包的组合,为开发者提供了一个功能完备的SSH框架...

    人力资源管理(基于ssh的j2ee项目)附带lib包2

    【标题】"人力资源管理(基于ssh的j2ee项目)附带lib包2"所涉及的知识点主要集中在Java企业级开发领域,特别是Spring、Struts和Hibernate(SSH)框架的集成应用,以及与之相关的技术和工具。这个项目是用于实现全面...

    spring整合hibernate的所需jar包

    8. **jxl.jar**:与POI类似,jxl库也是处理Excel文件的,但版本较旧,可能已不再维护,建议使用POI。 9. **c3p0-0.9.1.2.jar**:C3P0是一个数据库连接池,它提高了数据库连接的效率,通过复用已打开的数据库连接,...

    poi 导出EXCEL 例子

    在给定的文件列表中,我们看到`poi-2.5.1.jar`,这是Apache POI的一个早期版本。现代项目通常会使用更新的版本,如4.x系列,因为它们包含更多的功能和修复了已知问题。你可以通过Maven或Gradle将其添加为依赖项,...

Global site tag (gtag.js) - Google Analytics