基于apache POI excel导出,支持多列多条件。

这篇博客介绍了如何使用Apache POI库来创建一个公共的Excel导出功能,支持多列和多条件。作者提供了核心代码片段,并分享了一个调用导出功能的JavaBean示例。读者可以通过博客链接获取更多详细信息。
摘要由CSDN通过智能技术生成

每次用到excel导出基本上都要重新写,这次是写了一个公共的,以后有想用的时侯直接复制就好,大部份都可以兼容,有问题后期再优化。


准备jar包

poi包:http://poi.apache.org/download.html


核心代码

import com.wd.common.anno.Merge;
import com.wd.common.utils.DateUtil;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.NumberFormat;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
 * 
 * <p>导出excel类</p> 
 * @ClassName: ExportExcelUtils     
 * @author: sunhr
 * @date: 2016年8月9日 下午7:18:33   
 * @version: V2.0  
 */
public class ExportExcelUtils<T>
{
   /**
    * 
    * <p>根据对象导出excel表格内容--泛型对象里面的属性顺序就已经确认了excel列的顺序,支持根据多个条件合并多列</p>
    * @author sunhr
    * @date 2016年9月30日 下午5:20:13 
    * @param workbook 是否想要多个sheet页
    * @param sheetName sheet页名称
    * @param heading 第一行标题
    * @param titles 列头
    * @param dataset 表格数据
    * @param mergeCells 要合并的列 -->int[] mergeCells={0,1,2,3,4,9,10,11,12};,根据rowMergeFlag属性值是否相等判别要合并多少行(只要每一行的此属性值相等,便合并)
    * @param total 合计数据
    * @param cols 自定义列宽
    * @return
    * Workbook
    */
   public Workbook ExportExcelMoreMergeCells(Workbook workbook,
                                 String sheetName,
                                 String heading,
                                 String[] titles,
                                 Collection<T> dataset,
                                 Map<String,int[]> mergeCellsMap,
                                 Map<String, Object> total,
                                 Map<Integer, Integer> cols){
      Workbook[] wbs = new Workbook[]{new HSSFWorkbook(), new XSSFWorkbook()};
      //设置表格版本
      Workbook wb = null;
      if(workbook == null){
         wb = wbs[0];
      }else{
         wb = workbook;
      }
      // 创建标题样式
      CellStyle titleStyle = wb.createCellStyle();
      titleStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
      titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
      titleStyle.setBorderTop(CellStyle.BORDER_THIN);
      titleStyle.setBorderLeft(CellStyle.BORDER_THIN);
      titleStyle.setBorderRight(CellStyle.BORDER_THIN);
      titleStyle.setBorderBottom(CellStyle.BORDER_THIN);
      titleStyle.setAlignment(CellStyle.ALIGN_CENTER);
      titleStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);

      Font titleFont = wb.createFont();
      titleFont.setColor(HSSFFont.COLOR_NORMAL);
      titleFont.setFontHeightInPoints((short)11);
      titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
      titleStyle.setFont(titleFont);

      // 创建内容样式
      CellStyle dataStyle = wb.createCellStyle();
      dataStyle.setBorderTop(CellStyle.BORDER_THIN);
      dataStyle.setBorderLeft(CellStyle.BORDER_THIN);
      dataStyle.setBorderRight(CellStyle.BORDER_THIN);
      dataStyle.setBorderBottom(CellStyle.BORDER_THIN);
      dataStyle.setAlignment(CellStyle.ALIGN_CENTER);
      dataStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
      Font dataFont = wb.createFont();
      dataFont.setFontHeightInPoints((short)11);
      dataStyle.setFont(dataFont);

      // 创建工作薄
      Sheet sheet = wb.createSheet(sheetName);
      sheet.setDefaultColumnWidth((short)17);// 默认列宽
      sheet.createFreezePane(0, 2, 0, 2);
      //设置列宽
      if(cols != null){
         for(Map.Entry<Integer, Integer> entry : cols.entrySet()){
            sheet.setColumnWidth(entry.getKey(), entry.getValue());
         }
      }
      Row row = null;
      Cell cell = null;
      // 1. 创建标题(第一行)
      row = sheet.createRow(0);
      sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, (short)(titles.length - 1)));// 合并标题列
      row.setHeightInPoints(20);
      cell = row.createCell(0);
      cell.setCellValue(heading);
      cell.setCellStyle(titleStyle);

      // 2. 创建列头(第二行)
      row = sheet.createRow(1);
      row.setHeightInPoints(20);
      for(short i = 0; i < titles.length; i++){
         cell = row.createCell(i);
         cell.setCellSt
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值