poi动态导出excel(适合多数据).doc_第1页
poi动态导出excel(适合多数据).doc_第2页
poi动态导出excel(适合多数据).doc_第3页
poi动态导出excel(适合多数据).doc_第4页
poi动态导出excel(适合多数据).doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

最近做项目时遇到将数据导出成excel的功能,在网上也找了不少资料现在将资料整理如下一来是将来再用时方便,二来是希望对有兴趣的人有所帮助 采用的技术是poi,相关jar包可以到apache官网找,我这里用的是3.9的版本,下载地址如下:/dyn/closer.cgi/poi/release/bin/poi-bin-3.9-20121203.zip 一下面这个类属于封装类:ExportExcel.java :package com.yutian.lbs.navigation.payment.platform.util;import java.io.IOException;import java.io.OutputStream;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.Collection;import java.util.Iterator;import java.util.regex.Matcher;import java.util.regex.Pattern;import mons.lang3.exception.ExceptionUtils;import org.apache.log4j.Logger;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFClientAnchor;import org.apache.poi.hssf.usermodel.HSSFPatriarch;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;/* * File Name: ExportExcel.java * Description: 利用开源组件POI3.0.2动态导出多个EXCEL文档 ! * Copyright(c) 2010-2013 Inc. All Rights Reserved. * Other: * Date:2013-10-25 * Modification Record 1: * * Modified Date: * Version: * Modifier: * Modification Content: * * Modification Record 2: * version 1.0 * author LiQing * param * 应用泛型,代表任意一个符合javabean风格的类 * 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx() * byte表jpg格式的图片数据 */public class ExportExcel private final static Logger log = Logger.getLogger(ExportExcel.class); / 声明一个工作薄 private static HSSFWorkbook workbook = null; / 生成一个表格 private static HSSFSheet sheet = null; / 产生表格标题行 private static HSSFRow row = null; / 声明一个画图的顶级管理器 private static HSSFPatriarch patriarch = null; /定义一个excel所容纳的初始数据量(防止数据过多,因为一个excel表格最多只能存65535行记录(excel2003的),所以这里取40000 private static Integer initial_data = 40000; /累计遍历的数量,用来判断是否超过初始数据,如果超过则新建一个sheet private int length = 0; public void exportExcel(String headerName,Collection dataset, OutputStream out) exportExcel(headerName, null, dataset, out, yyyy-MM-dd); public void exportExcel(String headerName,String headers, Collection dataset, OutputStream out) exportExcel(headerName, headers, dataset, out, yyyy-MM-dd); /* * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上 * * param title * 表格标题名 * param headers * 表格属性列名数组 * param dataset * 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的 * javabean属性的数据类型有基本数据类型及String,Date,byte(图片数据) * param out * 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 * param pattern * 如果有时间数据,设定输出格式。默认为yyy-MM-dd */ SuppressWarnings(unchecked) public void exportExcel(String title, String headers, Collection dataset, OutputStream out, String pattern) workbook = new HSSFWorkbook(); sheet = workbook.createSheet(title); / 设置表格默认列宽度为15个字节 sheet.setDefaultColumnWidth(15); row = sheet.createRow(0); for (int i = 0; i headers.length; i+) HSSFCell cell = row.createCell(i); HSSFRichTextString text = new HSSFRichTextString(headersi); cell.setCellValue(text); patriarch = sheet.createDrawingPatriarch(); / 遍历集合数据,产生数据行 Iterator it = dataset.iterator(); int index = 0; while (it.hasNext() index+; length+; row = sheet.createRow(index); T t = (T) it.next(); / 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值 Field fields = t.getClass().getDeclaredFields(); for (int i = 0; i fields.length; i+) HSSFCell cell = row.createCell(i); Field field = fieldsi; String fieldName = field.getName(); String getMethodName = get + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1); try Class tCls = t.getClass(); Method getMethod = tCls.getMethod(getMethodName, new Class ); Object value = getMethod.invoke(t, new Object ); / 判断值的类型后进行强制类型转换 String textValue = null; if (null != value) if (value instanceof Integer) int intValue = (Integer) value; cell.setCellValue(intValue); else if (value instanceof Float) float fValue = (Float) value; textValue = Float.toString(fValue); cell.setCellValue(textValue); else if (value instanceof Double) double dValue = (Double) value; textValue = Double.toString(dValue); cell.setCellValue(textValue); else if (value instanceof Long) long longValue = (Long) value; cell.setCellValue(longValue); else if (value instanceof byte) / 有图片时,设置行高为60px; row.setHeightInPoints(60); / 设置图片所在列宽度为80px,注意这里单位的一个换算 sheet.setColumnWidth(i, (short) (35.7 * 80); / sheet.autoSizeColumn(i); byte bsValue = (byte) value; HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6, index); anchor.setAnchorType(2); patriarch.createPicture(anchor, workbook.addPicture( bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG); else / 其它数据类型都当作字符串简单处理 textValue = value.toString(); else textValue = ; / 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成 if (textValue != null) Pattern p = Ppile(/d+(/./d+)?$); Matcher matcher = p.matcher(textValue); if (matcher.matches() / 是数字当作double处理 cell.setCellValue(Double.parseDouble(textValue); else HSSFRichTextString richString = new HSSFRichTextString(textValue); cell.setCellValue(richString); catch (Exception e) log.error( ExceptionUtils.getStackTrace(e); if(length%initial_data =0) sheet = workbook.createSheet(title+length); / 设置表格默认列宽度为15个字节 sheet.setDefaultColumnWidth(15); row = sheet.createRow(0); for (int i = 0; i headers.length; i+) HSSFCell cell = row.createCell(i); HSSFRichTextString text = new HSSFRichTextString(headersi); cell.setCellValue(text); patriarch = sheet.createDrawingPatriarch(); index = 0; try workbook.write(out); catch (IOException e) log.error( ExceptionUtils.getStackTrace(e); log.error( 导出数据出错); 二下面是在本地导出的测试方法,只需调用上面这个类: public static void main(String args0) / 测试学生 ExportExcel ex = new ExportExcel(); String headers = 学号, 姓名, 年龄, 性别, 出生日期 ; List dataset = new ArrayList(); dataset.add(new Student(10000001, 张三, 20, true, new Date(); dataset.add(new Student(20000002, 李四, 24, false, new Date(); dataset.add(new Student(30000003, 王五, 22, true, new Date(); / 测试图书 ExportExcel ex2 = new ExportExcel(); String headers2 = 图书编号, 图书名称, 图书作者, 图书价格, 图书ISBN, 图书出版社, 封面图片 ; List dataset2 = new ArrayList(); try BufferedInputStream bis = new BufferedInputStream( new FileInputStream( src/test/java/com/yutian/lbs/navigation/payment/platform/test/ExportExcel/book.jpg); byte buf = new bytebis.available(); while (bis.read(buf) != -1) / dataset2.add(new Book(1, jsp, leno, 300.33f, 1234567, 清华出版社, buf); dataset2.add(new Book(2, java编程思想, brucl, 300.33f, 1234567, 阳光出版社, buf); dataset2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论