通用导出任何对象列表数据的excel工具类

在工作中经常会遇到列表数据的导出,每次需要的时候都要去开发一次,且数据不断在变化,于是就有了下述的工具类,可传入各种实体对象的List,最终以指定格式导出excel,废话不多说,上代码~

控制层代码

    @PostMapping("/test")
    public void test(HttpServletResponse response) throws Exception {
    	
    	//查询任意数据列表
    	List<ErrorLog> list = errorLogService.selectListByInfo();
    	
    	//导出操作
    	CommonExcelUtils.exportDynamicsData(response, list, "日志", "日志数据");
    }

此处的list可以是任意数据,也可以是任意SQL组装的list数据,标题会以sql的别名为准.

CommonExcelUtils工具类

    /**
	 * 动态列表导出
	 * @param response
	 * @param list		数据list
	 * @param sheetName	页签名称,也是总标题的名称
	 * @param fileName	导出文件名
	 */
	@SuppressWarnings("all")
	public static String exportDynamicsData(HttpServletResponse response,
			List list, String sheetName, String fileName) throws IOException {
		
		//将list数据转成指定类型
		List<LinkedHashMap<String, Object>> data = CommonBeanUtils.convertListToMap(list);
		
		List<List> rows = new ArrayList<>();//excel导出整体数据
		List<String> titles = new ArrayList<>();//excel导出标题(首行)
		List<String> title = new ArrayList<>();
		title.add(sheetName);
		rows.add(title);
		
    	//组装标题
	 	LinkedHashMap<String,Object> m = (LinkedHashMap<String,Object>) data.get(0);
	 	Set<String> keySet = m.keySet();
	  	for (String t : keySet) {
	  		titles.add(t);
		}
	    rows.add(titles);
	    
	    //组装数据
	    for (LinkedHashMap<String,Object> info : data) {
	    	List d = new ArrayList<>();
	    	Set<Entry<String, Object>> entrySet = info.entrySet();
	    	for (Entry<String, Object> da : entrySet) {
        		d.add(da.getValue());
			}
			rows.add(d);
		}
	    fileName = fileName +"-"+ DateUtils.parseDateToStr("yyMMdd", new Date()) +".xlsx";//导出文件名称
	    
	    //声明一个工作簿
	    XSSFWorkbook workbook = new XSSFWorkbook();
	  	XSSFSheet sheet = workbook.createSheet(sheetName);
	  	sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, titles.size()-1));//合并第一行的单元格,作标题
	  	sheet.setDefaultColumnWidth(14);		//设置表格列宽度
	  	
	  	//导出操作
	  	ExcelUtil.exportExcel(response, rows, workbook, sheet, fileName);
	  	
	  	return fileName;
	}

CommonBeanUtils工具类

    /**
     * List转Map
     * @param <T>
     * @param list
     * @return
     */
    public static <T> List<LinkedHashMap<String, Object>> convertListToMap(List<T> list) {
        return list.stream()
            .map(CommonBeanUtils::objectToMap)
            .collect(Collectors.toList());
    }

    /**
     * object 转 Map
     * @param <T>
     * @param object
     * @return
     */
    private static <T> LinkedHashMap<String, Object> objectToMap(T object) {
    	LinkedHashMap<String, Object> map = new LinkedHashMap<>();
        for (Field field : object.getClass().getDeclaredFields()) {
            field.setAccessible(true);
            try {
                map.put(field.getName(), field.get(object));
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return map;
    }

ExcelUtil工具类

import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ExcelUtil<T>
{

    /**
     * 自定义导出
     * @param response
     * @param excelData
     * @param sheetName
     * @param fileName
     * @param columnWidth
     * @throws IOException
     */
    public static void exportExcel(HttpServletResponse response,List<List> excelData,XSSFWorkbook workbook, XSSFSheet sheet,String fileName) throws IOException {                
        //设置单元格字体
        XSSFFont fontName = workbook.createFont();
        fontName.setFontName("宋体");
        //写入List<List<String>>中的数据
        int rowIndex = 0;
        int rowFlag = -2;
        XSSFCellStyle createTitleCellStyle = createTitleCellStyle(workbook);
        XSSFCellStyle createTableCellStyle = createTableCellStyle(workbook);
        XSSFCellStyle rightRowCellStyle = createRightRowCellStyle(workbook);
        XSSFCellStyle leftRowCellStyle = createLeftRowCellStyle(workbook);
       
        for(List data : excelData){
        	if(rowFlag == 8) rowFlag = 0;
        	rowFlag++;
            //创建一个row行,然后自增1
            XSSFRow row = sheet.createRow(rowIndex++);
            if(rowIndex==1) row.setHeight((short)(20*30));
            
            //遍历添加本行数据
            for (int i = 0; i < data.size(); i++) {
                //创建一个单元格
                XSSFCell cell = row.createCell(i);
                //value单元格值
                Object value = data.get(i);
                
                //设置第一个行标题的样式
                if(i==0 && rowIndex==1) {
	           		cell.setCellStyle(createTitleCellStyle);
	           	}
                //设置表头样式
                if(rowIndex==2) {
                	cell.setCellStyle(createTableCellStyle);
                }
                if(rowIndex>2) {
                	//如果是数字类型,则字体向右对齐
                	if(value instanceof BigDecimal || value instanceof Integer) {
                		row.getCell(i).setCellStyle(rightRowCellStyle);
                	}else {
                		row.getCell(i).setCellStyle(leftRowCellStyle);
                	}
                }
                //将内容对象的文字内容写入到单元格中(单独处理数值类型)
                if(value instanceof BigDecimal) {
                	BigDecimal v = (BigDecimal)value;
                	cell.setCellValue(v.doubleValue());
                }else {
                	cell.setCellValue(String.valueOf(value));
                }
            }
        }
        //准备将Excel的输出流通过response输出到页面下载
        //八进制输出流
        response.setContentType("application/octet-stream");
        //设置导出Excel的名称
        response.setHeader("Content-disposition", "attachment;filename=" + fileName);
        //刷新缓冲
        response.flushBuffer();
        //workbook将Excel写入到response的输出流中,供页面下载该Excel文件
        workbook.write(response.getOutputStream());

        //关闭workbook
        workbook.close();
    }
    
    /**
     * 设置标题单元样式
     *
     * @param workbook
     * @return
     */
    public static XSSFCellStyle createTitleCellStyle(XSSFWorkbook workbook) {
    	XSSFCellStyle  cellStyle = workbook.createCellStyle();
        XSSFFont font = workbook.createFont();
        font.setBold(true);
        font.setFontHeightInPoints((short) 20);
        font.setFontName(HSSFFont.FONT_ARIAL);// 设置标题字体
        cellStyle.setFont(font);
        cellStyle.setWrapText(true);
        cellStyle = workbook.createCellStyle();
        cellStyle.setFont(font);// 设置列标题样式
        
        XSSFColor color = new XSSFColor();
        //根据你需要的rgb值获取byte数组
        color.setRGB(intToByteArray(getIntFromColor(255,231,228)));
        //设置自定义背景颜色
        cellStyle.setFillForegroundColor(color);
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        //设置字体水平居中
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        //设置字体垂直居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        
        //设置边框
        cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
        cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
        cellStyle.setBorderTop(BorderStyle.THIN);//上边框
        cellStyle.setBorderRight(BorderStyle.THIN);//右边框
        
        return cellStyle;
    }
    
    /**
     * 设置表头单元样式
     *
     * @param workbook
     * @return
     */
    public static XSSFCellStyle createTableCellStyle(XSSFWorkbook workbook) {
    	XSSFCellStyle cellStyle = workbook.createCellStyle();
        XSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 11);
        font.setFontName(HSSFFont.FONT_ARIAL);// 设置标题字体
        cellStyle.setFont(font);
        cellStyle.setWrapText(true);
        cellStyle = workbook.createCellStyle();
        cellStyle.setFont(font);// 设置列标题样式
        
        XSSFColor color = new XSSFColor();
        //根据你需要的rgb值获取byte数组
        color.setRGB(intToByteArray(getIntFromColor(251,241,227)));
        //设置自定义背景颜色
        cellStyle.setFillForegroundColor(color);
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        //设置字体水平居中
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        
        //设置边框
        cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
        cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
        cellStyle.setBorderTop(BorderStyle.THIN);//上边框
        cellStyle.setBorderRight(BorderStyle.THIN);//右边框
        
        return cellStyle;
    }
    
    /**
     * 设置内容单元样式
     *
     * @param workbook
     * @return
     */
    public static XSSFCellStyle createRowCellStyle(XSSFWorkbook workbook) {
    	XSSFCellStyle cellStyle = workbook.createCellStyle();

        XSSFColor color = new XSSFColor();
        //根据你需要的rgb值获取byte数组
        color.setRGB(intToByteArray(getIntFromColor(220,220,220)));
        //设置自定义背景颜色
        cellStyle.setFillForegroundColor(color);
        cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        //设置边框
        cellStyle.setBorderBottom(BorderStyle.THIN); //下边框
        cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
        cellStyle.setBorderTop(BorderStyle.THIN);//上边框
        cellStyle.setBorderRight(BorderStyle.THIN);//右边框
        XSSFColor borderColor = new XSSFColor();
        //设置字体水平居中
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        //设置字体垂直居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        //根据你需要的rgb值获取byte数组
        borderColor.setRGB(intToByteArray(getIntFromColor(181,181,181)));
        cellStyle.setLeftBorderColor(borderColor);
        cellStyle.setRightBorderColor(borderColor);
        cellStyle.setBottomBorderColor(borderColor);
        cellStyle.setTopBorderColor(borderColor);
        
        return cellStyle;
    }
    
    /**
     * 设置内容单元样式(字体靠右对齐)
     * 数字类型
     * @param workbook
     * @return
     */
    public static XSSFCellStyle createRightRowCellStyle(XSSFWorkbook workbook) {
    	XSSFCellStyle  cellStyle = workbook.createCellStyle();
        cellStyle.setWrapText(true);
        cellStyle = workbook.createCellStyle();
        
        XSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 11);
        cellStyle.setFont(font);
        
        //设置字体水平居中
        cellStyle.setAlignment(HorizontalAlignment.RIGHT);
        //设置字体垂直居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        return cellStyle;
    }
    
    /**
     * 设置内容单元样式(字体靠左对齐)
     * 文本类型
     * @param workbook
     * @return
     */
    public static XSSFCellStyle createLeftRowCellStyle(XSSFWorkbook workbook) {
    	XSSFCellStyle cellStyle = workbook.createCellStyle();
        //设置字体位置
        cellStyle.setAlignment(HorizontalAlignment.LEFT);
        //设置字体垂直居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        return cellStyle;
    }
    
    /**
     * rgb转int
     */
     private static int getIntFromColor(int Red, int Green, int Blue){
         Red = (Red << 16) & 0x00FF0000;
         Green = (Green << 8) & 0x0000FF00;
         Blue = Blue & 0x000000FF;
         return 0xFF000000 | Red | Green | Blue;
     }
     
     /**
      * int转byte[]
      */
     public static byte[] intToByteArray(int i) {
         byte[] result = new byte[4];
         result[0] = (byte)((i >> 24) & 0xFF);
         result[1] = (byte)((i >> 16) & 0xFF);
         result[2] = (byte)((i >> 8) & 0xFF);
         result[3] = (byte)(i & 0xFF);
         return result;
     }
}

最终导出效果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942328.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端:改变鼠标点击物体的颜色

需求&#xff1a; 需要改变图片中某一物体的颜色&#xff0c;该物体是纯色&#xff1b; 鼠标点击哪个物体&#xff0c;哪个物体的颜色变为指定的颜色&#xff0c;利用canvas实现。 演示案例 代码Demo <!DOCTYPE html> <html lang"en"><head>&l…

AI口播数字人系统快速搭建方法来袭!零经验小白也能学会!

随着AI口播数字人的身影在短视频和直播中的出现频率持续升高&#xff0c;越来越多的创业者都察觉到了AI口播数字人系统所蕴含着的巨大潜在用户规模和广阔收益前景&#xff0c;并打听起了AI口播数字人系统怎么搭建相关的各种消息。 毕竟&#xff0c;根据当前的使用情况来看&…

中小学生心理健康测评系统:精准洞察,助力成长!

随着社会的发展&#xff0c;中小学生的心理健康问题日益受到关注。国家出台了一系列政策&#xff0c;强调要加强学生心理健康教育。然而&#xff0c;在实际的校园环境中&#xff0c;中小学生面临着各种各样的心理挑战&#xff0c;课程增多、难度加大&#xff0c;考试频繁&#…

2024年12月英语六级CET6写作与翻译笔记

目录 1 写作 1.1 大学为学生提供了探索各种可能性 1.2 自律在个人成长中的重要性 1.3 切实可行的目标 2 翻译 2.1 洋山港(Yangshan Port) 2.2 中国航天事业 2.3 北斗卫星导航系统 1 写作 1.1 大学为学生提供了探索各种可能性 1.2 自律在个人成长中的重要性 1.3 切实可…

Unity性能优化 --- 减少OverDraw

OverDraw(过度绘制)就是GPU多次重复绘制同一像素点的操作。在Unity 中渲染的图像由数百万个像素组成&#xff0c;如果这些像素被多次绘制&#xff0c;那么会造成GPU极大的性能损耗。例如下图多个物体叠加放在一起 注&#xff1a;棕色越深的地方&#xff0c;过度绘制的次数越多。…

PostgreSQL 的历史

title: PostgreSQL 的历史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功能强大且广泛使用的开源关系型数据库管理系统。其历史可以追溯到1986年,当时由加州大学伯克利分校的一个研究团队开发。文章将深入探讨 PostgreSQL 的起源、…

python学opencv|读取图像(二十一)使用cv2.circle()绘制圆形进阶

【1】引言 前序已经掌握了使用cv2.circle()绘制圆形的基本操作&#xff0c;相关链接为&#xff1a; python学opencv|读取图像&#xff08;二十&#xff09;使用cv2.circle()绘制圆形-CSDN博客 由于圆形本身绘制起来比较简单&#xff0c;因此可以自由操作的空间也就大&#x…

大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

保险科技“数智化+”赋能险企高质量发展

文 / 太保科技有限公司人工智能服务事业群资深产品经理 娄昕盛 中国太平洋保险(集团)股份有限公司数智研究院人工智能首席专家 徐国强 中国太平洋保险(集团)股份有限公司数智研究院执行院长 王磊 近年来,保险科技正处在“数字化+”向“数智化+”发展的过渡阶段,…

AI科研助手开发总结:向量与数据权应用(二)

一、前言 继上篇文章&#xff1a;AI科研助手开发总结&#xff1a;向量与数据权限的应用&#xff08;一&#xff09; 本章根据向量库内存储数据及权限&#xff0c;向量库统一维护和管理数据权限方案讨论。 二、方案分析-基于向量Fields 2.1 思路 结合橙语AI科研助手的业务场…

数字逻辑(七)——逻辑运算中三种基本运算及其符合运算

目录 1 三种基本逻辑运算 1.1 与&#xff08;AND&#xff09; 1.2 或&#xff08;OR&#xff09; 1.3 非&#xff08;NOT&#xff09; 2 由基本门电路组成的其他门电路 2.1 异或 2.2. 同或 2.3 与非 2.4 或非 用于分析数字电路中逻辑功能的数学方法——逻辑代数&#…

分布式事务的解决方案(欢迎讨论~)

目录 背景 CAP定理 BASE理论 场景重现​编辑 分布式事务常见的解决分案 1.二段提交 2.三段提交 3.TCC模式 4.分布式补偿事务&#xff08;Saga&#xff09; 5.Seata分布式框架-XA模式 6.Seata分布式框架-AT模式 XA AT TCC SAGA 的对比 背景 首先必须介绍一下分布式中…

汽车IVI中控开发入门及进阶(43):NanoVG

NanoVG:基于OpenGL的轻量级抗锯齿2D矢量绘图库 NanoVG是一个跨平台、基于OpenGL的矢量图形渲染库。它非常轻量级,用C语言实现,代码不到5000行,非常精简地实现了一套HTML5 Canvas API,做为一个实用而有趣的工具集,用来构建可伸缩的用户界面和可视化效果。NanoVG-Library为…

从0到1实现一个RS蓝图系统-概念提出技术栈选型

请不要自我设限&#xff0c;真正好的人生态度&#xff0c;是现在就做&#xff0c;不等、不靠、不懒惰。 ——小野《改变力》 一、什么是蓝图&#xff1f; 蓝图(BluePrint) 是Epic Games 针对虚幻4引擎开发的可视化脚本语言。当你使用蓝图的时候&#xff0c;其实就是在编写代码…

【C++ 类和对象 基础篇】—— 抽象思维的巅峰舞者,演绎代码的深邃华尔兹

C学习笔记&#xff1a; C 进阶之路__Zwy的博客-CSDN博客 各位于晏&#xff0c;亦菲们&#xff0c;请点赞关注&#xff01; 我的个人主页&#xff1a; _Zwy-CSDN博客 目录 1、类 1.1、类的定义 1.2、访问限定符 1.2.1、public 1.2.2、private 1.2.3、protected 1.3、…

(高可用版本)Kubeadm+Containerd+keepalived部署高可用k8s(v1.28.2)集群

KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集群 一.环境准备&#xff0c;二.容器运行时Containerd安装请参照前文。KubeadmContainerd部署k8s(v1.28.2)集群&#xff08;非高可用版&#xff09;-CSDN博客 文章目录 KubeadmContainerdkeepalived部署高可用k8s(v1.28.2)集…

联合目标检测与图像分类提升数据不平衡场景下的准确率

联合目标检测与图像分类提升数据不平衡场景下的准确率 在一些数据不平衡的场景下&#xff0c;使用单一的目标检测模型很难达到99%的准确率。为了优化这一问题&#xff0c;适当将其拆解为目标检测模型和图像分类模型的组合&#xff0c;可以更有效地控制最终效果&#xff0c;尤其…

C++之红黑树模拟实现

目录 红黑树的概念 红黑树的性质 红黑树的查找效率 红黑树的实现 红黑树的定义 红黑树节点的插入 红黑树的平衡调整 判断红黑树是否平衡 红黑树整体代码 测试代码 上期我们学习了AVL树的模拟实现&#xff0c;在此基础上&#xff0c;我们本期将学习另一个数据结构-…

机器学习常用术语

目录 概要 机器学习常用术语 1、模型 2、数据集 3、样本与特征 4、向量 5、矩阵 6、假设函数与损失函数 7、拟合、过拟合与欠拟合 8、激活函数(Activation Function) 9、反向传播(Backpropagation) 10、基线(Baseline) 11、批量(Batch) 12、批量大小(Batch Size)…

nest 学习3

学习小册(nest通关秘籍) 邮箱验证码登陆 流程图&#xff1a; 邮箱作为key&#xff0c;生成随机验证码&#xff0c;然后放到redis中。调用邮箱api发送邮箱。 前端获取到code后&#xff0c;将验证码输入传给后端&#xff0c;后端根据邮箱取出redis数据&#xff0c;比对验证码&…