JAVA操作EXCEL工具,POI多表头编写通用EXCEL工具

需求:前端传入一个header数组后端处理

需求

前端传入一个带有层级header数组后端处理后端进行解析判断层级个数,然后写入表头,废话不多直接彪代码。

问题

目前只是实现了多级表头最多只能有三级,可能有写不足指出,望大家指出。

代码片

import com.alibaba.fastjson.JSON;
import com.crcc.common.typewrap.impl.HashDto;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 所有的header类的格式参数名严格按照示例格式处理
 * 存在问题:不兼容大于三级表头的EXCEL表格
 * 未处理大EXCEL导出可能导致的连接断开问题
 * 未进行性能优化
 *
 * @param <T>
 */
public class ExportExcelUtil<T> {
   

    // 2007 版本以上 最大支持1048576行
    public final static String EXCEl_FILE_2007 = "2007";
    // 2003 版本 最大支持65536 行
    public final static String EXCEL_FILE_2003 = "2003";
    //最大列数
    public static int maxCloums = 0;
    //heders层级数
    public static int i = 0;
    //判断heders[]循环是否跳出本层级
    public static boolean isInto = false;

    /**
     * 通过版本类判断是
     *
     * @param sheetName
     * @param headers   表格头部标题集合
     * @param dataset   数据集合
     * @param out       输出流
     */
    public void exportExcel(String sheetName, String[] headers, Collection<T> dataset, OutputStream out) throws Exception {
   
        Workbook workbook = null;
        int size = dataset.size();
        if (size < 65536) {
   
            workbook = new HSSFWorkbook();
        } else {
   
            workbook = new XSSFWorkbook();
        }
        exportExcel(workbook, sheetName, headers, dataset, out, "yyyy-MM-dd HH:mm:ss");
    }

    /**
     * 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中 <br>
     * 此版本生成2007以上版本的文件 (文件后缀:xlsx)
     *
     * @param sheetName 表格标题名
     * @param headers   表格头部标题集合
     * @param dataset   需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
     *                  JavaBean属性的数据类型有基本数据类型及String,Date
     * @param out       与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
     * @param pattern   如果有时间数据,设定输出格式。默认为"yyyy-MM-dd hh:mm:ss"
     */
    public void exportExcel(Workbook workbook, String sheetName, Object headers, Collection<T> dataset, OutputStream out, String pattern) throws Exception {
   
        // 生成一个表格
        Sheet sheet = workbook.createSheet(sheetName);
        // 设置表格默认列宽度为15个字节
        //设置宽度
        //sheet.setDefaultColumnWidth(20);
        sheet.setDefaultColumnWidth(18);
        //sheet.trackAllColumnsForAutoSizing();
//        sheet.autoSizeColumn(0);
        // 生成一个样式
        CellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);//内容居中
        // 生成一个字体
        Font font = workbook.createFont();
        font.setFontName("宋体");
        font.setBold(true);//加粗
        font.setFontHeightInPoints((short) 11);
        // 把字体应用到当前的样式
        style.setFont(font);
        // 生成并设置另一个样式
        CellStyle style2 = workbook.createCellStyle();
        style2.setAlignment(HorizontalAlignment.CENTER);
        // 生成另一个字体
        Font font2 = workbook.createFont();
        // font2.setBold(true);//加粗
        // 把字体应用到当前的样式
        style2.setFont(font2);
        String headersJsonArray = JSON.toJSONString(headers);
      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值