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

news2024/11/17 2:53:50

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
        @AllArgsConstructor
        class 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);
        ) {
            // 创建一个工作表sheet
            Sheet 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++) {
                // 创建行,表头是第一行,所以这里 + 1
                Row 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.coloradmin.cn/o/1883060.html

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

相关文章

优盘有盘符显示0字节:故障解析与数据恢复策略

一、优盘有盘符显示0字节现象描述 在使用优盘的过程中&#xff0c;我们有时会遇到一种令人困惑的情况&#xff1a;插入优盘后&#xff0c;电脑能正常识别到优盘的盘符&#xff0c;但当我们尝试访问其中的数据时&#xff0c;却发现优盘的容量显示为0字节&#xff0c;无法读取或…

VUE3解决跨域问题

本文基于vue3 vite element-plus pnpm 报错&#xff1a;**** has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 原因&#xff1a;前端不能直接访问其他IP&#xff0c;需要用vite.config.ts &#xff0…

API-Window对象

学习目标&#xff1a; 掌握Window对象 学习内容&#xff1a; BOM&#xff08;浏览器对象模型&#xff09;定时器-延时函数JS执行机制location对象navigation对象history对象 BOM&#xff08;浏览器对象模型&#xff09;&#xff1a; BOM是浏览器对象模型。 window对象是一个全…

每个App下载收费3.88元,苹果太强势被开2800亿罚单

刚刚开完 WWDC2024 大会&#xff0c;苹果就被欧盟找上了麻烦。 欧盟认为苹果涉嫌违反涉嫌违反《数字市场法案》&#xff08;Digital Markets Act&#xff09;&#xff0c;造成垄断。 来源&#xff1a;欧盟委员会 明确指出苹果在 Apple Store 里面对开发者的限制不合理。 在最…

栈的概念和实现

1.栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&…

侯捷C++面向对象高级编程(上)-6-三大函数:拷贝构造、拷贝复制、析构

1. 2.三个特殊函数 3.构造函数和析构函数 4.浅拷贝&#xff08;系统默认仅把指针拷贝过去&#xff09; 5.拷贝构造函数&#xff08;深拷贝&#xff0c;拷贝的内容&#xff0c;重写string函数&#xff09; 6.拷贝赋值

阿里云 CosyVoice 语音合成大模型 API 实践

前言 最近大模型这么火&#xff0c;就想着玩一下&#xff0c;作为非 AI 从业者&#xff0c;最好的方式就是调用云服务的 API 来构建自己的 AI 应用。首选当然是国外的 ChatGPT API&#xff0c;但是说实话那个玩意有点贵&#xff0c;而且最近国内也被封禁不让调用了&#xff0c…

诊所运营效率提升方法有哪些?

随着医疗行业的快速发展和市场竞争的加剧&#xff0c;诊所运营效率的提升成为了众多医疗机构关注的焦点。高效的诊所运营不仅能够提升患者的就医体验&#xff0c;还能帮助诊所实现可持续发展。那么&#xff0c;诊所运营效率提升的方法有哪些呢&#xff1f; 1、优化管理流程 诊…

项目经验-不同行业、不同风格的网站设计

网站UI设计的首要考虑点是布局与导航。合理的布局能够确保信息清晰呈现&#xff0c;使用户能够快速定位所需内容。同时&#xff0c;简洁明了的导航设计能够引导用户流畅浏览&#xff0c;减少迷失感。通过精心设计的布局和导航&#xff0c;可以提升用户体验&#xff0c;增强用户…

一、安全完善度等级SIL(Safety Integrity Level)介绍

目录 一、背景 二、定义 2.1 相关概念介绍如下&#xff1a; 2.2 扩展 2.3 注意事项 一、背景 在轨道交通行业中&#xff0c;安全完善度等级&#xff08;SIL&#xff0c;Safety Integrity Level&#xff09;是一个至关重要的概念&#xff0c;它用于评估安全相关系统&#x…

vue3.0 + vant实现下拉刷新上拉加载

在vue中使用vant组件库有个van-pull-refresh下拉组件&#xff0c;配合van-list列表组件实现页面的下拉刷新和上拉加载&#xff0c;原理简单&#xff0c;适用场景在列表页面内容展示。 下拉刷新 PullRefresh 实现下拉刷新的效果。 PullRefresh组件中的searchRefreshing属性&…

Open3D Ransac点云配准算法(粗配准)

目录 一、概述 1.1简介 1.2RANSAC在点云粗配准中的应用步骤 二、代码实现 2.1关键函数 2.2完整代码 2.3代码解析 2.3.1计算FPFH 1. 法线估计 2. 计算FPFH特征 2.3.2 全局配准 1.函数&#xff1a;execute_global_registration 2.距离阈值 3.registration_ransac_b…

为什么企业应用开发,c++干不过java?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; C/C这种东西&#xff0c;根本…

面向阿克曼移动机器人(自行车模型)的LQR(最优二次型调节器)的路径跟踪方法

线性二次调节器&#xff08;Linear Quadratic Regulator&#xff0c;LQR&#xff09;是针对线性系统的最优控制方法。LQR 方法标准的求解体系是在考虑到损耗尽可能小的情况下, 以尽量小的代价平衡其他状态分量。一般情况下&#xff0c;线性系统在LQR 控制方法中用状态空间方程描…

Docker 一篇到位

目录 01. Docker使用导航 02. Build Share Run 样例 03. 理解容器 04. 安装 Docker 05. Docker 样例&#xff08;常见命令使用&#xff09; 下载镜像 启动容器 修改页面 保存镜像 docker commit docker save docker load 分享社区 docker login docker tag do…

浅聊JavaScript中的栈(stack)

前言 这篇文章结合leetcode题目讲解一下栈这种结构 第20题&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 第LCR-147题LCR 147. 最小栈 - 力扣&#xff08;LeetCode&#xff09; 栈&#xff08;stack&#xff09; 在讲解题目之前&#xff0c;我们先来…

天池大赛Higress插件官方demo详细部署+调试

天池大赛Higress插件官方demo详细部署调试 契机 ⚙ 使用Higress AI网关优化AI调用成本。就是基于向量召回相似问题的缓存&#xff0c;降低LLM API调用成本。就是开发一个网关插件做QA缓存嘛。前文已经成功复现了hello-world插件&#xff0c;这次结合官方提供的AI-Cache插件自…

二叉树遍历练习题

2.已知某二叉树的前序遍历序列为5 7 4 9 6 2 1&#xff0c;中序遍历序列为4 7 5 6 9 1 2&#xff0c;则其后序遍历序列为&#xff08; &#xff09; A.4 2 5 7 6 9 1 B.4 2 7 5 6 9 1 C.4 7 6 1 2 9 5 D.4 7 2 9 5 6 1 答案&#xff1a;C 解析&#xff1a; 通过前序遍历找…

失眠焦虑植物神经紊乱应该怎么改善饮食?

在快节奏的现代社会中&#xff0c;越来越多的人受到植物神经紊乱的困扰&#xff0c;尤其是失眠、焦虑、胸闷气短等症状频发。这些症状不仅影响日常生活和工作效率&#xff0c;还可能引发一系列健康问题。今天&#xff0c;我们就来谈谈如何通过调整饮食来改善这些症状。 饮食调整…

Java [ 基础 ] 方法引用 ✨

✨探索Java基础✨ Java基础&#xff1a;方法引用 方法引用是Java 8中引入的一种新特性&#xff0c;它使得代码更加简洁和易读。方法引用提供了一种可以直接引用已有方法作为Lambda表达式的替代方案。本文将深入介绍方法引用的基本概念、使用方法、具体实例及其在实际开发中的…