java导出包含多个sheet的Excel代码示例

本文实例为大家分享了java导出包含多个sheet的Excel的具体代码,供大家参考,具体内容如下

要导出多个sheet,关键就是Excel导出的时间设定,在执行导出文件之前,创建多个工作表

HSSFSheet sheet = workbook.createSheet(sheettitle);

这样每创建一个工作表,便会生成一个新的sheet表,在最后导出Excel的时候一次性导出。

示例:
Java类:

try {
  HSSFWorkbook workbook = new HSSFWorkbook();
  OutputStream out = response.getOutputStream();
  for(int j=0;j<n;j++){
    BaseResult<List<T>> teasalList = service.select(teasal);
    //接下来循环list放到Excel表中
    if(teasalList.isSuccess()&&teasalList.getResult().size()>0){
      //文件标题
      SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd");
      String nowdate = formatter1.format(new Date());
      String title = null;
      title = "excel表格标题-" + nowdate + ".xls";
      String sheettitle = "sheet表名";
      //设置表格标题行
      String oneheaders = "首行标题" ;
      String dateheaders = nowdate ;
      String[] headers = new String[] {"列1","列2","列3","列4"};
      List<Object[]> dataList = new ArrayList<Object[]>();
      Object[] objs = null;
      for(int i =0; i<3 ; i++){ //循环每一条数据
        objs = new Object[headers.length];
        objs[1] = "张三";  //姓名
        objs[2] = "3"; //序号
        //数据添加到excel表格
        dataList.add(objs);
      }
      //使用流将数据导出
      //防止中文乱码
      String headStr = "attachment; filename=\"" + new String( title.getBytes("gb2312"), "ISO8859-1" ) + "\"";
      response.setContentType("octets/stream");
      response.setContentType("APPLICATION/OCTET-STREAM");
      response.setHeader("Content-Disposition", headStr);
      ExportExcelDownFee ex ;
      ex = new ExportExcelDownFee(sheettitle, oneheaders, dateheaders,headers, dataList);//没有标题
      ex.export(workbook,out);
    }
  }
  workbook.write(out); //循环生成多个sheet之后在导出Excel
  out.close(); //关闭流
} catch (Exception e) {
  e.printStackTrace();
}

 工具类:

public class ExportExcelDownFee { 

  //导出表的列名
  private String[] rowName ;
  //导出表的小标题
  private String oneheaders;
  //导出表的日期
  private String dateheaders;
  //sheet表表名
  private String sheettitle; 

  private List<Object[]> dataList = new ArrayList<Object[]>(); 

  HttpServletResponse response; 

  //构造方法2,传入要导出的数据
  public ExportExcelDownFee( String sheettitle, String oneheaders, String dateheaders, String[] rowName,List<Object[]> dataList){
    this.dataList = dataList;
    this.oneheaders = oneheaders;
    this.dateheaders = dateheaders;
    this.rowName = rowName;
    this.sheettitle = sheettitle;
  } 

  /*
   * 导出数据
   * */
  public void export(HSSFWorkbook workbook,OutputStream out) throws Exception{
    try{
      HSSFSheet sheet = workbook.createSheet(sheettitle);         // 创建工作表 

      HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);//获取列头样式对象
      HSSFCellStyle style = this.getStyle(workbook);         //单元格样式对象 

      //第一行
      HSSFRow rowfirstName = sheet.createRow(0);
      HSSFCell oneCellRowName = rowfirstName.createCell(0);        //创建列头对应个数的单元格
      oneCellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);       //设置列头单元格的数据类型
      HSSFRichTextString onetext = new HSSFRichTextString(oneheaders);
      oneCellRowName.setCellValue(onetext);                 //设置列头单元格的值
      //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
      sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));
      oneCellRowName.setCellStyle(columnTopStyle);            //设置列头单元格样式 

      //第二行
      HSSFRow rowDateName = sheet.createRow(1);
      HSSFCell DateCellRowName = rowDateName.createCell(3);
      DateCellRowName.setCellValue(dateheaders);
      DateCellRowName.setCellStyle(columnTopStyle);  

      // 定义所需列数
      int columnNum = rowName.length;
      HSSFRow rowRowName = sheet.createRow(2);        // 在索引2的位置创建行(最顶端的行开始的第二行) 

      // 将列头设置到sheet的单元格中
      for(int n=0;n<columnNum;n++){
        HSSFCell cellRowName = rowRowName.createCell(n);        //创建列头对应个数的单元格
        cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING);       //设置列头单元格的数据类型
        HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
        cellRowName.setCellValue(text);                 //设置列头单元格的值
        cellRowName.setCellStyle(style);            //设置列头单元格样式
      } 

      //将查询出的数据设置到sheet对应的单元格中
      for(int i=0;i<dataList.size();i++){ 

        Object[] obj = dataList.get(i);//遍历每个对象
        HSSFRow row = sheet.createRow(i+3);//创建所需的行数(从第二行开始写数据) 

        for(int j=0; j<obj.length; j++){
          HSSFCell cell = null;  //设置单元格的数据类型
          if(j == 0){
            cell = row.createCell(j,HSSFCell.CELL_TYPE_NUMERIC);
            cell.setCellValue(i+1);
          }else{
            cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING);
            if(!"".equals(obj[j]) && obj[j] != null){
              cell.setCellValue(obj[j].toString());            //设置单元格的值
            }
          }
          cell.setCellStyle(style);                  //设置单元格样式
        }
      } 

      //让列宽随着导出的列长自动适应
      for (int colNum = 0; colNum < columnNum; colNum++) {
        int columnWidth = sheet.getColumnWidth(colNum) / 256;
        for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
          HSSFRow currentRow;
          //当前行未被使用过
          if (sheet.getRow(rowNum) == null) {
            currentRow = sheet.createRow(rowNum);
          } else {
            currentRow = sheet.getRow(rowNum);
          }
          if (currentRow.getCell(colNum) != null) {
            HSSFCell currentCell = currentRow.getCell(colNum);
            if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
              int length = 0;
              try {
                length = currentCell.getStringCellValue().getBytes().length;
              } catch (Exception e) {
                e.printStackTrace();
              }
              if (columnWidth < length) {
                columnWidth = length;
              }
            }
          } 

        }
        if(colNum == 0){
          sheet.setColumnWidth(colNum, (columnWidth-2) * 256);
        }else{
          sheet.setColumnWidth(colNum, (columnWidth+4) * 256);
        }
      } 

    }catch(Exception e){
      e.printStackTrace();
    }
  } 

  /*
   * 列头单元格样式
   */
  public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) { 

     // 设置字体
     HSSFFont font = workbook.createFont();
     //设置字体大小
     font.setFontHeightInPoints((short)11);
     //字体加粗
     //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
     //设置字体名字
     font.setFontName("宋体");
     //设置样式;
     HSSFCellStyle style = workbook.createCellStyle();
     //在样式用应用设置的字体;
     style.setFont(font);
     //设置自动换行;
     style.setWrapText(false);
     //设置水平对齐的样式为居中对齐;
     style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
     //设置垂直对齐的样式为居中对齐;
     style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); 

     return style; 

  } 

  /*
   * 列数据信息单元格样式
   */
  public HSSFCellStyle getStyle(HSSFWorkbook workbook) {
     // 设置字体
     HSSFFont font = workbook.createFont();
     //设置字体名字
     font.setFontName("宋体");
     //设置样式;
     HSSFCellStyle style = workbook.createCellStyle();
     //设置底边框;
     style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
     //设置底边框颜色;
     style.setBottomBorderColor(HSSFColor.BLACK.index);
     //设置左边框;
     style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
     //设置左边框颜色;
     style.setLeftBorderColor(HSSFColor.BLACK.index);
     //设置右边框;
     style.setBorderRight(HSSFCellStyle.BORDER_THIN);
     //设置右边框颜色;
     style.setRightBorderColor(HSSFColor.BLACK.index);
     //设置顶边框;
     style.setBorderTop(HSSFCellStyle.BORDER_THIN);
     //设置顶边框颜色;
     style.setTopBorderColor(HSSFColor.BLACK.index);
     //在样式用应用设置的字体;
     style.setFont(font);
     //设置自动换行;
     style.setWrapText(false);
     //设置水平对齐的样式为居中对齐;
     style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
     //设置垂直对齐的样式为居中对齐;
     style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); 

     return style; 

   }
}

以上所述是小编给大家介绍的java导出包含多个sheet的Excel代码示例详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 如何通过java实现highcharts导出图片至excel

    1. 目的 通过java后台实现将前端页面的highcharts图表导出至生成的excel文件中.使用于报表页面导出类功能. 2. 说明 前端页面将图表的svg信息字符串作为参数传递 后台使用batik工具包生成图片 使用poi工具包操作excel 3. 使用jar包 1.batik-all-1.7.jar 2.poi-3.12.jar 3.commons-codec-1.12.jar 不导入不会报错,但使用时异常,提示信息:Exception in thread "main" jav

  • java poi导出图片到excel示例代码

    本文实例为大家分享了java使用poi导出图片到Excel的具体代码,供大家参考,具体内容如下 代码实现 Controller /** * 导出志愿者/人才数据 * @param talent_type * @return */ @RequestMapping("/exportData") public void exportData(Integer talent_type, HttpServletResponse response) { String fileId = UUID.ra

  • java导出Excel通用方法实例

    数据导出到Excel几乎是所有客户都会提出的一个需求.下面我就分享一下我的代码. 首先需要引入的jar包: 然后就是正式代码了. package lcy._41_50; import java.io.FileOutputStream; import java.io.OutputStream; import java.net.URLEncoder; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.u

  • java实现导出Excel的功能

    导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一下. 所用技术就是SpringBoot,然后是MVC架构模式. 废话不多说,直接上代码了,源码点末尾链接就可以下载. (1)新建一个SpringBoot项目(可以官网https://start.spring.io/直接生成下载,然后导入eclipse),项目结构如下: (2)修改pom文件,添加依赖: <dependency> <groupId>org.springframework.boot&

  • java导出包含多个sheet的Excel代码示例

    本文实例为大家分享了java导出包含多个sheet的Excel的具体代码,供大家参考,具体内容如下 要导出多个sheet,关键就是Excel导出的时间设定,在执行导出文件之前,创建多个工作表 HSSFSheet sheet = workbook.createSheet(sheettitle); 这样每创建一个工作表,便会生成一个新的sheet表,在最后导出Excel的时候一次性导出. 示例: Java类: try { HSSFWorkbook workbook = new HSSFWorkboo

  • Java编程Iterator迭代器设计原理及实现代码示例

    我们知道迭代器(Iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素.那么Iterator迭代器的设计原理是什么呢?迭代器问什么定义了一个借口,而不是一个类呢? 我们假设迭代器迭代数据的功能定义为了一个类,那么,会有这样的问题.不同的集合,由于数据结构不一样,所以他们的存储方式也是不一样的.也就是说,迭代器获取的时候,获取的方式是变化的,也就是不固定的.所以把这种方式定义为具体的实现是不合理的. 无论何种集合,他们肯定都有获取的功能,而且不知道什么时候就没有数据了.所有他

  • Java编程小实例—数字时钟的实现代码示例

    本文的实例是Java编程实现一个数字时钟,代码测试可用,练练手吧.代码如下: package me.socketthread; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.Calendar; import java.util.GregorianCalenda

  • Java设计模式之访问者模式使用场景及代码示例

    Java设计模式访问者模式 模式概念 访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作.访问者模式适用于数据结构相对稳定算法又易变化的系统,若系统数据结构对象易于变化,则不适合使用访问者模式.访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者. Visitor应用场景 一定会有的疑问:visitor和iterator的区别: visitor可以访问不同的对象(只需要在Element定义对应的accept),但是Ite

  • java多线程之线程同步七种方式代码示例

    为何要使用同步?  java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),     将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,     从而保证了该变量的唯一性和准确性. 1.同步方法  即有synchronized关键字修饰的方法.     由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,     内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态.     代码

  • java数据结构之树基本概念解析及代码示例

    Java中树的存储结构实现 一.树 树与线性表.栈.队列等线性结构不同,树是一...节点与节点之间的父子关系,可以为每个节点增加一个parent域,用以记录该节点的父点 树是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点组成一个具有层次关系的集合.把 它叫做"树"是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的. 树定义和基本术语 定义 树(Tree)是n(n≥0)个结点的有限集T,并且当

  • Java自带的加密类MessageDigest类代码示例

    MessageDigest 类 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法.信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值. MessageDigest 对象开始被初始化.该对象通过使用 update()方法处理数据.任何时候都可以调用 reset()方法重置摘要.一旦所有需要更新的数据都已经被更新了,应该调用digest() 方法之一完成哈希计算. 对于给定数量的更新数据,digest 方法只能被调用一次.在调用 d

  • Java实现判断浏览器版本与类型简单代码示例

    简单的Java获取浏览器版本和类型方法,不是很完美,但是可以用: 希望大家加以完善! public static void main(String[] args) { String agent=request.getHeader("User-Agent").toLowerCase(); System.out.println(agent); System.out.println("浏览器版本:"+getBrowserName(agent)); } public Str

  • Java语言Consistent Hash算法学习笔记(代码示例)

    本文研究的主要是ConsistentHashing算法代码. 一致性哈希(Consistent Hash) 协议简介 一致性哈希算法在1997年由麻省理工学院提出(参见0),设计目标是为了解决因特网中的热点(Hot pot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得DHT可以在P2P环境中真正得到应用. 哈希算法 一致性哈希提出了在动态变化的Cache环境中,哈希算法应该满足的4个适应条件: 平衡性(Balance) 平衡性是指哈希的结果能够尽可能分

  • Java压缩文件工具类ZipUtil使用方法代码示例

    本文实例通过Java的Zip输入输出流实现压缩和解压文件,前一部分代码实现获取文件路径,压缩文件名的更改等,具体如下: package com.utility.zip; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import

随机推荐