java实现把对象数组通过excel方式导出的功能

一、导入相关jar包,pom依赖如下:

  <dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>RELEASE</version>
  </dependency> 

二、开始撸代码

1.如果导出功能使用的比较多,可以将其做成一个工具类,对我下面贴出的代码进行改造

//结果返回的是写入的记录数(以下用的是自己业务场景数据)
  public int downLoadToExcel(OutputStream outputStream,List<PaimaiMoneyVO> paimaiMoneyVOList) {
     //文档对象
  HSSFWorkbook wb = new HSSFWorkbook();
  int rowNum = 0;
  Sheet sheet = wb.createSheet("excel的标题");
  Row row0 = sheet.createRow(rowNum++);
    //因为场景不同,titil不同,可以在外面写成数组当参数传进来
  row0.createCell(0).setCellValue("第一列属性名");
  row0.createCell(1).setCellValue("第二列属性名");
  row0.createCell(2).setCellValue("第三列属性名");
  row0.createCell(3).setCellValue("第四列属性名");
  row0.createCell(4).setCellValue("第五列属性名");
  row0.createCell(5).setCellValue("第六列属性名");
     if (paimaiMoneyVOList != null && paimaiMoneyVOList.size() > 0) {
   for (PaimaiMoneyVO paimaiMoneyVO : paimaiMoneyVOList) {
    Row row = sheet.createRow(rowNum++);
    row.createCell(0).setCellValue(paimaiMoneyVO.getPaimaiId());
    row.createCell(1).setCellValue(paimaiMoneyVO.getTitle());
    row.createCell(2).setCellValue(paimaiMoneyVO.getUsername());
    row.createCell(3).setCellValue(paimaiMoneyVO.getMoney()+"元");
    row.createCell(4).setCellValue("升价拍");
    row.createCell(5).setCellValue(bidder);
   }
  }
  try {
   wb.write(outputStream);
   LogEnum.LAW_WARE.info("表数据写入到excel表成功,一共写入了"+(rowNum - 1)+"条数据");
   outputStream.close();
  } catch (IOException e) {
   LogEnum.LAW_WARE.error("流关闭异常!", e);
  } finally {
   if (outputStream != null) {
    try {
     outputStream.close();
    } catch (IOException e) {
     LogEnum.LAW_WARE.error("流关闭异常!", e);
    }
   }
  }
  return rowNum - 1;
 }

2.“工具类”写好后,下面就开始使用它了,从上面的函数参数可以看到,我们需要传过去两个对象,一个是输出流OutPutStream,通过流的方式把excel想要到浏览器,

另外一个就是我们需要导出的对象数组,好了,不解释太多,看代码。(下面的方法写在action层,通过struts.xml配置访问即可实现下载)

public void exportBail(){
  this.fileName = "excel文件名";
  try {
   List<PaimaiMoneyVO> paimaiMoneyVOList = new ArrayList<>();
      //下面是我的业务场景获取对象数组
   if(paimaiMoneySearchParam!=null){
    paimaiMoneySearchParam.setVendorId(WebHelper.getVenderId());
    paimaiMoneySearchParam.setPageSize(Constants.AUCTION_WARE_PAGE_SIZE);
    paimaiMoneySearchParam.setPage(page);
    PaimaiMoneyDto paimaiMoneyDto = auctionWareService1.searchPopPaimaiMoneyList(paimaiMoneySearchParam);
    if(paimaiMoneyDto!=null){
     int count = paimaiMoneyDto.getCount();
     int totalPage = count/ Constants.AUCTION_WARE_PAGE_SIZE + (count% Constants.AUCTION_WARE_PAGE_SIZE > 0?1:0);
     for(int i=1;i<=totalPage;i++){
      paimaiMoneySearchParam.setPage(i);
      PaimaiMoneyDto paimaiMoneyResultResult = auctionWareService1.searchPopPaimaiMoneyList(paimaiMoneySearchParam);
      if(paimaiMoneyResultResult!=null){
       paimaiMoneyVOList.addAll(paimaiMoneyResultResult.getList());
      }
     }
    }
   }
   OutputStream outputStream = response.getOutputStream();
   response.reset();//清空输出流
   //下面是对中文文件名的处理
   response.setCharacterEncoding("UTF-8");//设置相应内容的编码格式
       //解析浏览器
   final String userAgent = request.getHeader("USER-AGENT").toLowerCase();
   if(userAgent.contains("firefox")){ //火狐浏览器
    fileName = new String(fileName.getBytes(), "ISO8859-1");
   }else{
    fileName = URLEncoder.encode(fileName, "UTF-8"); //其他浏览器
          fileName = fileName.Replace("+", "%20"); //encode后替换,解决空格问题(其中%20是空格在UTF-8下的编码 ,如果不这么写,浏览器会用+代替空格)
   }
   response.setHeader("Content-Disposition", "attachment;filename=" +fileName + ".xls");//指定输出文件名
   response.setContentType("application/msexcel");//定义输出类型
   int rouNum = ensurePriceListToExcel(outputStream,paimaiMoneyVOList);
   LogEnum.LAW_WARE.info("【RiseAuctionAction.downLoadEnsurePriceExcel】导出成功,一共更新了{"+rouNum+"}条记录");
  } catch (Exception e) {
   LogEnum.LAW_WARE.error("【RiseAuctionAction.downLoadEnsurePriceExcel】导出失败,error is {}", e);
  }
 }

三、拓展(详细的工具类开发)

如果你觉得上面写的太简单了,可以继续往下看,我把它整理出了“万能”的工具类,供大家参考。

package com.jd.pop.auction.util.excel;
import com.jd.common.web.result.Result;
import com.jd.pop.auction.util.excel.annotations.ExcelColumn;
import com.jd.pop.auction.util.excel.annotations.ExcelMapping;
import com.jd.pop.auction.util.excel.annotations.apt.ExcelColumnAPT;
import com.jd.pop.auction.util.excel.annotations.apt.ExcelMappingAPT;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
public class GenerateExcel {
 private final static Logger LOG = Logger.getLogger(GenerateExcel.class);
 private HSSFWorkbook workbook;
 private HSSFCellStyle headStyle;
 private HSSFFont headCellFont;
 private HSSFCellStyle theadStyle;
 private HSSFFont theadCellFont;
 private HSSFCellStyle tbodyStyle;
 private HSSFFont tbodyCellFont;
 private HSSFFont stringFont;
 private static final short COLUMN_WIDTH = 15;
 private static final short ROW_HEIGHT = 400;
 public GenerateExcel() {
  this.workbook = new HSSFWorkbook();
  //标题
  this.headStyle = workbook.createCellStyle();
  headStyle.setFillForegroundColor(HSSFColor.GREY_50_PERCENT.index);
  headStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//  headStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//  headStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//  headStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
//  headStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
  headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

//  headStyle.setWrapText(true);
  this.headCellFont = workbook.createFont();
  headCellFont.setFontHeightInPoints((short)13);
  headCellFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  headStyle.setFont(headCellFont);
  this.theadStyle = workbook.createCellStyle();
  theadStyle.setFillForegroundColor(HSSFColor.WHITE.index);
  theadStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  theadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  theadStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  theadStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
  theadStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
  theadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  theadCellFont = workbook.createFont();
  theadCellFont.setColor(HSSFColor.BLACK.index);
  theadCellFont.setFontHeightInPoints((short) 12);
  theadCellFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  theadStyle.setFont(theadCellFont);
  tbodyStyle = workbook.createCellStyle();
  tbodyStyle.setFillForegroundColor(HSSFColor.WHITE.index);
  tbodyStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  tbodyStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  tbodyStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  tbodyStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
  tbodyStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
  tbodyStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  tbodyStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  tbodyCellFont = workbook.createFont();
  tbodyCellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
  tbodyStyle.setFont(tbodyCellFont);
  stringFont = workbook.createFont();
  stringFont.setColor(HSSFColor.BLACK.index);
 }
 public <T> Result export(List<String> titles, Field[] fields, Class clazz, Collection<T> dataset, OutputStream out, boolean pager) {
  Result result = new Result(false);
  if(pager){
  }else{
   HSSFSheet sheet = workbook.createSheet( "第一页");
   sheet.setDefaultColumnWidth(COLUMN_WIDTH);
   sheet.setDefaultRowHeight(ROW_HEIGHT);
   //标题
   for (int i = 0; i <titles.size(); i++) {
    HSSFRow titleRow = sheet.createRow(i);
    titleRow.setHeightInPoints(20f);
    sheet.addMergedRegion(new CellRangeAddress(i,i,0,fields.length-1));
    HSSFCell titleCell =titleRow.createCell(0);
    titleCell.setCellValue(titles.get(i));
    titleCell.setCellStyle(headStyle);
   }
   //列名
   HSSFRow row = sheet.createRow(titles.size());
   for (short i = 0; i < fields.length; i++) {
    HSSFCell cell = row.createCell(i);
    cell.setCellStyle(theadStyle);
    if(fields[i].isAnnotationPresent(ExcelColumn.class)){
     ExcelColumn an_1 = fields[i].getAnnotation(ExcelColumn.class);
     HSSFRichTextString text = new HSSFRichTextString(an_1.name());
     cell.setCellValue(text);
    }else if(fields[i].isAnnotationPresent(ExcelMapping.class)){
     ExcelMapping an_1 = fields[i].getAnnotation(ExcelMapping.class);
     HSSFRichTextString text = new HSSFRichTextString(an_1.name());
     cell.setCellValue(text);
    }
   }
   Iterator<T> it = dataset.iterator();
   int index = titles.size();
   while (it.hasNext()) {
    index++;
    row = sheet.createRow(index);
    T t = (T) it.next();
    for (short i = 0; i < fields.length; i++) {
     HSSFCell cell = row.createCell(i);
     cell.setCellStyle(tbodyStyle);
     Field field = fields[i];
     try {
      String textValue;
      if(field.isAnnotationPresent(ExcelMapping.class)){
       textValue = new ExcelMappingAPT().getColumnValue(field,t,clazz);
      }else{
       textValue = new ExcelColumnAPT().getColumnValue(field,t,clazz);
      }
      cell.setCellValue(textValue);
     } catch (NoSuchMethodException e) {
      String errorMsg = field.getName() +"字段,第"+ index+ "条数据, NoSuchMethodException 反射错误!";
      LOG.error(errorMsg,e);
      result.addDefaultModel(errorMsg);
      return result;
     } catch (IllegalAccessException e) {
      String errorMsg = field.getName() +"字段,第"+ index+ "条数据, IllegalAccessException ";
      LOG.error(errorMsg,e);
      result.addDefaultModel(errorMsg);
      return result;
     } catch (InvocationTargetException e) {
      String errorMsg = field.getName() +"字段,第"+ index+ "条数据, InvocationTargetException ";
      LOG.error(errorMsg,e);
      result.addDefaultModel(errorMsg);
      return result;
     }
    }
   }
  }
  try {
   workbook.write(out);
   result.setSuccess(true);
   return result;
  } catch (IOException e) {
   String errorMsg = "将导出数据写入输出流失败!";
   LOG.error("将导出数据写入输出流失败! ",e);
   result.addDefaultModel(errorMsg);
   return result;
  }finally {
   try {
    out.close();
   } catch (IOException e) {
    String errorMsg = "关闭输出流异常!";
    LOG.error("关闭输出流异常! ",e);
    result.addDefaultModel(errorMsg);
    return result;
   }
  }
 }
}
public class ExportExcelUtils {
 private final static Logger LOG = Logger.getLogger(ExportExcelUtils.class);
 public static <T> Result export(List<String> titles,List<T> sourceList, OutputStream out, boolean pager){
  Result result = new Result(false);
  if(CollectionUtils.isEmpty(sourceList)){
   result.addDefaultModel("ExportExcelUtils's param sourceList is empty!");
   LOG.error("ExportExcelUtils's param sourceList is empty!");
   return result;
  }
  if( out == null){
   LOG.error("ExportExcelUtils's param OutputStream is null!");
   result.addDefaultModel("ExportExcelUtils's param OutputStream is null!");
   return result;
  }
  Class clazz = null;
  Field[] fieldArr = null;
  try{
   //得到需要转换的列名
   clazz = sourceList.get(0).getClass();
   Field[] fields = clazz.getDeclaredFields();
   List<Field> fieldList = new ArrayList<Field>();
   for(Field field:Arrays.asList(fields)){
    field.setAccessible(true);
    if(field.isAnnotationPresent(ExcelColumn.class)){
     fieldList.add(field);
    }else if(field.isAnnotationPresent(ExcelMapping.class)){
     fieldList.add(field);
    }
   }
   if(CollectionUtils.isEmpty(fieldList)){
    LOG.error("实体类中无需要导出的字段!");
    result.addDefaultModel("实体类中无需要导出的字段!");
    return result;
   }
   fieldArr = fieldList.toArray(new Field[fieldList.size()]);
  }catch(Exception e){
   LOG.error("数据拼装异常!");
   result.addDefaultModel("数据拼装异常!");
   return result;
  }
  //生成excel
  GenerateExcel ge = new GenerateExcel();
  return ge.export(titles,fieldArr,clazz,sourceList,out,false);
 }

}

这一部分写的比较粗糙,但是实现的比较详细,仅供参考,大家可以稍微改造成为自己独有的utils。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

(0)

相关推荐

  • 在java poi导入Excel通用工具类示例详解

    前言 本文主要给大家介绍了关于java poi导入Excel通用工具类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 问题引入和分析 提示:如果不想看罗嗦的文章,可以直接到最后点击源码下载运行即可 最近在做一个导入Excel的功能,在做之前在百度上面查找"java通用导入Excel工具类",没有查到,大多数都是java通用导出Excel.后来仔细想想,导出可以利用java的反射,做成通用的,放进相应的实体成员变量中,导入为什么不可以呢?也是可以的,不过在做

  • JavaWeb导出Excel文件并弹出下载框

    一.引言 在Java Web开发中经常涉及到报表,最近做的项目中需要实现将数据库中的数据显示为表格,并且实现导出为Excel文件的功能. 二.相关jar包 使用POI可以很好的解决Excel的导入和导出的问题,POI下载地址: poi-3.6-20091214.jar 三.关键代码 首先导入上述jar包. 在生成excel时一般数据源形式为一个List,下面把生成Excel格式的代码贴出来: /** * 以下为生成Excel操作 */ // 1.创建一个workbook,对应一个Excel文件

  • Java FineReport报表工具导出EXCEL的四种方式

    在实际的应用中会经常需要将数据导出成excel,导出的方式除原样导出还有分页导出.分页分sheet导出和大数据量导出.对于excel2003版,限制了每个sheet的最大行数和列数,大数据量导出时会默认时分多个sheet,而excel2007不会出现这样的问题.这些导出方式在JAVA程序中分别有不同的接口来实现: 1. 原样导出 原样导出就是不预览直接导出excel 其程序接口代码如下: outputStream = new FileOutputStream(new File("E:\\Exce

  • Java程序实现导出Excel的方法(支持IE低版本)

    今天想整理一下自己前段时间遇到的一个导出的问题. 因为项目的需求,要做一部分导出功能.开始的时候用的公司的导出,但是很奇怪有部分模块导出的时候就是会报500错误,发现在删减一些字段后就恢复了正常,当时因为项目紧张,也就临时删减了一些,但也不是长久之计,之后自己在原本的基础上重新修改整理了一下,目前运行还算稳定,就此和大家分享一下. 导出需要三个部分,js,公共方法,后台方法. js代码 function exportData() { //前台接收的参数 rwmc = $("#txt_rwmc&q

  • Java根据模板导出Excel报表并复制模板生成多个Sheet页

    因为最近用报表导出比较多,所有就提成了一个工具类,本工具类使用的场景为  根据提供的模板来导出Excel报表 并且可根据提供的模板Sheet页进行复制 从而实现多个Sheet页的需求, 使用本工具类时,如果需求是每个Sheet页中的数据都不一致,但是表格样式和模板都一样 那么只需要在实际情况中根据 sql 来查询要添加的数据源 (只需更改数据源即可) 采用的技术为 POI 导出,因为类的缘故,目前只支持2003版本的Excel. 使用前请先下载相应jar包! 后期有时间的话会进行进一步完善,初次

  • java实现Excel的导入、导出

    一.Excel的导入 导入可采用两种方式,一种是JXL,另一种是POI,但前者不能读取高版本的Excel(07以上),后者更具兼容性.由于对两种方式都进行了尝试,就都贴出来分享(若有错误,请给予指正) 方式一.JXL导入  所需jar包 JXL.jar publicstaticList<PutStorageInfo> readExcelByJXL(String filePath){ List<PutStorageInfo> infoList =newArrayList<Put

  • java实现excel导入数据的工具类

    导入Excel数据的工具类,调用也就几行代码,很简单的. 复制代码 代码如下: import jxl.Cell;import jxl.Sheet;import jxl.Workbook;import jxl.read.biff.BiffException;import org.apache.commons.beanutils.BeanUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory; import java.io.IOExc

  • java导出大批量(百万以上)数据的excel文件

    本文实例为大家分享了java导出百万以上数据的excel文件,供大家参考,具体内容如下 1.传统的导出方式会消耗大量的内存,2003每个sheet页最多65536条数据,2007每个sheet页可以达到100万条数据以上,2007会在生成Workbook时清理数据,所以2007导出量更大; 2.可以导出多个excel文件到某个目录中,然后打包下载; 3.导出excel格式的xml文件,这种方式可以分批导出数据,适用于大批量数据的导出,以下简单介绍这种方式: 代码如下: package com.e

  • Java数据导出功能之导出Excel文件实例

    在编程中经常需要使用到表格(报表)的处理主要以Excel表格为主.下面给出用java写入数据到excel表格方法: 1.添加jar文件 java导入导出Excel文件要引入jxl.jar包,最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件.下载地址:http://www.andykhan.com/jexcelapi/ 2.jxl对Excel表格的认识 可以参见:http://www.jb51.net/article/686

  • JavaWeb动态导出Excel可弹出下载

    由于项目需求,需要将数据导出成Excel表格,并且可选择导出项,可下载.项目使用的Spring+Mybatis+SpringMVC框架,利用Apache POI导出Excel.POI具体使用请自行百度.话不多说,上代码. ExportExcelUtil代码 package com.rixin.common.util; import java.io.OutputStream; import java.lang.reflect.Method; import java.net.URLEncoder;

  • java常用工具类之Excel操作类及依赖包下载

    依赖包下载:http://xiazai.jb51.net/201407/tools/java-excel-dependency(jb51.net).rar Excel工具类ExcelUtil.java源码: package com.itjh.javaUtil; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStr

  • java实现的导出Excel工具类实例

    本文实例讲述了java实现的导出Excel工具类.分享给大家供大家参考,具体如下: ExcelExportUtil: package com.excel; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.

随机推荐