需求:前端传入一个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);