懒得写废话了。。。

package com.ruoyi.common.utils.poi;

import com.ruoyi.framework.config.RuoYiConfig;

import com.ruoyi.framework.web.domain.AjaxResult;

import org.apache.poi.ss.usermodel.Cell;

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.streaming.SXSSFWorkbook;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStream;

import java.lang.reflect.Field;

import java.util.ArrayList;

import java.util.Comparator;

import java.util.List;

import java.util.UUID;

public class DocumentUtil {

private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);

private String sheetName;

private Workbook wb;

private Sheet sheet;

private List list;

private List columns;

private List fields;

private int maxDepth;

public Class clazz;

public DocumentUtil(Class clazz)

{

this.clazz = clazz;

}

public void init(List list, List columns, String sheetName)

{

if (list == null)

{

list = new ArrayList();

}

this.list = list;

this.fields = new ArrayList<>();

this.columns = columns;

this.sheetName = sheetName;

this.wb = new SXSSFWorkbook(500);

}

public AjaxResult exportExcel(List list, List columns, String sheetName)

{

this.init(list, columns, sheetName);

return exportExcel();

}

private AjaxResult exportExcel() {

OutputStream out = null;

try {

sheet = wb.createSheet(sheetName);

generateHeader(this.columns);

this.fields.sort((a, b) -> b.getFirstCol() - a.getFirstCol());

generateData(this.list,maxDepth + 1);

String filename = encodingFilename(sheetName);

out = new FileOutputStream(getAbsoluteFile(filename));

wb.write(out);

return AjaxResult.success(filename);

}

catch (Exception ex) {

System.out.print(ex.getMessage());

}

return null;

}

public String encodingFilename(String filename)

{

filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx";

return filename;

}

public String getAbsoluteFile(String filename)

{

String downloadPath = RuoYiConfig.getDownloadPath() + filename;

File desc = new File(downloadPath);

if (!desc.getParentFile().exists())

{

desc.getParentFile().mkdirs();

}

return downloadPath;

}

private void generateHeader(List columns) {

maxDepth = getMaxDepth(this.columns, 0);

generateHeader(columns, null, maxDepth);

}

private void generateHeader(List columns, Column parent, int maxDepth) {

int colIndex = 0, rowIndex = 0;

if (parent != null) {

colIndex = parent.getFirstCol();

rowIndex = parent.getLastRow() + 1;

}

for (Column column : columns) {

Row row = sheet.getRow(rowIndex);

if (row == null) {

row = sheet.createRow(rowIndex);

}

column.setFirstRow(rowIndex);

column.setLastRow(rowIndex);

column.setFirstCol(colIndex);

column.setLastCol(colIndex);

if (column.getChildrens() != null && column.getChildrens().size() > 0) {

column.setLastCol(colIndex + column.getChildrens().size() - 1);

generateHeader(column.getChildrens(), column, maxDepth);

} else {

if (column.getWidth() > 0) {

this.sheet.setColumnWidth(colIndex, column.getWidth() * 256);

}

this.fields.add(column);

column.setLastRow(maxDepth);

}

if (parent != null && column.getLastCol() > parent.getLastCol()) {

parent.setLastCol(column.getLastCol());

}

if (column.getLastRow() > column.getFirstRow() || column.getLastCol() > column.getFirstCol()) {

sheet.addMergedRegion(new CellRangeAddress(column.getFirstRow(), column.getLastRow(), column.getFirstCol(), column.getLastCol()));

}

Cell cell = row.createCell(column.getFirstCol());

cell.setCellValue(column.getName());

colIndex = column.getLastCol() + 1;

}

}

private int generateData(List list, int firstRow) {

int lastRow = firstRow;

int totalRow = 0;

for (T item : list) {

Row row = sheet.getRow(lastRow);

if (row == null) {

row = sheet.createRow(lastRow);

}

if (item.getChildrens() != null && item.getChildrens().size() > 0) {

int total = generateData(item.getChildrens(), lastRow);

lastRow += total - 1;

totalRow += total;

} else {

totalRow++;

}

Class cls = item.getClass();

for (Field field : cls.getDeclaredFields()) {

Column column = this.fields.stream().filter(p -> p.getField().equals(field.getName())).findFirst().get();

try {

field.setAccessible(true);

Object obj = field.get(item);

String value = obj == null ? "" : obj.toString();

Cell cell = row.createCell(column.getFirstCol());

cell.setCellValue(value);

if (lastRow > firstRow) {

sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, column.getFirstCol(), column.getLastCol()));

}

} catch (Exception ex) {

System.out.print(ex.getMessage());

}

}

lastRow++;

firstRow = lastRow;

}

return totalRow;

}

private > int getMaxDepth(List list, int depth) {

int maxDepth = 0;

for (TreeNode item : list)

{

item.setDepth(depth);

if (item.getChildrens() != null)

{

int res = getMaxDepth(item.getChildrens(), depth + 1);

if (res > maxDepth) maxDepth = res;

}

if (depth > maxDepth) maxDepth = depth;

}

return maxDepth;

}

}

用到的实体类:

package com.ruoyi.common.utils.poi;

import java.util.List;

public abstract class TreeNode {

private int depth;

private List childrens;

public int getDepth() {

return depth;

}

public void setDepth(int depth) {

this.depth = depth;

}

public List getChildrens() {

return childrens;

}

public void setChildrens(List childrens) {

this.childrens = childrens;

}

}

package com.ruoyi.common.utils.poi;

import java.util.List;

public class Column extends TreeNode {

public Column(String name, String field) {

this.name = name;

this.field = field;

}

public Column(String name, List childrens) {

this.name = name;

this.setChildrens(childrens);

}

private String field;

private String name;

private int width;

private int firstRow;

private int lastRow;

private int firstCol;

private int lastCol;

public String getField() {

return field;

}

public void setField(String field) {

this.field = field;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getWidth() {

return width;

}

public void setWidth(int width) {

this.width = width;

}

public int getFirstRow() {

return firstRow;

}

public void setFirstRow(int firstRow) {

this.firstRow = firstRow;

}

public int getLastRow() {

return lastRow;

}

public void setLastRow(int lastRow) {

this.lastRow = lastRow;

}

public int getFirstCol() {

return firstCol;

}

public void setFirstCol(int firstCol) {

this.firstCol = firstCol;

}

public int getLastCol() {

return lastCol;

}

public void setLastCol(int lastCol) {

this.lastCol = lastCol;

}

}

excel导出多重表头utils_java excel复杂表头和复杂数据导出相关推荐

  1. vue导出excel加一个进度条_vue项目中如何把数据导出成excel文件

    Loading... 关于vue中如何把数据导出成excel文件 ### 1. 安装依赖 ``` yarn add file-saver yarn add xlsx yarn add script-l ...

  2. Excel催化剂开源第15波-VSTO开发之DataTable数据导出至单元格区域

    上篇提到如何从Excel界面上拿到用户的数据,另外反方向的怎样输出给用户数据,也是关键之处. VSTO最大的优势是,这双向的过程中,全程有用户的交互操作. 而一般IT型的程序,都是脱离用户的操作,只能 ...

  3. python亿级mysql数据库导出_Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法...

    本文实例讲述了python实现将MySQL数据库表中的数据导出生成csv格式文件的方法.分享给大家供大家参考,具体如下: #!/usr/bin/env python # -*- coding:utf- ...

  4. php 导出csv设置列宽度,php数据库导出excel表格数据-php从数据库导出csv格式的Excel表格是,字段本身就......

    PHP如何将查询出来的数据导出成excel表格(最好做... $objPHPExcel->getActiveSheet()->getDefaultColumnDimension(A)-&g ...

  5. 在vue中把数据导出Excel文件

    在vue中把数据导出Excel文件 第一次尝试写文章 在vue中把数据导出成Excel格式的文件,话不多,上代码: 第一步我们要先安装几个集成的插件 npm install -S file-saver ...

  6. 数据导出到Excel

    数据导出到Excel 开发工具与关键技术:Qt Creator.C++作者:何任贤撰写时间:2020年05月05日 我们在做项目的时候,经常会有要求把表格数据导出到Excel的要求,我呢,就做了一个列 ...

  7. excel的mysql语言,Mysql中文乱码及导出sql语句和Excel的相关解决方法

    这几天基于Heritrix写了一个爬虫,用到mysql,在导入导出数据时,遇到一些乱码问题,好不容易解决了,记录一下,以备查看. 一.导出数据. 先说明一下自己的环境:Mac OS X 10.8.3, ...

  8. java json删除指定元素_简洁而优雅,Python Tablib实现将数据导出为Excel, Json等N种格式...

    遇见 Tablib 我们在 Python 实际开发过程中,经常涉及将数据导出为 Excel.Csv.Yaml.Json 等各种格式的文件的需求,一些粗鲁的实现方式是通过安装各种第三方模块以支持不同格式 ...

  9. 大数据导出excel大小限制_大数据量导出Excel的方案

    测试共同条件: 数据总数为110011条,每条数据条数为19个字段. 电脑配置为:P4 2.67GHz,1G内存. 一.POI.JXL.FastExcel比较 POI.JXL.FastExcel均为j ...

最新文章

  1. 二代测序数据统计分析中为什么是负二项分布?
  2. pthreads v3在centos7下的安装与配置
  3. Shiro总是将我重定向到login.jsp
  4. Redis中的可用性保证之Sentinel的Ratf 算法
  5. Twitter Storm安装配置(Ubuntu系统)单机版
  6. c#switch语句判断成绩_switch语句成绩等级例子
  7. 中南大学 10科学计算和 MATLAB 语言 矩阵变换
  8. multiset 多重集合容器
  9. ubuntu14.04LTS 安装后几个基本设置
  10. mssql 2005/2008/2012如何添加、查询、修改分区表中的数据 .
  11. 前端开源项目周报0412
  12. 诺基亚HERE地图套件重返Windows应用商店
  13. MSF Exploit入侵电脑实践(Win7/Win10皆可)
  14. 【Keil变量定义】定义extern类型变量
  15. php网站做分享到朋友圈,PHP实现微信分享朋友圈
  16. scala成长之路(1)基本语法和数据类型
  17. 数据仓库建设---数据建模
  18. Nginx 部署、反向代理配置、负载均衡
  19. javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not prep
  20. 第2节:英语中的形容词,副词,动词,动名词,动词不定式

热门文章

  1. iOS动态修改app 图标(icon)
  2. 无公网IP实现绿盾终端连接服务端
  3. 硬件断点的疑惑
  4. 十年软件测试老司机,感悟!!送给刚入测试行业的萌新!!
  5. 【WAF技巧拓展】————6、我的WafBypass之道(SQL注入篇)
  6. gff文件_GFF3格式介绍 | Public Library of Bioinformatics
  7. 天天炫斗角色称号你值得拥有!!!!
  8. 电竞蓝牙耳机哪个牌子好?无延迟游戏蓝牙耳机
  9. html 背景不是图片是动画,使用CSS3动画更改背景图像
  10. 星际2服务器未能成功创建游戏,《星际争霸II》新手错误纠正