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

embedded/2024/12/27 2:47:30/

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

控制层代码

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

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

CommonExcelUtils工具类

java">    /*** 动态列表导出* @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工具类

java">    /*** 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工具类

java">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行,然后自增1XSSFRow 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());//关闭workbookworkbook.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;}
}

最终导出效果:


http://www.ppmy.cn/embedded/149071.html

相关文章

全国硕士研究生入学考试(考研)备考要点之具体科目

考研备考要点详解&#xff1a;具体科目复习策略与关键建议 在中国&#xff0c;考研&#xff08;研究生入学考试&#xff09;是本科生提升学历、深化专业知识和拓展职业发展的重要途径。考研备考过程中&#xff0c;各科目的复习策略与方法至关重要&#xff0c;直接影响考生的考…

Tana 与 Notion 面向未来的 All-in-one 笔记工具

随着数字时代的快速发展&#xff0c;信息管理和知识组织工具成为了现代工作者不可或缺的一部分。在这篇文章中&#xff0c;我们将深入探讨两款备受瞩目的应用程序——Tana 和 Notion。它们不仅代表了当前市场上最先进的生产力解决方案之一&#xff0c;而且各自以独特的方式重新…

Spring常见问题

Spring常见问题 1.什么是Spring,对Spring的理解? Spring是一个轻量级的,IOC和AOP的一站式框架,为简化企业级开发而生的. Spring会管理对象,需要使用的时候直接注入即可,还可以对对象的功能进行增强,使得耦合度降低. 2.解释IOC和AOP IOC (控制反转)将生成对象控制权反转给…

使用复数类在C#中轻松绘制曼德布洛集分形

示例在 C# 中绘制曼德布洛特集分形解释了如何通过迭代以下方程来绘制曼德布洛特集&#xff1a; 其中 Z(n) 和 C 是复数。程序迭代此方程&#xff0c;直到 Z(n) 的大小至少为 2 或程序执行最大迭代次数。 该示例在单独的变量中跟踪数字的实部和虚部。此示例使用Complex类来更轻松…

Serverless集成和扩展性概述

Serverless架构的一个关键优势是其灵活性和可扩展性。开发者可以轻松集成各种第三方服务和平台,以扩展应用的功能。以下是一些关键的集成和扩展性策略: 第三方API集成:集成第三方API来增强应用功能,如支付处理、地图服务等。微服务架构:采用微服务架构来构建可扩展的Serve…

网络安全 | 云计算中的数据加密与访问控制

网络安全 | 云计算中的数据加密与访问控制 一、前言二、云计算概述2.1 云计算的定义与特点2.2 云计算的服务模式2.3 云计算的数据安全挑战 三、数据加密技术在云计算中的应用3.1 对称加密算法3.2 非对称加密算法3.3 混合加密算法 四、云计算中的访问控制模型4.1 基于角色的访问…

肿瘤电场仪疗法原理:科技之光,照亮抗癌之路

在医疗科技日新月异的今天&#xff0c;肿瘤电场仪疗法作为一种创新的无创治疗手段&#xff0c;正以其独特的物理机制和生物效应&#xff0c;为患者带来了新的治疗选择和希望。本文将深入探讨肿瘤电场仪疗法的原理&#xff0c;揭示其如何在不伤害正常组织的前提下&#xff0c;精…

网络安全概论

一、 网络安全是一个综合性的技术。在Internet这样的环境中&#xff0c;其本身的目的就是为了提供一种开放式的交互环境&#xff0c;但是为了保护一些秘密信息&#xff0c;网络安全成为了在开放网络环境中必要的技术之一。网络安全技术是随着网络技术的进步逐步发展的。 网络安…