Java:表单生成excel文档 poi 通用

在用java 写数据库应用的时候, 通常会生成各种报表,而这些报表可能会被导出为各种格式的文件,比如Excel文档,pdf 文档等等. 今天先做了一个生成Excel 文档的例子,主要解决以下问题:

1. 生成 Excel 文档.
2. 自动对生成的Excel 文档第一行标题栏设置成filter 过滤形式, 方便用户使用.

导入依赖: 

<!--依赖的jar包-->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version>
</dependency>

 Excel转换通用类:

package com.kingbal.king.dmp;import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;/*** <b>Function: </b> todo** @program: ExcelUtil* @Package: com.kingbal.king.dmp* @author: songjianlin* @date: 2023/12/30* @version: 1.0* @Copyright: 2023 www.kingbal.com Inc. All rights reserved.*/
public class ExcelUtil<T> {public HSSFCellStyle getCellStyle(HSSFWorkbook workbook, boolean isHeader) {HSSFCellStyle style = workbook.createCellStyle();style.setBorderBottom(HSSFCellStyle.BORDER_THIN);style.setBorderLeft(HSSFCellStyle.BORDER_THIN);style.setBorderRight(HSSFCellStyle.BORDER_THIN);style.setBorderTop(HSSFCellStyle.BORDER_THIN);style.setLocked(true);if (isHeader) {style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);HSSFFont font = workbook.createFont();font.setColor(HSSFColor.BLACK.index);font.setFontHeightInPoints((short) 12);font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);style.setFont(font);}return style;}public void generateHeader(HSSFWorkbook workbook, HSSFSheet sheet, String[] headerColumns) {HSSFCellStyle style = getCellStyle(workbook, true);Row row = sheet.createRow(0);row.setHeightInPoints(30);for (int i = 0; i < headerColumns.length; i++) {Cell cell = row.createCell(i);String[] column = headerColumns[i].split("_#_");sheet.setColumnWidth(i, Integer.valueOf(column[1]));cell.setCellValue(column[0]);cell.setCellStyle(style);}}@SuppressWarnings({"rawtypes", "unchecked"})public HSSFSheet creatAuditSheet(HSSFWorkbook workbook, String sheetName,List<T> dataset, String[] headerColumns, String[] fieldColumns)throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {HSSFSheet sheet = workbook.createSheet(sheetName);sheet.protectSheet("");generateHeader(workbook, sheet, headerColumns);HSSFCellStyle style = getCellStyle(workbook, false);SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");int rowNum = 0;for (T t : dataset) {rowNum++;Row row = sheet.createRow(rowNum);row.setHeightInPoints(25);for (int i = 0; i < fieldColumns.length; i++) {String fieldName = fieldColumns[i];String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);try {Class clazz = t.getClass();Method getMethod;getMethod = clazz.getMethod(getMethodName, new Class[]{});Object value = getMethod.invoke(t, new Object[]{});String cellValue = "";// 对于某些特定类型进行转换if (value instanceof Date) {Date date = (Date) value;cellValue = sd.format(date);} else {cellValue = null != value ? value.toString() : "";}Cell cell = row.createCell(i);cell.setCellStyle(style);cell.setCellValue(cellValue);} catch (Exception e) {}}}return sheet;}}

根据需求调用:

public static void main(String[] args) {Map<String, Object> param = Maps.newHashMap();param.put( "callType", "CALL_IN" );// 获取您对应查询的字段List<Cdr> cdrList = cdrService.queryListByParam(param);String [] cdrInColumns = new String[]{"呼入时间_#_3000" ,"挂断时间_#_3000" ,"座席工号_#_3000" ,"座席姓名_#_3000" ,"呼入时长(秒)_#_3000" ,"IVR时长(秒)_#_3000" ,"排队时长(秒)_#_3000" ,"通话时长(秒)_#_3000" ,"归属地_#_3000" ,"满意度调查_#_3000"};String [] cdrInFields = new String []{"callTime","hangupTime" ,"src" ,"workNo" ,"trueName" ,"totalLength" ,"ivrLength" ,"queueLength","datlLength" ,"city" ,"ivrKey"};HSSFWorkbook workbook = new HSSFWorkbook();ExcelUtil<Cdr> cdrSheet = new ExcelUtil<Cdr>();cdrSheet.creatAuditSheet(workbook, "呼出信息" , cdrList, cdrInColumns, cdrInFields);ByteArrayOutputStream os = new ByteArrayOutputStream();workbook.write(os);InputStream inputStream = new ByteArrayInputStream(os.toByteArray());// 获取文件长度 inputStream.available()}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【 C语言 】| C程序百例 - 绘制余弦曲线

【 C语言 】| C程序百例 - 绘制余弦曲线 时间&#xff1a;2023年12月29日12:56:29 文章目录 【 C语言 】| C程序百例 - 绘制余弦曲线1.要求2.问题分析与算法设计3.程序3-1.源码3-2.makefile 4.运行 1.要求 在屏幕上用"*"显示0~360的余弦曲线cos(x)曲线。 2.问题分析与…

WebStorage本地存储

WebStorage WebStorage包含sessionStorage和localStorage。其存储内存一把在5MB左右(不同浏览器不同) localStorage存储,当浏览器关闭在开启存储的数据不会被清除。 清除浏览记录或操作localStorage可清除存储的数据 sessionStorage和localStorage的代码书写一致&#xff0c…

代码随想录刷题 | Day1

今日学习目标 一、基础 数组 array类 模板类vector 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 需要两点注意的是 数组下标都是从0开始的。 数组内存空间的地址是连续的 而且大家如果使用C的话&…

【AIGC表情prompt】提示词练习技巧

表情类提示词练习技巧 医疗机器人&#xff0c;男人笑脸景深&#xff0c;数据&#xff0c;座标&#xff0c;12k,c4d渲染&#xff0c;高分辨率&#xff0c;,暖色调&#xff0c;高清对比 医疗机器人&#xff0c;男人微笑&#xff0c;景深&#xff0c;数据&#xff0c;座标&#xf…

SpringCloud实战之Kubernetes项目运行示例

全文速览&#xff1a; 获取源码并加载环境spring-cloud-kubernetes下的示例mac minikube 本地构建执行SpringCloud-Kubernetes-Example 文章背景&#xff1a; 2019年开始 SpringCloud 开始向 K8S容器化流程演变&#xff0c;逐步诞生了【Spring-Cloud-Kubernetes】 环境要求&a…

mysql隔离级别和串行化

MySQL支持的隔离级别有四种&#xff0c;分别是&#xff1a; Read Uncommitted&#xff08;读未提交&#xff09; Read Committed&#xff08;读已提交&#xff09; Repeatable Read&#xff08;可重复读&#xff09; Serializable&#xff08;串行化&#xff09; 这些隔离级别…

nginx日志常见报错解决

目录 一&#xff1a;报错 二&#xff1a;php查看后台内容有的栏目出现502&#xff1f; 三&#xff1a;413 Request Entity Too Large? 四&#xff1a;Request Header Or Cookie Too Large 400 一&#xff1a;报错 upstream prematurely closed connection while reading r…

【C语言数组传参】规则详解

目录 数组传参介绍 数组传参规则 数组传参的实参 特殊情况一&#xff1a;sizeof&#xff08;数组名&#xff09; 特殊情况二&#xff1a;&数组名 数组传参的形参 数组传参使用数组名作为形参接收 形参如果是⼀维数组 形参如果是⼆维数组 数组传参使用指针作为形参…

Linux:apache优化(1)—— 长链接/保持连接

系统:CentOS 7.9 apache版本为&#xff1a;2.4.25 需要使用源码包进行安装才能够使用这些扩展模块 在使用这些扩展模块前要先下载zlib-devel 安装--enable-deflate选项需要的网页压缩传输的软件包 yum -y install zlib-devel 在配置编译安装时需要使用扩展配置 ./config…

滤波器opencv

在OpenCV中&#xff0c;滤波器用于对图像进行平滑、锐化、边缘检测等操作。以下是一些常用的滤波器及其在OpenCV中的Python代码示例&#xff1a; 均值滤波器&#xff08;平滑图像&#xff09;&#xff1a; import cv2 import numpy as np# 读取图像 image cv2.imread(path_t…

如何使用Docker将.Net6项目部署到Linux服务器(三)

目录 四 安装nginx 4.1 官网下载nginx 4.2 下载解压安装nginx 4.3 进行configure 4.4 执行make 4.5 查看nginx是否安装成功 4.6 nginx的一些常用命令 4.6.1 启动nginx 4.6.2 通过命令查看nginx是否启动成功 4.6.3 关闭Nginx 4.6.5 重启Nginx 4.6.6 杀掉所有Nginx进程 4.…

先序+中序还原二叉树【数据结构】

先序中序还原二叉树 题目描述 给定一棵二叉树的先序遍历序列和中序遍历序列&#xff0c;要求计算该二叉树的高度。 输入 输入首先给出正整数N&#xff08;≤50&#xff09;&#xff0c;为树中结点总数。下面两行先后给出先序和中序遍历序列&#xff0c;均是长度为N的不包含重…

C# 使用ZXing.Net识别二维码和条码

目录 写在前面 代码实现 调用示例 写在前面 上一篇写了 C# 使用ZXing.Net生成二维码和条码-CSDN博客 使用ZXing.Net解码非常简单&#xff0c;事实上就只用一行代码就好了&#xff0c;这么简单那为什么还要贴在这里呢&#xff0c;原因是开始时&#xff0c;在网上看资料看到…

Linux 编写脚本定时发送天气预报

1 首先要配置smtp服务 我这里使用的是qq邮箱 拿到smtp的密钥 2 配置mail.rc文件 在配置文件末尾加上 set from109456****qq.com #这里是发送邮件的地址 set smtpsmtp.qq.com:587 #阿里云一定要带上这个端口号&#xff0c;其他云服务商不用 set smtp-auth-user109456**** #…

Mybatis行为配置之Ⅳ—日志

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

系统启动流程 - 理解modules加载流程

​编辑 Hacker_Albert    202 linux 启动流程module加载 1.启动过程分为三个部分 BIOS 上电自检&#xff08;POST&#xff09;引导装载程序 (GRUB2)内核初始化启动 systemd&#xff0c;其是所有进程之父。 1.1.BIOS 上电自检&#xff08;POST&#xff09; BIOS stands for…

前端网络面试:浏览器输入地址后发生了什么?

理解整块的内容涉及到的 UDP、TCP 以及 http、https 相关知识 1. 请求前 浏览器自动补全协议、端口浏览器自动完成 url 编码浏览器根据 url 地址查找本地缓存&#xff0c;根据缓存规则看是否命中缓存 若命中缓存则直接使用缓存&#xff0c;不再发出请求未命中直接请求 通过 DN…

图像拼接——基于homography的特征匹配算法

目录 1. 任务要求2. 数据集3. 基于homography的特征匹配算法4. 拼接流程展示4.1 图片实例4.2 特征点位图4.3 特征点匹配结果4.4 相机校准结果4.5 拼接结果 5. 部分图像拼接结果展示 1. 任务要求 输入&#xff1a;同一个场景的两张待拼接图像&#xff08;有部分场景重合&#x…

拓展操作(一) Linux 2台机器之间进行免密登录

让清单成为一种习惯 互联网时代的变革,不再是简单的开发部署上线,持续,正确,安全地把事情做好尤其重要;把事情做好的前提是做一个可量化可执行的清单,让工程师就可以操作的清单而不是专家才能操作: 设定检查点 根据节点执行检查程序操作确认或边读边做 二者选其一不要太…

macOS系统打开Linux的方法

第一步 按下[command空格键]调出搜索框&#xff0c;输入“终端”&#xff0c;打开图上第一个 第二步 如图先输入"sudo -i"&#xff0c;敲回车键&#xff0c;再输入开机密码&#xff0c;再敲回车键就可以打开。注意&#xff1a;这里的密码输入不会显示在页面。 如果要…