懒得写废话了。。。

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;

}

}

原文:https://www.cnblogs.com/cxyzj/p/13029433.html

java excel导出复杂表头_java excel复杂表头和复杂数据导出相关推荐

  1. java批量文件打包成压缩成zip下载和大量数据导出excel时的处理方法

    对于我们来说,java导出数据成excel或其他数据文件,或者下载资源是开发中的家常便饭, 但是在导出的时候,如果点击一个按钮导出几百万条数据,如果不作处理的话很可能会出现一系列的问题. 这里介绍打包 ...

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

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

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

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

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

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

  5. java excel api 下载文件_java excel api实现输出EXCEL文件下载

    java excel api实现输出EXCEL文件下载 [// 下载本地文件String fileName = 苹果知识库授权网点整理汇总副本20130210.xls.toString(); // 文 ...

  6. java nio 追加写文件_Java NIO在文件末尾追加数据

    [java]代码库import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import ja ...

  7. hive运行mysql脚本_用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql

    1:创建shell脚本 1 touch sqoop_options.sh2 chmod 777 sqoop_options.sh 编辑文件  特地将执行map的个数设置为变量  测试 可以java代码 ...

  8. java通过url获取网页内容_Java语言通过URL读取网页数据并保存到本地文件(代码实例)...

    本文主要向大家介绍了Java语言通过URL读取网页数据并保存到本地文件(代码实例),通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. Java通过URL读取网页数据并保存到本地文件(代码 ...

  9. 使用java如何访问报表服务器_Java访问远程http服务器上数据的简便方法

    Java开发项目中,有时会访问远程http服务器上的数据,数据可能是xml格式或者json格式等.这里我们通过例子来看一下两种实现方式的对比. 本例子中有一个servlet,对外提供json格式的雇员 ...

最新文章

  1. 这些 Shell 分析服务器日志命令集锦,收藏好
  2. linux umount swap,挂载、卸载、free查看内存情况、创建交换分区、回环设备、dd命令、自动挂载、fuser...
  3. Office+SharePoint+Server+2007+部署图示指南
  4. jq实现点事图片移动_新品速递 | 移动云图片文字识别类产品全新版本惊喜登场...
  5. scrapy mysql测试连接_scrapy连接MySQL
  6. error: expected expression before ‘;’ token的问题
  7. GIT命令行的一些基本操作
  8. 2019必学的10大顶级Python库!
  9. 成绩管理系统代码c语言,学生成绩管理系统(c语言源代码)
  10. sublime linux中文版,sublime text 3中文免费版
  11. Linux 杀毒软件ClamAV离线安装部署
  12. 手机qq邮箱html,手机QQ邮箱在哪里找
  13. webrtc 研究-带宽控制
  14. 解决H5 在安卓手机上软键盘遮盖input的问题
  15. Outlier Detection Based on Fuzzy Rough Granules in Mixed Attribute Data论文精读
  16. 真正中文攻略之 SAKURA~雪月華~ 花鳥風月プレミアムエディション 汉化、攻略...
  17. java读取ppt内容_Java添加、读取和删除 PPT 中的备注
  18. 漏洞利用与卡巴斯基的对抗之路
  19. 堆垛机西门子S7-1500 S型曲线速度控制部分程序
  20. epass 1000ND 使用心得

热门文章

  1. 机械专业转行IT行业,成功自学Java上岸(分享转行使)
  2. 用c语言把合数分解质数,合数分解质数之和较好的解法
  3. 安装ubuntu出现花屏_在Ubuntu 18.04系统中挂起,再唤醒就出现花屏的解决办法
  4. C语言每日一练(六)——华为机试
  5. android 输入法键盘弹出与否判断和输入法键盘弹出时将界面滚动到指定位置
  6. Go语言_通神路之灵胎篇(3)
  7. 2019年舰船行业EI会议
  8. 技术组长如何组织一次晨会(附面试考察标准)
  9. USG6000V防火墙WEB登录界面超详细配置过程
  10. 数据并发问题-精通spring 企业应用开发实战读书笔记