【微信小程序】导出Excel报表并分享好友、预览、下载,解决调用 wx.shareFileMessage报错问题

一,在小程序的页面引入xlsx库

// 引入依赖库
const XLSX = require("../../utils/xlsx.mini.min");

二,定义导出Excel报表的方法

ExportExcel:function(){
    //表内容
    let xlsxdata=[
      {
        rgtime:"2024-09-01 19:35:53",
        name:'a',
        age:20
      },{
        rgtime:"2024-09-02 19:35:53",
        name:'b',
        age:20
      },{
        rgtime:"2024-09-03 19:35:53",
        name:'c',
        age:20
      }]

    // 表头
    let title = ['注册时间', '姓名', '年龄'];
    let sheet = []l
    // 数据整理
    xlsxdata.forEach(item => {
      let rowcontent = []
      rowcontent.push(item.id)
      rowcontent.push(item.name)
      sheet.push(rowcontent)
    });
  // XLSX插件使用
  var ws = XLSX.utils.aoa_to_sheet(sheet);
  var wb = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(wb, ws, "excal2024");
  const fileData = XLSX.write(wb, { bookType: 'xlsx', type: 'base64' }); 
  //保存的本地地址
  const filePath = `${wx.env.USER_DATA_PATH}/excal2024.xlsx`; 
  // 写文件
  const fs = wx.getFileSystemManager()
    fs.writeFile({
    filePath: filePath,
    data: fileData,
    encoding: 'base64',
    success(res) {
      console.log(res);
      that.setData({xlsxpath:filePath});
      //filePath 是写入资源的临时保存路径
    },
    fail(res) { 
          console.error(res)
    }
  });
}

三,打开预览生成的excel文件

// 打开文档
wx.openDocument({
    filePath: filePath,
    success: function (res) {
        console.log('打开文档成功')
    },
    fail: console.error
})

四,电脑端导出excel文件

const sysInfo = wx.getSystemInfoSync()
// 导出
if (sysInfo.platform.toLowerCase().indexOf('windows') >= 0) {
    // 电脑PC端导出
    wx.saveFileToDisk({
        filePath: filePath,
        success(res) {
          console.log(res)
        },
        fail(res) {
          console.error(res)
          console.log("导出失败")
        }
    })
} 

五,下载远程Excel文件

url是放在远程上要下载的excel文件路径

wx.downloadFile({
  url: 'https://xxx.com/excel文件.xls', 
  filePath: wx.env.USER_DATA_PATH + '/'+ '自定义名字.xlsx',
  success(res) {
     console.log('downloadFile',res)
     const filePath = res.tempFilePath
      wx.openDocument({
          filePath: filePath,
          fileType: 'xlsx',
          success: function(ress) {
            console.log('打开文档成功',ress)
          },
          fail: function(err) {
            console.log('保存失败:', err)
          }
})

六,下载远程Excel文件后分享给微信好友

    wx.downloadFile({
      url: 'https://xxx.cn/excel文件.xls', // 下载url
      success (res) {
        console.log('ressss',res)
        if(res.statusCode == 200) {
          console.log('res.statusCode',res)
            // that.openFileEvs(res)
            wx.shareFileMessage({
              filePath: res.tempFilePath,
              success(data) {
                console.log('转发成功!!!',data)
              },
              fileName:'自定义文件名字.xlsx',
              fail: console.error,
            })
        }
      },
      fileName:'excelname',
      fail: console.error,
    })

七,解决导出excel文件后分享好友bug


<button bindtap="ExportExcel" style="color:#1989fa"> 分享excel </button>
 fs.writeFile({
    filePath: filePath,
    data: fileData,
    encoding: 'base64',
    success(res) {
      console.log(res);
      wx.shareFileMessage({
        filePath: filePath,
        fileType: 'xlsx',
        fileName:'自定义文件名字.xlsx',
        success(data) {
          console.log('转发成功!!!',data)
        }, 
        fail: console.error,
      }) 
    },
    fail(res) { 
    }
  });

如果是按上面的方法调用导出excel文件并分享好友点击分享excel按钮 会提示报错

解决办法:将写文件fs.writeFille函数和wx.shareFileMessage 分开调用,不要嵌套在一个函数中使用,wx.shareFileMessage需要直接用按钮的binptap的绑定事件打开,这样就不会在报shareFileMessage:fail can only be invoked by user TAP gesture

<button bindtap="ExportExcel" style="color:#1989fa"> 导出Excel </button>
<button bindtap="shareEvent" style="color:#1989fa"> 分享Excel </button>

导出Excel函数

ExportExcel:function(){
    //表内容
    let xlsxdata=[
      {
        rgtime:"2024-09-01 19:35:53",
        name:'a',
        age:20
      },{
        rgtime:"2024-09-02 19:35:53",
        name:'b',
        age:20
      },{
        rgtime:"2024-09-03 19:35:53",
        name:'c',
        age:20
      }]

    // 表头
    let title = ['注册时间', '姓名', '年龄'];
    let sheet = []l
    // 数据整理
    xlsxdata.forEach(item => {
      let rowcontent = []
      rowcontent.push(item.id)
      rowcontent.push(item.name)
      sheet.push(rowcontent)
    });
  // XLSX插件使用
  var ws = XLSX.utils.aoa_to_sheet(sheet);
  var wb = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(wb, ws, "excal2024");
  const fileData = XLSX.write(wb, { bookType: 'xlsx', type: 'base64' }); 
  //保存的本地地址
  const filePath = `${wx.env.USER_DATA_PATH}/excal2024.xlsx`; 
  // 写文件
  const fs = wx.getFileSystemManager()
    fs.writeFile({
    filePath: filePath,
    data: fileData,
    encoding: 'base64',
    success(res) {
      console.log(res);
      that.setData({xlsxpath:filePath});
      //filePath 是写入资源的临时保存路径
    },
    fail(res) { 
          console.error(res)
    }
  });
}

分享excel

  shareEvent(){
    var filePath = this.data.xlsxpath; 
    wx.shareFileMessage({
      filePath: filePath,
      fileType: 'xlsx',
      fileName:'自定义文件名字.xlsx',
      success(data) {
        console.log('转发成功!!!',data)
      }, 
      fail: console.error,
    }) 
  },

github地址:GitHub - SheetJS/sheetjs: 📗 SheetJS Spreadsheet Data Toolkit -- New home https://git.sheetjs.com/SheetJS/sheetjs
下载地址:SheetJS - CDN

要在微信小程序导出Excel表格上加水印,可以使用以下步骤: 1.Excel中创建一个水印图片或文字,将其保存为PNG格式的文件。 2.微信小程序中,使用wx.downloadFile()方法下载Excel文件。 3. 使用js-xlsx库将下载Excel文件转换为可编辑的对象。 4. 在对象中添加水印。具体做法可以是在单元格中添加图片或文本,或在单元格的背景中添加图片。 5. 使用js-xlsx库将编辑后的对象转换回Excel文件。 6. 使用wx.saveFile()方法保存编辑后的Excel文件。 以下是一个示例代码片段,演示如何在微信小程序中添加水印: ```javascript const XLSX = require('xlsx') // 下载Excel文件 wx.downloadFile({ url: 'http://example.com/example.xlsx', success: function(res) { // 将文件读取为可编辑对象 const workbook = XLSX.read(res.tempFilePath, { type: 'file' }) const sheetName = workbook.SheetNames[0] const worksheet = workbook.Sheets[sheetName] // 添加水印图片 const watermark = wx.getFileSystemManager().readFileSync('watermark.png', 'base64') const watermarkImage = XLSX.utils.sheet_add_image(worksheet, watermark, { tl: { col: 0, row: 0 }, br: { col: 5, row: 5 } }) // 保存编辑后的Excel文件 const editedWorkbook = XLSX.write(workbook, { bookType: 'xlsx', type: 'binary' }) wx.saveFile({ tempFilePath: window.URL.createObjectURL(new Blob([editedWorkbook], { type: 'application/octet-stream' })), success: function(res) { console.log('Excel文件已保存:', res.savedFilePath) } }) } }) ``` 请注意,上述代码中的水印图片需要您自己创建,将其保存为PNG格式的文件。此外,代码中还假定Excel文件只有一个工作表,如果文件中有多个工作表,则需要根据实际情况进行修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值