Java Excel导出复杂excel表格样式之ExcelUtil工具类

news/2024/9/22 5:30:46

Java Excel导出包括普通导出及复杂表格样式,主要是对于需要进行行列合并的列进行特殊处理,计算清楚起始行,结束行,起始列,结束列。
普通导出可以是所有列,也可以是包含某些列,或者排除某些列;
在这里插入图片描述

1. 效果图

在这里插入图片描述

2. 原理

在这里插入图片描述
如对于上图中的覆盖能力,需要A2,A3,A4行列进行合并,则传参

// 表示要执行合并的行是第一行,从第1行到第3行,从第0列到第0列;注意这里excel的行列编号下表index都是从0开始的。
mergeRowColCell(sheet, 1, 1, 3, 0, 0, ‘覆盖能力’,valStyle);

3. 源码

3.1 pom

<!--easyexcel 依赖-->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version>
</dependency>

3.2 ExcelUtil工具类

package com.example.restservice.utils;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;/**************************************Class Name: ExcelUtil*Description: <Excel导出类>*@author: Seminar*@create: 2022/4/6*@since 1.0.0*************************************/
public class ExcelUtil {public static final String UNDERLINE = "_";public static ServletOutputStream setResponseParam(HttpServletResponse response, String fileName) throws IOException {String value = "attachment; filename=" + new String((fileName + UNDERLINE + new SimpleDateFormat("yyyyMMdd").format(new Date()) + ExcelTypeEnum.XLS.getValue()).getBytes("gb2312"), "ISO8859-1");response.setCharacterEncoding("utf-8");response.setContentType("application/vnd.openxmlformats.officedocument.spreadsheetml.sheet");response.setHeader("Content-disposition", value);return response.getOutputStream();}public static void exportExcel(HttpServletResponse response, String fileName, Class clazz, List data) throws IOException {OutputStream os = setResponseParam(response, fileName);EasyExcel.write(os, clazz).sheet(fileName).doWrite(data);}public static void exportExcelIncludeColumns(HttpServletResponse response, String fileName, Class clazz, List data, List<String> columns) throws IOException {OutputStream os = setResponseParam(response, fileName);EasyExcel.write(os, clazz).includeColumnFiledNames(columns).sheet(fileName).doWrite(data);}public static void exportExcelExcludeColumns(HttpServletResponse response, String fileName, Class clazz, List data, List<String> columns) throws IOException {OutputStream os = setResponseParam(response, fileName);EasyExcel.write(os, clazz).excludeColumnFiledNames(columns).sheet(fileName).doWrite(data);}/*** 定制导出Excel** @param response* @param fileName sheet名称* @param title    标题* @param data     表格数据* @return*/public static void exportExcelPj(HttpServletResponse response, String fileName, String[] title, String[][] data) throws IOException {OutputStream os = setResponseParam(response, fileName);// 第一步,创建一个HSSFWorkbook,对应一个Excel文件HSSFWorkbook wb = new HSSFWorkbook();// 第二步,在workbook中添加一个sheet,对应Excel文件中的sheetHSSFSheet sheet = wb.createSheet(fileName);// 设置列宽sheet.setColumnWidth(0, 5000);sheet.setColumnWidth(2, 5000);// 第三步,在sheet中添加表头第0行HSSFRow row1 = sheet.createRow(0);// 第四步,创建单元格,并设置表头居中及值的样式HSSFCellStyle style = wb.createCellStyle();style.setFillBackgroundColor(IndexedColors.GREEN.getIndex());style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式style.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中HSSFCellStyle leftStyle = wb.createCellStyle();leftStyle.setFillBackgroundColor(IndexedColors.GREEN.getIndex());leftStyle.setAlignment(HorizontalAlignment.LEFT); // 创建一个居中格式HSSFCell cell = null;// 创建标题for (int i = 0; i < title.length; i++) {cell = row1.createCell(i);cell.setCellValue(title[i]);cell.setCellStyle(style);}//合并单元格的内容List<String> mergeCells = Arrays.asList(new String[]{"覆盖能力(20分)", "获取成本(10分)", "数据质量(60分)","产线支持(10分)", "附带价值(10分)", "总分"});for (int i = 0; i < data.length; i++) {//创建内容row1 = sheet.createRow(i + 1);for (int j = 0; j < data[i].length; j++) {//将内容按顺序赋给对应的列对象cell = row1.createCell(j);cell.setCellValue(data[i][j]);// 设置评价指标列居左,其他的列剧中if (j == 2) {cell.setCellStyle(leftStyle);} else {cell.setCellStyle(style);}}}mergeRowColCell(sheet, 1, 1, 3, 0, 0, mergeCells.get(0), style);mergeRowColCell(sheet, 4, 4, 6, 0, 0, mergeCells.get(1), style);mergeRowColCell(sheet, 7, 7, 13, 0, 0, mergeCells.get(2), style);mergeRowColCell(sheet, 14, 14, 14, 0, 0, mergeCells.get(3), style);mergeRowColCell(sheet, 15, 15, 15, 0, 0, mergeCells.get(4), style);mergeRowColCell(sheet, 16, 16, 16, 1, 3, "", style);mergeRowColCell(sheet, 16, 16, 16, 0, 0, mergeCells.get(5), style);wb.write(os);os.flush();os.close();}/*** 表格合并方法** @param sheet    表格sheet* @param rowIndex 要执行合并的行* @param firstRow 首行* @param lastRow  尾行* @param firstCol 首列* @param lastCol  尾列* @param cellVal  合并后的单元格值* @param valStyle 合并后的单元格样式*/private static void mergeRowColCell(HSSFSheet sheet, int rowIndex, int firstRow, int lastRow, int firstCol, int lastCol, String cellVal, HSSFCellStyle valStyle) {if (!(firstRow == lastRow && firstCol == lastCol)) {// 合并单元格CellRangeAddress callRangeAddress = new CellRangeAddress(firstRow, lastRow, firstCol, lastCol);//起始行,结束行,起始列,结束列sheet.addMergedRegion(callRangeAddress);}HSSFRow row = sheet.getRow(rowIndex);HSSFCell cell = row.createCell(0);cell.setCellValue(cellVal);cell.setCellStyle(valStyle);}
}

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

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

相关文章

CSS截取字符串,兼容浏览器

今天在经典论坛看到有同学问到CSS截取字符多余省略号代替的求助且要兼容FF... 这个的确是个比较头痛的问题&#xff0c;现在我在的公司都是程序截取显示省略符的。兼容是没问题&#xff0c;但在中文和数学或字母混排时&#xff0c;就会有点小小的视觉缺陷。在程序截取中&#x…

读书笔记2|深度学习入门——基于python的理论与实现

深度学习入门&#xff1a;基于Python的理论与实现》高清中文版.pdf 1. python基础&#xff0c;numpy&#xff0c;matplotlib Batch Normalization、Dropout、Adam 图像识别&#xff0c;自然语言处理&#xff0c;语音识别。 不闻不若闻之&#xff0c;闻之不若见之&#xff0…

Java Feign调用时报错:[400 Bad Request] during [POST] to XXX

feign.FeignException$BadRequest: [400] during [POST] to [http… 主要原因是参数过大 可以采取 调大服务提供者的header参数(微服务较多 不太适用) server:port: 8080max-http-header-size: 102400改为requestBody调用服务&#xff08;分批调用接口多次&#xff09;&am…

[发布] Photoshop 油画效果滤镜

【原创性声明】本滤镜是我采用 PS SDK 开发而成&#xff0c;而滤镜的算法具体是由谁提出的可能不详&#xff0c;我是参考了 FilterExplorer 的源码&#xff08;VC 6&#xff09;&#xff0c;本算法的主要参考来源是该项目中的 Filters.cpp, 作者是 Jason Waltman (18, April, 2…

Java解析省市县树形结构工具类

这篇博客将介绍如何根据6位行政编码&#xff0c;解析出省市县区等。adcode共6位&#xff0c;前俩位省/直辖市/自治区&#xff0c;前4位城市&#xff0c;6位区县&#xff0c;并优雅的树形结构输出省市。 本文只解析了俩层&#xff0c;感兴趣的小伙伴可以自行解析区县。 1.效果…

红外视觉1:近红外与中远红外图像

红外视觉1&#xff1a;近红外与中远红外图像 这篇博客将介绍红外成像的基础知识&#xff0c;包括&#xff1a; 什么是红外图像&#xff1a;近红外与中远/远红外(Near vs Mid-Far Infrared/Far infrared)红外热像仪的类型用途 红外视觉简介&#xff1a;近红外与中远红外图像&…

使用Python,PCA对iris数据集降维2维/3维并进行2D,3D散点图绘制(包括有图例无图例,有标题Label无标题Label)

这篇博客将介绍如何使用Python&#xff0c;PCA对iris数据集降维2&#xff0c;3并进行2D,3D散点图绘制&#xff08;包括有图例&无图例&#xff0c;有标题Label&无标题Label&#xff09;。 着重介绍怎么一次性添加多类型的图例到图表&#xff0c;通过显式获取scatter。 …

使用Python,matplotlib绘制复杂曲线,并求其交点,y=-sin(x)-x-1并求解函数的值

写这篇博客源于博友的提问&#xff0c;将介绍如何使用Python&#xff0c;matplotlib绘制复杂曲线&#xff0c;并求其交点&#xff0c;y-sin(x)-x-1并求解函数的值。 1. 效果图 ysin(x)效果图如下&#xff1a; y -x - ln(x)效果图如下&#xff1a; y-sin(x)-x-1 & y…