热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

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

本文主要介绍了java实现把对象数组通过excel方式导出的功能的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧

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

  
   org.apache.poi
   poi
   RELEASE
   

二、开始撸代码

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

//结果返回的是写入的记录数(以下用的是自己业务场景数据)
  public int downLoadToExcel(OutputStream outputStream,List 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 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&#63;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  Result export(List titles, Field[] fields, Class clazz, Collection 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  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 
public class ExportExcelUtils {
 private final static Logger LOG = Logger.getLogger(ExportExcelUtils.class);
 public static  Result export(List titles,List 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 fieldList = new ArrayList();
   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。

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


推荐阅读
  • Maven快照版本管理及更新策略详解
    本文深入探讨了Maven中的快照版本管理和更新策略,解释了快照版本与正式版本的区别,并提供了如何配置快照更新策略的方法,以确保项目依赖始终保持最新。 ... [详细]
  • 如何使用Maven将依赖插件一并打包进JAR文件
    本文详细介绍了在使用Maven构建项目时,如何将所需的依赖插件一同打包进最终的JAR文件中,以避免手动部署依赖库的麻烦。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • Maven + Spring + MyBatis + MySQL 环境搭建与实例解析
    本文详细介绍如何使用MySQL数据库进行环境搭建,包括创建数据库表并插入示例数据。随后,逐步指导如何配置Maven项目,整合Spring框架与MyBatis,实现高效的数据访问。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • HTML:  将文件拖拽到此区域 ... [详细]
  • 本文详细探讨了在Web开发中常见的UTF-8编码问题及其解决方案,包括HTML页面、PHP脚本、MySQL数据库以及JavaScript和Flash应用中的乱码问题。 ... [详细]
  • 本文详细介绍了 Java 中 org.w3c.dom.Node 类的 isEqualNode() 方法的功能、参数及返回值,并通过多个实际代码示例来展示其具体应用。此方法用于检测两个节点是否相等,而不仅仅是判断它们是否为同一个对象。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • 一、Advice执行顺序二、Advice在同一个Aspect中三、Advice在不同的Aspect中一、Advice执行顺序如果多个Advice和同一个JointPoint连接& ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文详细记录了腾讯ABS云平台的一次前端开发岗位面试经历,包括面试过程中遇到的JavaScript相关问题、Vue.js等框架的深入探讨以及算法挑战等内容。 ... [详细]
author-avatar
accosta谭_738
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有