java生成excel,uniapp微信小程序接收excel并打开

java引包,引的是apache.poi

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency>

写一个测试类,把excel输出到指定路径

    public static void main(String[] args) {// 学生类@Data@AllArgsConstructorclass Student implements Serializable {private static final long serialVersionUID = 1L;private String name;private Integer age;private String sex;}// 将要导出的数据List<Student> list = new ArrayList<>();list.add(new Student("张潇", 23, "男"));list.add(new Student("李小思", 19, "女"));list.add(new Student("某人", 66, "未知"));try (// 创建一个Excel工作簿Workbook workbook = new XSSFWorkbook();// 输出流, 保存到指定路径, 请确保路径存在FileOutputStream fileOutputStream = new FileOutputStream("D:/A_software/templast/student.xlsx");BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);) {// 创建一个工作表sheetSheet sheet = workbook.createSheet("Sheet1");// 设置表头List<String> sheetHeadList = Arrays.asList("姓名", "年龄", "性别");Row sheetHead = sheet.createRow(0);for (int index = 0; index < sheetHeadList.size(); index++) {// 设置每列宽度 大小乘以256,调整13即可sheet.setColumnWidth(index, 13 * 256);sheetHead.createCell(index).setCellValue(sheetHeadList.get(index));}// 设置值for (int index = 0; index < list.size(); index++) {// 创建行,表头是第一行,所以这里 + 1Row row = sheet.createRow(index + 1);Student student = list.get(index);// 行里创建单元格并设置值row.createCell(0).setCellValue(student.getName());row.createCell(1).setCellValue(student.getAge());row.createCell(2).setCellValue(student.getSex());}workbook.write(bufferedOutputStream);} catch (IOException e) {throw new RuntimeException("导出excel失败");}}

执行之后,去打开excel 

 

没毛病,接下来是把excel传给前端,小程序打开,有很多种方式:

  1. 后端保存excel到指定位置,返回文件下载的url给前端,前端根据url下载。
  2. 后端保存excel后,返回文件流,前端调用接口生成excel时,接收返回的文件流即可。
  3. 后端不保存excel,把excel输出成字节数组,再转成base64格式,返回前端base64字符串。

我这里用了第三种,因为我是导出excel给用户,后端不需要存下这个文件。

上面的测试方法改一下就行了

// 输出流, 保存到指定路径, 请确保路径存在
FileOutputStream fileOutputStream = new FileOutputStream("D:/A_software/templast/student.xlsx");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);

把上面的输出流换成

ByteArrayOutputStream bufferedOutputStream = new ByteArrayOutputStream();

然后调用workbook.write写入

workbook.write(bufferedOutputStream);
// 写入完了之后,转成字节数组
byte[] bytes = bufferedOutputStream.toByteArray();
// 再转成base64格式
String base64 = Base64.encodeBase64String(bytes);

最后直接返回base64字符串给前端就行了。


前端微信小程序

// 假设接口请求完成,返回了base64字符串
const base64Value = 接口返回
// 文件保存路径
const filePath = `${wx.env.USER_DATA_PATH}/${new Date().getTime()}.xlsx`
// 保存excle到手机上
wx.getFileSystemManager().writeFile({filePath: filePath,data: base64Value ,encoding: 'base64',success: () => {// 保存成功后打开,也可以不打开,看你需求setTimeout(() => {uni.openDocument({filePath: filePath,showMenu: true,fileType: 'xlsx',fail: (error) => {// 打开excel失败}})}, 500)},fail: (error) => {// 保存excel失败}
})

完事了,如果是复杂样式的excel,推荐后端引包【freemarker】包生成excel,支持自定义,就是代码有点繁琐,具体看看我的java导出word文档文章,思路基本一致。


码字不易,于你有利,勿忘点赞

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

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

相关文章

一条SQL查询语句的执行流程

MySQL 中一条 SQL 查询语句的执行流程可以分为以下几个主要步骤&#xff1a; 客户端请求&#xff1a; 客户端通过 MySQL 客户端或应用程序向 MySQL 服务器发送 SQL 查询请求。 连接管理&#xff1a; MySQL 服务器接收到请求后&#xff0c;会首先检查客户端的身份验证信息&…

c++笔记容器详细介绍

C标准库提供了多种容器来存储和管理数据。这些容器属于<vector>, <list>, <deque>, <map>, <set>, <unordered_map>, <unordered_set>等头文件中。这些容器各有优缺点&#xff0c;适用于不同的场景。下面详细介绍几种主要的容器及其…

快20倍还便宜 NVIDIA GPU的“掘墓人”出现了?

芯片初创公司Etched近日宣布推出了一款针对 Transformer架构专用的AISC芯片 “Sohu”&#xff0c;并声称其在AI大语言模型&#xff08;LLM&#xff09;推理性能方面击败了NVIDIA最新的B200 GPU&#xff0c;AI性能达到了H100的20倍。这也意味着Sohu芯片将可以大幅降低现有AI数据…

【面试系列】C++ 高频面试题

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

精密机器中的交叉导轨负荷与容许负荷的差异!

交叉导轨的设计和制造过程中&#xff0c;负荷及容许负荷是至关重要的参数&#xff0c;只有准确计算出交叉导轨的载荷&#xff0c;才能保证交叉导轨的稳定性和使用寿命。 负荷和容许载荷是两个不同的参数&#xff0c;那这两者的有什么差异呢&#xff1f; 交叉导轨的负荷是指其承…

微信群被恶意举报封了加新群的看这里

由于近期太忙&#xff0c;有时候手机被儿子拿玩看动漫了&#xff0c;被误删或是误踢的朋友说声抱歉。 感谢大家的理解和支持。

JVM专题九:JVM分代知识点梳理

今天开始&#xff0c;咱们开始剖析JVM内存划分的原理细节&#xff0c;以及我们创建的那些对象在JVM中到底是如何分配&#xff0c;如何流动的&#xff0c;首先解决第一个问题&#xff1a;JVM内存的一个分代模型:年轻代、老年代、永久通过之前的专题我们知道&#xff0c;那就是我…

HarmonyOS Next开发学习手册——通过startAbilityByType拉起垂类应用

使用场景 开发者可通过特定的业务类型如导航、金融等&#xff0c;调用startAbilityByType接口拉起对应的垂域面板&#xff0c;该面板将展示目标方接入的垂域应用&#xff0c;由用户选择打开指定应用以实现相应的垂类意图。垂域面板为调用方提供统一的安全、可信的目标方应用&a…

REST API 中的 HTTP 请求参数

当我们在谈论现代 Web 开发时&#xff0c;REST API (Representational State Transfer Application Programming Interface) 扮演着至关重要的角色。它允许不同的系统以一种简洁且高效的方式进行通信。HTTP 请求参数是控制此通信流程中数据如何被发送和接收的重要组成部分。 H…

vue2使用wangEditor5搭建模拟文档的编辑器快速集成

如图 1、下载依赖 2、elm引入&#xff08;可省略&#xff09; main.js 或者 按需引入 3、cv <template><div style"background: #f1f3f4"><div style"width: 100%; height: 42px"><!-- 工具栏 --><Toolbarid"tool-conta…

Linux crontab中* * * * * /usr/local/run.sh这句话5个*号分别代表什么?

在 Linux crontab 中&#xff0c;* * * * * /usr/local/run.sh 这句话里的 5 个*号分别代表的含义如下&#xff1a; 第一个&#xff1a;表示分钟&#xff0c;取值范围是 0 到 59。这里的表示每分钟。 第二个&#xff1a;表示小时&#xff0c;取值范围是 0 到 23。表示每小时。…

AI产品经理需要懂的算法和模型

本篇希望以精准推荐模型为案例通过全面的撰写将AI产品经理需要懂的算法和模型进行了系统的入门讲解。 一个产品经理经常疑惑的概念&#xff1a; 算法和模型的关系&#xff0c;产品经理懂得解决问题时将问题抽象为模型&#xff0c;对模型求解用算法&#xff0c;没有谁大谁小&a…

博睿数据受邀出席GOPS全球运维大会北京站,分享《一体化可观测数据模型和AIOps的融合实践》

2024年6月28日&#xff0c;第二十三届 GOPS 全球运维大会暨 XOps 技术创新峰会在北京顺利召开。大会为期2天&#xff0c;侧重 BizDevOps、XOps、DevOps、持续测试、SRE、可观测性、云原生等热门技术领域。并特别设置大模型运维、银行/证券数字化转型、平台工程、DevOps/AIOps 最…

Linux系统中常用的基本命令

1. 文件与目录管理 ls: 列出目录内容。cd: 切换当前工作目录。pwd: 显示当前工作目录的路径。mkdir: 创建一个新目录。rmdir: 删除空目录。cp: 复制文件或目录。mv: 移动或重命名文件或目录。rm: 删除文件或目录。touch: 创建一个空文件或更新文件时间戳。 2. 文本内容查看 …

bcprov-jdk15on和bcpkix-jdk15on有什么区别

bcprov-jdk15on 和 bcpkix-jdk15on 都是 Bouncy Castle 密码库的不同组件&#xff0c;针对不同的用途和功能。它们之间的主要区别在于提供的功能和目的&#xff1a; bcprov-jdk15on&#xff1a; 这是 Bouncy Castle 的主要提供者&#xff08;Provider&#xff09;模块&#xff…

上海六十中学多功能气膜馆项目:轻空间全速推进

项目进展捷报频传 上海六十中学多功能气膜馆项目土建工作已基本完工&#xff0c;今天轻空间团队正式进场&#xff0c;展开气膜部分的施工。我们将为上海六十中学打造一个现代化、环保、高效的多功能气膜馆&#xff0c;提供优质的运动和活动场所。 现场施工一片繁忙 在施工现场&…

【uniapp】HBuilderx中uniapp项目运行到微信小程序报错Error: Fail to open IDE

HBuilderx中uniapp项目运行到微信小程序报错Error: Fail to open IDE 问题描述 uniapp开发微信小程序&#xff0c;在HBuilderx中运行到微信开发者工具时报错Error: Fail to open IDE 解决方案 1. 查看微信开发者工具端服务端口是否开放 打开微信开发者工具选择&#xff1…

onnx模型转rknn到部署

简介 最近开始用3568的板子&#xff0c;之前是在用3399&#xff0c;cpu的话3399比3568强&#xff0c;但是3568有1T的npu算力&#xff0c;所以模型移植过来用npu使用&#xff0c;之前用ncnn感觉太慢了&#xff0c;rk的npu使用没有开源&#xff0c;所以没法兼容&#xff0c;只能跑…

Redis集群部署合集

目录 一. 原理简述 二. 集群配置​​​​​​​ 2.1 环境准备 2.2 编译安装一个redis 2.3 创建集群 2.4 写入数据测试 实验一&#xff1a; 实验二&#xff1a; 实验三&#xff1a; 实验四&#xff1a; 添加节点 自动分配槽位 提升节点为master&#xff1a; 实验…

操作系统之《死锁与银行家算法》【知识点+详细解题过程】

知识点&#xff1a; 1、什么是死锁&#xff1f;&#xff08;别名"三角恋"&#xff0c;我喜欢你你喜欢他他喜欢我&#xff0c;明明都单身但是就是‘占有’不了&#xff09; 一组进程中&#xff0c;每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法…