Java利用POI绘制表格

前提需求

最近公司要求写一些记录的表格,并且带有导出功能。再深入学习后,表格的底层其实就是list遍历塞值,导出功能的话可以由前端,后端实现,但技多不压身嘛,这里我自己就写了后端的导出功能,和大家分享一下。

代码实现

基础版:只有列的表头,没有合并单元格的情况。

效果如下:

示例代码实现:

public void exportCureList(HttpServletResponse response,@RequestBody CureListRo ro) throws Exception{//查找需要填充的数据listList list=...;if (ObjectUtil.isEmpty(list)){throw new BusinessException("数据为空无法导出EXCEL");}List<List<Object>> rows = new ArrayList<>();//固定第一行表头List<Object> row = new ArrayList<>();row.add("患者姓名");row.add("手机号");row.add("门诊号");row.add("开单科室");row.add("开单医生");row.add("治疗师");row.add("治疗项目");row.add("是否签名");row.add("治疗开始");row.add("治疗完成");row.add("治疗项目");row.add("合计金额");rows.add(row);//填充剩余数据list.forEach(a->{List<Object> data= new ArrayList<>();data.add(a.getName());data.add(a.getPhone());data.add(a.getOutpatientId());data.add(a.getDepartmentName());data.add(a.getDoctor());data.add(a.getTherapists());data.add(a.getItems());data.add(a.getIsSign());data.add(a.getCureStartTime());data.add(a.getCureEndTime());data.add(a.getItems());data.add(a.getTotalPrice());rows.add(data);});//在内存操作,写到浏览器ExcelWriter writer= ExcelUtil.getWriter(true);//默认配置writer.write(rows,true);response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("治疗记录", "UTF8") + ".xlsx");ServletOutputStream outputStream= response.getOutputStream();//将Writer刷新到OutPutwriter.flush(outputStream,true);outputStream.close();writer.close();}

高阶版:表头存在斜杠,并且分层级有合并单元格。

示例代码实现:

public void exposeGetPerDepartmentOpenBillListNew(HttpServletResponse response,String startTime, String endTime, String departmentId, String doctorId, String tsName) throws IOException {//查询出的数据Vo vo=....;XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = workbook.createSheet("sheetName");CellRangeAddress range = new CellRangeAddress(0, 1, 0, 0);sheet.addMergedRegion(range);sheet.setColumnWidth(0, 5000);Row row1 = sheet.createRow(0);row1.setHeight((short) 1000);
//画线(由左上到右下的斜线)  在A1的第一个cell(单位  分类)加入一条对角线Row row = sheet.getRow(0);Cell cell0 = row.createCell(0);cell0.setCellValue("开单医生    治疗项目");XSSFRow row2 = sheet.createRow(1);List<BuAchievementsHeaderVo> header = vo.getHeader();Map<String,Integer> indexMap =new HashMap<>();int index =0 ;for (BuAchievementsHeaderVo m:header){indexMap.put(m.getName(),index);index++;}for (int i = 0;i<header.size();i++){sheet.addMergedRegion(new CellRangeAddress(0, 0, i*3+1, i*3+3));row.createCell(i*3+1).setCellValue(header.get(i).getName());row2.createCell(i*3+1).setCellValue("开");row2.createCell(i*3+2).setCellValue("做");row2.createCell(i*3+3).setCellValue("剩");}CreationHelper helper = workbook.getCreationHelper();XSSFDrawing xssfDrawing = sheet.createDrawingPatriarch();ClientAnchor anchor = helper.createClientAnchor();
//设置斜线的开始位置,我这里是从第0行到第1行,从第0列到第1列anchor.setCol1(0);anchor.setCol2(1);anchor.setRow1(0);anchor.setRow2(2);XSSFSimpleShape simpleShape = xssfDrawing.createSimpleShape((XSSFClientAnchor) anchor);
//设置形状类型未线型simpleShape.setShapeType(ShapeTypes.LINE);
//设置线宽simpleShape.setLineWidth(0.5);
//设置线的风格simpleShape.setLineStyle(0);
//设置线的颜色simpleShape.setLineStyleColor(0,0,0);
//撒数据//int[] xys1 = { 112, 83 };//drawLine(sheet, row, 1, 3, 110, 83, xys1);List<BuAchievementsDataVo> data = vo.getData();for (int i = 0;i<data.size();i++){XSSFRow row3 = sheet.createRow(i + 2);row3.createCell(0).setCellValue(data.get(i).getDoctor());List<BuAchievementsItemVo> list = data.get(i).getList();for (int j = 0 ; j<list.size();j++){Integer ind = indexMap.get(list.get(j).getName());row3.createCell(ind*3+1).setCellValue(list.get(j).getCount().toString());row3.createCell(ind*3+2).setCellValue(list.get(j).getTreCount().toString());row3.createCell(ind*3+3).setCellValue(list.get(j).getSurCount().toString());}}response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("治疗记录", "UTF8") + ".xlsx");OutputStream outputStream= response.getOutputStream();workbook.write(outputStream);outputStream.flush();outputStream.close();}

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

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

相关文章

【小白专用 已验证24.5.30】ThinkPHP6 视图

ThinkPHP6 视图 模板引擎支持普通标签和XML标签方式两种标签定义&#xff0c;分别用于不同的目的 标签类型描述普通标签主要用于输出变量、函数过滤和做一些基本的运算操作XML标签也称为标签库标签&#xff0c;主要完成一些逻辑判断、控制和循环输出&#xff0c;并且可扩展 c…

双指针法 ( 三数之和 )

题目 &#xff1a;给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…

计算机网络学习笔记——网络层(b站)

目录 网络层概述 网络层提供的两种服务 ①面向连接的虚电路服务 ②无连接的数据报服务 IPv4 路由选择 路由器转发IP数据报 静态路由选择 动态路由选择 路由信息协议RIP 开放最短路径优先OSPF&#xff08;Open Shortest Path First&#xff09; 内部网关协议IGP&…

Linux网络编程:回顾网络通信

1.数据从应用层到数据链路层的本质 数据的封装&#xff1a; 用户在用户级缓冲区输入数据&#xff0c;经过应用层协议进行序列化成字节流数据&#xff0c;拷贝到传输层的缓冲区。而操作系统在传输层维护了sk_buff这一个结构体&#xff0c;然后data指针指向这段数据的开头&#x…

【C++面试50题】

以下是针对C程序员面试可能遇到的一些问题&#xff0c;涵盖了从基础语法、面向对象、STL、内存管理、模板、异常处理、并发编程等多个方面。 ### 基础概念与语法 1. C与C的主要区别是什么&#xff1f; 2. 什么是构造函数和析构函数&#xff1f;它们何时被调用&#xff1f; 3. 什…

xml 取值错误 #{} boolean 一直为 false

取值时 #{param.msgStatus} 一直是false&#xff0c;java代码里面显示true。 <select id"findPageOaReading" resultType"com.focusin.data.office.func.dto.ProcessMessageInfoDTO">select i.*, t.template_name procdefNamefrom process_message_…

常见的Web漏洞——CORS

渗透做了多年的朋友都知道&#xff0c;大洞小洞都是漏洞。因此也学习、沉淀一下以前没重视的漏洞。 简介 CORS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨源资源共享&#xff09;是一种由Web浏览器实现的安全策略&#xff0c;用于控制一个Web页面&#xff08;服…

Unity DOTS技术(五)Archetype,Chunk,NativeArray

文章目录 一.Chunk和Archetype什么是Chunk?什么是ArchType 二.Archetype创建1.创建实体2.创建并添加组件3.批量创建 三.多线程数组NativeArray 本次介绍的内容如下: 一.Chunk和Archetype 什么是Chunk? Chunk是一个空间,ECS系统会将相同类型的实体放在Chunk中.当一个Chunk…

机器学习18个核心算法模型

1. 线性回归&#xff08;Linear Regression&#xff09; 用于建立自变量&#xff08;特征&#xff09;和因变量&#xff08;目标&#xff09;之间的线性关系。 核心公式&#xff1a; 简单线性回归的公式为&#xff1a; , 其中 是预测值&#xff0c; 是截距&#xff0c; 是斜…

leetcode第867题:转置矩阵

matrix[i][j]需要放在转置矩阵的(j,i)位置 public class Solution {public int[][] Transpose(int[][] matrix) {int rows matrix.Length; int columns matrix[0].Length; int[][] array2 new int[columns][];// 初始化内部数组&#xff08;列数&#xff09;for (int i 0…

MySQL数据库常见工具的基础使用_1

在上一篇文章中提到了对MySQL数据库进行操作的一些常见工具 mysqlcheck mysqlcheck是一个用于数据库表的检查&#xff0c;修复&#xff0c;分析和优化的一个客户端程序 分析的作用是查看表的关键字分布,能够让sql生成正确的执行计划(支持InnoDB,MyISAM,NDB)检查的作用是检查…

Linux系统编程(七)网络编程TCP、UDP

本文目录 一、基础知识点1. IP地址2. 端口3. 域名4. 网络协议类型5. IP协议类型6. 字节序7. socket套接字 二、TCP 常用API1. socket套接字描述符2. bind套接字绑定3. listen设置最大排队数4. accept接收客户端请求5. connect连接服务端6. read读取数据7. write发送数据 三、UD…

240.搜索二维矩阵

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,…

【AI大模型】基于Langchain和Openai借口实现英文翻译中文应用

&#x1f680; 作者 &#xff1a;“大数据小禅” &#x1f680; 文章简介 &#xff1a;本专栏后续将持续更新大模型相关文章&#xff0c;从开发到微调到应用&#xff0c;需要下载好的模型包可私。 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 目…

CSPM.pdf

PDF转图片 归档&#xff1a;

C盘清理攻略!!!详细步骤

c盘爆满怎么清&#xff0c;往下看 一、清缓存文件键盘winr打开运行窗口&#xff0c;输入&#xff1a;%temp% 二、清理安装包文件键盘winr打开运行窗口&#xff0c;输入&#xff1a;softwaredistribution 三、清理软件解压临时文件键盘winr打开运行窗口&#xff0c;输入&#xf…

【C语言】结构体(及位段)

你好&#xff01;感谢支持孔乙己的新作&#xff0c;本文就结构体与大家分析我的思路。 希望能大佬们多多纠正及支持 &#xff01;&#xff01;&#xff01; 个人主页&#xff1a;爱摸鱼的孔乙己-CSDN博客 欢迎 互粉哦&#x1f648;&#x1f648;&#xff01; 目录 1. 声明结构…

SQL注入-时间盲注

SQL时间盲注&#xff08;Time-based Blind SQL Injection&#xff09;&#xff0c;又叫延时注入&#xff0c;是一种SQL注入攻击技术&#xff0c;用于在无法直接获取查询结果或查看响应内容变化的情况下&#xff0c;通过引入时间延迟来推断数据库的信息&#xff1b;时间盲注依赖…

tinyrenderer-切线空间法线贴图

法线贴图 法线贴图分两种&#xff0c;一种是模型空间中的&#xff0c;一种是切线空间中的 模型空间中的法线贴图的rgb代表着每个渲染像素法线的xyz&#xff0c;与顶点坐标处于一个空间&#xff0c;图片是五颜六色的。 切线空间中的法线贴图的rgb同样对应xyz&#xff0c;是切线…

可视化数据科学平台在信贷领域应用系列四:决策树策略挖掘

信贷行业的风控策略挖掘是一个综合过程&#xff0c;需要综合考虑风控规则分析结果、效果评估、线上实时监测和业务管理需求等多个方面&#xff0c;以发现和制定有效的信贷风险管理策略。这些策略可能涉及贷款审批标准的调整、贷款利率的制定、贷款额度的设定等&#xff0c;在贷…