微信小程序云开发:使用excel-export导出excel

微信小程序云开发:使用excel-export导出excel

前言

关于小程序的excel导出,我也走过了不少坑。之前看了很多人要不使用其他云作为excel的导出工具,要不压根就只是nodejs,而不是微信小程序的云开发。因此,我写了此篇文章作为纪念和分享用excel-export在小程序导出excel的方法

excel-export

node-excel-export上面有关于nodejs如何导出excel的简单方法,这里我主要讲几个方面:

  1. excel-export采用的方法是利用zip转xlsx的方法:
    你可以做个实验:在电脑上新建一个"test.xlsx"然后把后缀名改成“.zip”,然后解压,我相信你会看到有趣的东西
    在这里插入图片描述
  2. excel-export利用的zip加码解码的工具是:node-zip。它派生自:jszip。但是:jszip保存zip的函数是:jszip.executeSysncjszip.executeNodeStream。分别可以将结果以不同形式保存:binary,node-stream,base64…。but,node-zip的保存zip的函数是:jszip.execute({base64:false,compression: "DEFLATE"}),这就意味着当我尝试改变源代码的时候:比如调用原来jszip的东西,程序会告诉你:**** is not a function
  3. 最重要的是:下面代码里面的excelResult的格式其实是binary

const nodeExcel = require(‘excel-export’);
var excelResult = nodeExcel.execute(tableMap);

来自node-zip-npm的详细说明:

在这里插入图片描述

核心代码

小程序端

getExcel: function(e){
	   wx.cloud.callFunction({
          name:'get_excel',
          data:{},
          success: function(res){
               console.log(res.result.fileID);
          }
    } }

云开发的云端

安装excel-export

cd 该云函数的本地文件夹
npm install excel-export

get_excel.js

// 云函数入口文件 
const cloud = require('wx-server-sdk') 
const nodeExcel = require('excel-export')
 const path = require('path'); 
cloud.init()
// 云函数入口函数 exports.main = async (event, context) => {
    var tableHead = ["发票编号", "发票代码", "开票时间", "金额"];
    var tableMap = {
      styleXmlFile:path.join(__dirname,"styles.xml"),
      name: Date.now()+"-export",
      cols: [],
      rows: [],
    }
 //添加表头
    for(var i=0;i<tableHead.length;i++){
      tableMap.cols[tableMap.cols.length]={
        caption:tableHead[i],
        type:'string'
      }
    }
//伪数据
const Output = [
  {发票编号:0,发票代码:'001',开票时间:'2019-5-1',金额:100},
   {发票编号:1,发票代码:'002',开票时间:'2019-5-1',金额:200}
]
//添加每一行数据
    for(var i=0;i<Output.length;i++){
      tableMap.rows[tableMap.rows.length]=[
        Output[i].发票编号,
        Output[i].发票代码,
        Output[i].开票时间,
        Output[i].金额
      ]
    }
   //保存excelResult到相应位置
    var excelResult = nodeExcel.execute(tableMap);
    var filePath = "outputExcels";
    var fileName = cloud.getWXContext().OPENID + "-" + Date.now()/1000 + '.xlsx';
    console.log(excelResult);
    //上传文件到云端
    return await cloud.uploadFile({
      cloudPath: path.join(filePath, fileName),
      fileContent: new Buffer(excelResult,'binary')
    });   
    }   catch(e){
      console.log(e);
      return null;  
     }
 }

注意把node-excel-export下载的文件里面的example文件夹下的style.xml复制到云函数的文件夹

### 微信小程序使用 `xlsx` 库处理 Excel 文件的方法 #### 安装依赖库 为了能够在微信小程序环境中操作 Excel 文件,需要引入适合的小程序环境使用的 JavaScript 版本的 XLSX 解析工具。通常情况下会通过 npm 或者直接下载适用于浏览器端的版本来集成。 对于微信小程序而言,推荐先安装 `xlsx` 库: ```bash npm install xlsx --save ``` 由于微信小程序不支持 Node.js 环境下的模块化语法 (`require`, `import`),因此需手动将所需 js 文件拷贝至项目目录下,并调整为 ES Module 形式以便于在页面逻辑层调用[^1]。 #### 导入并初始化 XLSX 实例 假设已经把 `xlsx.full.min.js` 放置到了项目的 utils 文件夹里,则可以在具体业务场景中的 .js 文件顶部声明如下方式加载该脚本: ```javascript // pages/excelHandler/excelHandler.js const XLSX = require('../../utils/xlsx.full.min'); ``` 注意这里路径应根据实际放置位置做相应更改。 #### 读取本地 Excel 文件转换成 JSON 数据结构 当用户选择了要上传的 Excel 文件之后,可以通过 FileReader API 来获取其二进制内容,并利用 XLSX 将这些原始字节序列解析成为易于操作的对象形式: ```javascript function readExcel(fileObject){ let reader = new FileReader(); reader.onload = function(event){ var data = event.target.result; /* 转换 */ var workbook = XLSX.read(data,{type:'binary'}); /* 获取第一个sheet页的数据 */ var firstSheetName = workbook.SheetNames[0]; var worksheet = workbook.Sheets[firstSheetName]; /* sheet_to_json 方法可以将worksheet对象转化为json数组 */ var jsonData = XLSX.utils.sheet_to_json(worksheet); console.log(jsonData); // 输出 json 数组 // 进一步处理... }; reader.readAsBinaryString(fileObject); } ``` 此部分代码实现了从选择文件到最终得到可用 JSON 结构的过程[^2]。 #### 构建新的 Workbook 并保存为 Excel 文件 创建一个新的工作簿实例并向其中添加 Sheet 表格以及填充数据后,再将其导出为 `.xlsx` 格式的 Blob 对象供后续下载或分享等功能使用: ```javascript async function exportToExcel(jsonData, sheetName="Sheet1", excelFileName="exportedFile.xlsx"){ /* 创建一个新工作薄 */ const wb = XLSX.utils.book_new(); /* 把json数据转化成worksheet*/ const ws = XLSX.utils.json_to_sheet(jsonData); /* 添加worksheet到工作薄 */ XLSX.utils.book_append_sheet(wb,ws,sheetName); /* 写入并生成Blob对象 */ const wbout = XLSX.write(wb,{ bookType:"xlsx", type:"array" }); try { await saveAs(new Blob([wbout],{type:"application/octet-stream"}),excelFileName); wx.showToast({ title: '导出成功', icon: 'success' }); } catch (e) { console.error('Failed to download:', e); wx.showToast({ title: '导出失败', icon: 'none' }); } } /* 假设有一个按钮触发这个函数 */ <view class='btn' bindtap='() => exportToExcel(yourJsonData,"My Data","data_export.xlsx")'>Export</view> ``` 上述代码片段展示了如何基于现有 JSON 数据集构建 Excel 工作表并通过 `wx.downloadFile()` 接口实现在客户端侧完成文件下载动作[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MuscleFish

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值