springboot导出数据到excel模板,使用hutool导出数据到指定excel,java写入数据到excel模板

最近遇到一个需求,需要从数据库查询数据,写入到对应的excel导入模板中。再把导出的数据进行修改,上传。
我们项目用的是easyExcel,一顿百度搜索,不得其法。
主要是要把数据填充到指定单元格中,跟平时用到的导出不一样。项目中也没有引入其它poi。

后来忽然想起来,项目中集成的有hutool,可以用hutool的导入导出功能,先把excel导入模板读取出来,再给excel模板加工数据,最后再导出。

然后又开始了百度之旅~

终于在Two thousand years later~

写一个样例:
excel导入模板长这样:(随便画得)
第一个sheet页
第二个sheet页
第三个sheet页

想要的效果大概是这样:
稍微写了一点点数据,根据业务,自己完善。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:

关于hutool版本,和导入导出所需依赖,可参考我篇文章。hutool导入导出,java使用hutool导入导出,hutool导出多级标题复杂表头,hutool大数据量导出

因为我这个项目是springboot的,所以我把excel模板放在了这里。方便读取。

在这里插入图片描述

 package com.demo.controller;import cn.hutool.json.JSONUtil;
import io.swagger.annotations.Api;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestController
@Api(tags = "控制类")
@RequestMapping("/user")
public class UserController {@GetMapping("/download")public void download(HttpServletRequest request, HttpServletResponse response) throws IOException {//添加测试数据List<Map<String,String>> list1 = new ArrayList<>();Map<String, String> map = new HashMap<>();map.put("q1","moveNo");map.put("q2","moveNo");map.put("q3","78");map.put("q4","moveNo");map.put("q5","moveNo");map.put("q6","moveNo");map.put("q7","moveNo");Map<String, String> map1 = new HashMap<>();map1.put("q5","moveNo");map1.put("q6","moveNo");map1.put("q7","moveNo");list1.add(map);list1.add(map1);//添加测试数据List<Map<String,Object>> printVoList = new ArrayList<>();Map<String, Object> hashMap = new HashMap<>();hashMap.put("COL1","123");hashMap.put("COL2","234");hashMap.put("COL3","345");hashMap.put("COL4","456");Map<String, Object> hashMap1 = new HashMap<>();hashMap1.put("COL1","哈");hashMap1.put("COL2","吧");hashMap1.put("COL3","吗");printVoList.add(hashMap);printVoList.add(hashMap1);//获取文件输入流InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("123.xlsx");//设置返回response.setContentType("application/vnd.ms-excel;charset=utf-8");response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("我测试的", "utf-8") + ".xlsx");OutputStream out = response.getOutputStream();if (inputStream == null){throw new RuntimeException("文件未找到!");}//获取工作簿Workbook workbook = new XSSFWorkbook(inputStream);//获取创建工作簿的第一页Sheet sheet=workbook.getSheetAt(0);//给指定的sheet命名
//        workbook.setSheetName(0,"dataSheet");//获取当前工作簿的行数
//        int totalRows=sheet.getPhysicalNumberOfRows();//****遍历模板sheet,根据当中的设定进行赋值****int newRowIndex = 3;//起始行 从第4行开始for (int i=0;i<list1.size();i++) {Row row = sheet.createRow(newRowIndex++);int column = row.getLastCellNum();int j = 0;(row.getCell(j)!=null?row.getCell(j):row.createCell(j)).setCellValue(list1.get(i).get("q1"));j++;(row.getCell(j)!=null?row.getCell(j):row.createCell(j) ).setCellValue(list1.get(i).get("q2"));j++;(row.getCell(j)!=null?row.getCell(j):row.createCell(j) ).setCellValue(list1.get(i).get("q3"));j++;(row.getCell(j)!=null?row.getCell(j):row.createCell(j) ).setCellValue(list1.get(i).get("q4"));j++;(row.getCell(j)!=null?row.getCell(j):row.createCell(j) ).setCellValue(list1.get(i).get("q5"));j++;(row.getCell(j)!=null?row.getCell(j):row.createCell(j) ).setCellValue(list1.get(i).get("q6"));j++;(row.getCell(j)!=null?row.getCell(j):row.createCell(j) ).setCellValue(list1.get(i).get("q7"));}//获取创建工作簿的第2页Sheet sheet1=workbook.getSheetAt(1);//获取当前工作簿的行数int totalRows=sheet1.getPhysicalNumberOfRows();for (int i = 0;i<totalRows;i++){Row row = sheet1.getRow(i);if (row == null) continue;System.out.println(row.getRowNum() + JSONUtil.toJsonStr(row));;}sheet1.getRow(4).getCell(3).setCellValue("1");sheet1.getRow(5).getCell(3).setCellValue("1");//获取创建工作簿的第3页Sheet sheet2=workbook.getSheetAt(2);System.out.println("================");for (int i = 0;i<sheet2.getPhysicalNumberOfRows();i++){Row row = sheet2.getRow(i);if (row == null) continue;System.out.println(row.getRowNum() + JSONUtil.toJsonStr(row));;}//获取当前工作簿的行数
//        int totalRows2=sheet1.getPhysicalNumberOfRows();sheet2.getRow(2).getCell(3).setCellValue("1");sheet2.getRow(3).getCell(3).setCellValue("3");sheet2.getRow(5).getCell(3).setCellValue("111");sheet2.getRow(5).getCell(5).setCellValue("3333");sheet2.getRow(11).getCell(3).setCellValue("3333");sheet2.getRow(11).getCell(5).setCellValue("3333");/*int newRowIndex = 3;//起始行 从第4行开始//获取模板对应的数据表字段的值Row dataRow=sheet.getRow(newRowIndex++);//获得该行对应的字段的数量int columnNum=dataRow.getPhysicalNumberOfCells();//将结果集渲染到当前sheet当中for (Map<String,Object> pageData:printVoList) {sheet.shiftRows(newRowIndex, totalRows + 1, 1); //在startRow和endRow之间的行移动一行Row newRow = sheet.createRow(newRowIndex++);//创建需要插入的目标行,该值需要在每次完成一行记录值插入后重新归0int cellIndex = 0;//ic此处为cells数组的结果集的字段的位置for (int i = 1; i <= columnNum; i++) {//从pageData当中取出目标单元格需要的值String cellContent = pageData.get("COL"+i) != null ? String.valueOf(pageData.get("COL"+i)) : "";//设置目标单元格的位置和类型Cell cell = newRow.createCell(cellIndex++, Cell.CELL_TYPE_STRING);//设置目标单元格的值cell.setCellValue(cellContent);}}*/workbook.write(out);out.flush();out.close();}}

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

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

相关文章

【Android】细数Linux和Android系统中的伪文件系统

文章目录 前言Linux伪文件系统cgroupfsLinux的cgroupsAndroid的cgroups debugfsfunctionfs(/dev/usb-ffs/adb)functionfs 的引入sysfs是什么 procfs(/proc)pstore(/sys/fs/pstore)selinuxfs(/sys/fs/selinux)sysfs(/sys)参考 前言 做了好些年Android开发&#xff0c;你了解过L…

Java Web(二)--HTML

基本介绍 官网文档地址: HTML 教程 HTML&#xff08;HyperText Mark-up Language&#xff09;即超文本标签语言&#xff1b;HTML 文本是由 HTML 标签组成的文本&#xff0c;可以包括文字、图形、动画、声音、表格、链接等&#xff1b;HTML 的结构包括头部&#xff08;Head&…

学校“数据结构”课程Project—扩展功能(自主设计)

目录 一、设想功能描述 想法缘起 目标功能 二、问题抽象 三、算法设计和优化 1. 易想的朴素搜索 / dp 搜索想法 动态规划&#xff08;dp&#xff09;想法 2. 思考与优化 四、算法实现 五、结果示例 附&#xff1a;使用的地图API 一、设想功能描述 想法缘起 OSM 导出…

汽车网络架构与常用总线汇总

汽车CAN总线简述 CAN 是控制器局域网Controller Area Network 的缩写&#xff0c;1986年&#xff0c;由德国Bosch公司为汽车开发的网络技术&#xff0c;主要用于汽车的监测与控制&#xff0c;目的为适应汽车“减少线束的数量”“通过多个网络进行大量数据的高速传输”的需求。…

TA百人计划学习笔记 3.1.1模板测试

资料 源视频 【技术美术百人计划】图形 3.1 深度与模板测试 传送门效果示例_哔哩哔哩_bilibili ppt 3100-模板测试与深度测试(1) 参考 Unity Shader: 理解Stencil buffer并将它用于一些实战案例&#xff08;描边&#xff0c;多边形填充&#xff0c;反射区域限定&#xff0c;阴影…

c++学习笔记-STL案例-机房预约系统6-老师模块

前言 衔接上一篇“c学习笔记-STL案例-机房预约系统5-学生模块”&#xff0c;本文主要设计老师模块&#xff0c;从&#xff0c;老师登录和注销、查看所有预约、审核预约三个方面进行分析和实现。 目录 9 教师模块 9.1 教师登录和注销 9.1.1 构造函数 9.1.2 教师子菜单 ​编…

Linux7 安装 Oracle 19C RAC 详细图文教程

实战篇&#xff1a;Linux7 安装 Oracle 19C RAC 详细图文教程 本文是按照&#xff1a;https://www.modb.pro/db/154424的思路进行编写 一、安装前规划 安装RAC前&#xff0c;当然要先做好规划。具体包含以下几方面&#xff1a; 节点主机版本主机名实例名Grid/Oracle版本Publi…

鸿蒙原生开发-仿ChatGPT应用实战

运行环境 DAYU200:4.0.10.16 SDK&#xff1a;4.0.10.15 IDE&#xff1a;4.0.600 前言 在配置好环境之后&#xff0c;可以尝试这编写一个较为简单的应用程序练练手&#xff0c;这里选择使用一个免费的API接口网站 ALAPI来尝试编写一个可进行对话的GPT应用程序。 创建项目 …

SQL注入示例

例一、基础SQL注入&#xff1a;load_file读文件 CISP-PTE 认证考试 首先是有单引号和括号的&#xff0c;首要是要闭合&#xff0c;然后回显点是在-1的位置&#xff0c;读取文件上面的key的话使用的是load_file(/tmp/360/key) id-1)%09ununionion%09select%091,2,3,load_file…

【算法与数据结构】322、LeetCode零钱兑换

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题可以抽象成一个完全背包问题。 第一步&#xff0c; d p [ j ] dp[j] dp[j]的含义。 d p [ j ] dp…

Unity之Cinemachine教程

前言 Cinemachine是Unity引擎的一个高级相机系统&#xff0c;旨在简化和改善游戏中的相机管理。Cinemachine提供了一组强大而灵活的工具&#xff0c;可用于创建令人印象深刻的视觉效果&#xff0c;使开发人员能够更轻松地掌控游戏中的摄像机行为。 主要功能和特性包括&#x…

Springboot+vue的医院后台管理系统(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的医院后台管理系统&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的医院后台管理系统&#xff0c;采用M&#xff08…

LeetCode、875. 爱吃香蕉的珂珂【中等,最小速度二分】

文章目录 前言LeetCode、875. 爱吃香蕉的珂珂【中等&#xff0c;最小速度二分】题目及分类思路分析及代码实现代码优化 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Ja…

如何修改flutter的minSdkVersion版本?

在使用第三方插件的时候&#xff0c;插件对最低的 minSdkVersion版本是有要求的&#xff0c;你比如flutter 插件 webview_flutter 就会报一下错&#xff1a; minSdkVersion 16 cannot be smaller than version 19 declared in library 解决方法①&#xff1a; 这个时候我们需…

Python爬虫框架选择与使用:推荐几个常用的高效爬虫框架

目录 前言 一、Scrapy框架 1. 安装Scrapy 2. Scrapy示例代码 3. 运行Scrapy爬虫 二、Beautiful Soup库 1. 安装Beautiful Soup 2. Beautiful Soup示例代码 3. 运行Beautiful Soup代码 三、Requests库 1. 安装Requests库 2. Requests示例代码 3. 运行Requests代码 …

【蓝桥杯--图论】最小生成树prim、kruskal

今日语录&#xff1a;成功不是终点&#xff0c;失败不是致命&#xff0c;勇气才是取胜的关键。 文章目录 prim算法kruskal算法(稀疏图) prim算法 #include <cstring> #include <algorithm> #include <iostream>#define _CRT_SECURE_NO_WARNINGS using names…

8 种网络协议

什么是网络协议&#xff1f; 网络协议就是计算机之间沟通的语言&#xff0c;为了有效地交流&#xff0c;计算机之间需要一种共同的规则或协议&#xff0c;就像我们和老外沟通之前&#xff0c;要先商量好用哪种语言&#xff0c;要么大家都说中文&#xff0c;要么大家都说英语&a…

微信小程序实现长按 识别图片二维码

第一种方案&#xff08;只需要在image里面加一个属性就可以了&#xff09; show-menu-by-longpress“{{true}}” <image show-menu-by-longpress"{{true}}" src"{{sysset.dyqewm}}" />第二种方案 放大预览图片&#xff0c;长按识别二维码 wxml <…

数灵通实现抖音跳转企业微信啦

抖音是一款流行的短视频应用&#xff0c;用户可以通过简洁、有趣的短视频形式创作和分享内容。 对于企业而言&#xff0c;抖音拥有庞大的用户基础和广泛的影响力&#xff0c;因此企业希望能够利用抖音的平台来推广自己的企业微信账号&#xff0c;与用户建立更紧密的沟通和联系…

Xftp连接不上Linux虚拟机的原因解决方法

前言&#xff1a; 在当今数字化时代&#xff0c;远程连接到Linux虚拟机是许多开发者和系统管理员日常工作的一部分。然而&#xff0c;有时候&#xff0c;面对Xftp连接不上Linux虚拟机的问题&#xff0c;我们可能感到困惑和无措。这个看似小问题可能导致工作中断&#xff0c;因…