导出Excel工具类

导出Excel工具类

package ky.settle.util;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

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 org.apache.poi.ss.util.CellRangeAddress;
/**
 * 
 * List集合导出成Excel表格工具类
 * @className ExportExcel
 * @author zhangxianqian
 * @date 2019年8月28日
 */
public final class ExportExcel {
	   /**
	   * 构造方法
	   */
      private ExportExcel() {

      }

      /***
       * 工作簿
       */
      private static HSSFWorkbook workbook;

      /***
       * sheet
       */
      private static HSSFSheet sheet;

      /**
       * 
       * @param response
       *        response
       * @param dataList
       *        对象集合
       * @param headMap
       *        表头信息(对象属性名称->要显示的标题值)[按顺序添加]
       * @param sheetName
       *        sheet名称和表头值
       * @param fileName
       *        生成文件名
       */
      public static void excelExportWeb(HttpServletResponse response,List<?> dataList, LinkedHashMap<String, String> headMap, String sheetName,String fileName) {
        // 初始化workbook
        initHSSFWorkbook(sheetName);
        // 标题行
        createTitleRow(0,headMap, sheetName);
        // 时间行
        createDateHeadRow(1,headMap);
        // 表头行
        createHeadRow(2,headMap);
        // 文本行
        createContentRow(3,dataList, headMap);
        //设置自动伸缩
        //autoSizeColumn(headMap.size());
        // 写入处理结果
        try {
          OutputStream out = response.getOutputStream();// 取得输出流
		  response.reset();// 清空输出流
		  response.setHeader("Content-disposition","attachment; filename="+fileName+".xls");// 设定输出文件头
		  response.setContentType("application/msexcel");// 定义输出类型
          workbook.write(out);
          out.close();
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
      
      /**
       * 
       * @param dataList
       *        对象集合
       * @param headMap
       *        表头信息(对象属性名称->要显示的标题值)[按顺序添加]
       * @param sheetName
       *        sheet名称和表头值
       * @param fileName
       *        生成文件名(包括文件路径,不包括后缀)
       */
      public static void excelExport(List<?> dataList, LinkedHashMap<String, String> headMap, String sheetName,String fileName) {
        // 初始化workbook
        initHSSFWorkbook(sheetName);
        // 标题行
        createTitleRow(0,headMap, sheetName);
        // 时间行
        createDateHeadRow(1,headMap);
        // 表头行
        createHeadRow(2,headMap);
        // 文本行
        createContentRow(3,dataList, headMap);
        //设置自动伸缩
        //autoSizeColumn(headMap.size());
        // 写入处理结果
        try {
          String filedisplay = fileName+".xls";
          OutputStream out = new FileOutputStream(filedisplay);
          workbook.write(out);
          out.close();
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
      
      /**
       * 
       * @param response
       *        response
       * @param dataList
       *        对象集合
       * @param headMap
       *        表头信息(对象属性名称->要显示的标题值)[按顺序添加]
       * @param sheetName
       *        sheet名称
       * @param fileName
       *        生成文件名
       */
      public static void excelExportWebWithoutTitle(HttpServletResponse response,List<?> dataList, LinkedHashMap<String, String> headMap, String sheetName,String fileName) {
        // 初始化workbook
        initHSSFWorkbook(sheetName);
        // 表头行
        createHeadRow(0,headMap);
        // 文本行
        createContentRow(1,dataList, headMap);
        //设置自动伸缩
        //autoSizeColumn(headMap.size());
        // 写入处理结果
        try {
        	OutputStream out = response.getOutputStream();// 取得输出流
  		    response.reset();// 清空输出流
  		    response.setHeader("Content-disposition","attachment; filename="+fileName+".xls");// 设定输出文件头
  		    response.setContentType("application/msexcel");// 定义输出类型
            workbook.write(out);
            out.close();
        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }

      /***
       * 初始化workbook
       * @param sheetName
       *        sheetName
       */
      private static void initHSSFWorkbook(String sheetName) {
        workbook = new HSSFWorkbook();
        sheet = workbook.createSheet(sheetName);
      }

      /**
       * 生成标题(第零行创建)
       * @param startRow 标题行开始位置
       * @param headMap 对象属性名称->表头显示名称
       * @param sheetName sheet名称
       */
      private static void createTitleRow(int startRow,LinkedHashMap<String, String> headMap, String sheetName) {
        CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0, headMap.size() - 1);
        sheet.addMergedRegion(titleRange);
        HSSFRow titleRow = sheet.createRow(startRow);
        HSSFCell titleCell = titleRow.createCell(0);
        titleCell.setCellValue(sheetName);
      }

      /**
       * 创建时间行(第一行创建)
       * @param startRow 时间行开始位置
       * @param headMap 对象属性名称->表头显示名称
       */
      private static void createDateHeadRow(int startRow,LinkedHashMap<String, String> headMap) {
        CellRangeAddress dateRange = new CellRangeAddress(1, 1, 0, headMap.size() - 1);
        sheet.addMergedRegion(dateRange);
        HSSFRow dateRow = sheet.createRow(startRow);
        HSSFCell dateCell = dateRow.createCell(0);   
        dateCell.setCellValue(new SimpleDateFormat("yyyy年MM月dd日").format(new Date()));
      }

      /**
       * 创建表头行(第二行创建)
       * @param startRow 表头行开始位置
       * @param headMap 对象属性名称->表头显示名称
       */
      private static void createHeadRow(int startRow,LinkedHashMap<String, String> headMap) {
        HSSFRow headRow = sheet.createRow(startRow);
        int i = 0;
        for (String entry : headMap.keySet()) {
          HSSFCell headCell = headRow.createCell(i);
          headCell.setCellValue(headMap.get(entry));
          i++;
        }
      }

     /**
      * 创建内容行(第三行创建)
      * @param startRow 内容行开始位置
      * @param dataList 对象数据集合
      * @param headMap 表头信息
      */
      private static void createContentRow(int startRow,List<?> dataList, LinkedHashMap<String, String> headMap) {
        try {
          int i=0;
          for (Object obj : dataList) {
            HSSFRow textRow = sheet.createRow(startRow + i);
            int j = 0;
            for (String entry : headMap.keySet()) {
              String method = "get" + entry.substring(0, 1).toUpperCase() + entry.substring(1);
              Method m = obj.getClass().getMethod(method, null);
              Object valObj = m.invoke(obj, null);
              String value = valObj == null ? null : valObj.toString();
              HSSFCell textcell = textRow.createCell(j);
              textcell.setCellValue(value);
              j++;
            }
            i++;
          }

        }
        catch (Exception e) {
          e.printStackTrace();
        }
      }
      
      /**
       * 自动伸缩列(如非必要,请勿打开此方法,耗内存)
       * @param size 列数
       */
      private static void autoSizeColumn(Integer size) { 
        for (int j = 0; j < size; j++) {
          sheet.autoSizeColumn(j);
        }
      }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值