网站首页 > 技术文章 正文
需求是这样的,在答题活动结束后,主办方想要导出排行榜成绩到excel,并能够在小程序里面打开查看、转发或下载保存到本地的功能。
我的实现思路大概是这样,先把排行榜数据按照得分排名顺序,处理成对应的JSON数据结构,通过XLSX库生成生成 Excel 文件,使用文件系统管理器写入文件,再通过wx.openDocument打开文件。
通过查阅官方技术文档得知,从微信小程序基础库 2.4.0 开始,wx.arrayBufferToBase64 接口确实已经停止维护。因此,我们需要使用其他方式将 ArrayBuffer 转换为 Base64 编码的字符串。
在小程序中,我们可以通过先将 ArrayBuffer 转换为 TypedArrayArray(如 Uint8Array),然后使用 TextEncoder(但小程序原生不支持 TextEncoder,需要模拟或使用其他库)或手动遍历 TypedArrayArray 来将每个字节转换为对应的 Base64 字符。不过,更简便的方法是使用现有的第三方库,如 base64-js,它可以在小程序中正常运行。
以下是一个使用 base64-js 库将 ArrayBuffer 转换为 Base64 字符串,并导出 JSON 数据为 Excel 文件的示例:
- 安装 base64-js 库:
由于小程序不支持 npm,你需要手动下载 base64-js 的源代码,并将其添加到你的小程序项目中。 - 引入 base64-js 并编写导出逻辑:
// 假设你已经将 base64-js 的代码添加到你的项目中,并放在 libs/base64-js.js 文件中
const Base64 = require('../../libs/base64-js.js');
const XLSX = require('../../libs/xlsx.core.min.js'); // 确保你的 xlsx.core.min.js 路径正确
Page({
// ... 其他页面逻辑
exportToExcel: function () {
// 排行榜 示例 JSON 数据
const jsonData = [
{ name: '刘东旭-xx组', num: 3, score: 95, order: 1 },
{ name: '王思思-xx组', bum: 2, score: 90, order: 2 },
// ... 其他考生数据
];
// 将 JSON 数据转换为工作表
const worksheet = XLSX.utils.json_to_sheet(jsonData);
// 创建一个新的工作簿并将工作表添加到工作簿中
const workbook = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
// 生成 Excel 文件的二进制内容
const wbout = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
// 将 ArrayBuffer 转换为 Uint8Array
const uint8Array = new Uint8Array(wbout);
// 使用 base64-js 将 Uint8Array 转换为 Base64 字符串
const base64data = Base64.fromUint8Array(uint8Array);
// 创建一个临时文件路径
const tempFilePath = `${wx.env.USER_DATA_PATH}/export_${Date.now()}.xlsx`;
// 使用文件系统管理器写入文件
const fs = wx.getFileSystemManager();
fs.writeFile({
filePath: tempFilePath,
data: base64data,
encoding: 'base64',
success: () => {
// 打开文件
wx.openDocument({
filePath: tempFilePath,
fileType: 'xlsx',
success: () => {
console.log('文件打开成功');
},
fail: (err) => {
console.error('文件打开失败', err);
},
});
},
fail: (err) => {
console.error('文件写入失败', err);
},
});
},
// ... 其他页面方法
});
javascrip注意注意:
- 在上面的代码中,Base64.fromUint8Array 是 base64-js 库提供的方法,用于将 Uint8Array 转换为 Base64 字符串。
- fs.writeFile 方法在这里使用了异步形式,并传递了一个对象作为参数,这与之前的同步方法 writeFileSync 不同。这样做可以避免阻塞线程。
- 确保你的 base64-js 和 xlsx.core.min.js 文件路径正确无误。
- 导出功能可能会因为小程序的安全策略或文件大小限制而失败。在实际应用中,你可能需要处理这些潜在的错误情况。
猜你喜欢
- 2025-01-08 SpringBoot+POI导出Excel表格
- 2025-01-08 理解 Next.js 中的 CSR、SSR、SSG、ISR 以及 Streaming
- 2025-01-08 熬夜7天,我总结了JavaScript与ES的25个知识点
- 2025-01-08 Layui 项目前端导出Excel文件总结
- 2025-01-08 [西门子PLC] WinCC 从 SQL 数据库导出数据到 Excel 报表模板
- 2025-01-08 产品说要让excel在线编辑,我是这样做的。
- 2025-01-08 JAVA导出EXCEL表格
- 2025-01-08 js中的import/export
- 2025-01-08 前端必读:如何在 JavaScript 中使用SpreadJS导入和导出 Excel 文件
- 2025-01-08 ES6语法之export default与export区别
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)