当前位置:   article > 正文

uniapp微信小程序数据导出表格_uniapp开发微信小程序 纯前端导出excel表格

uniapp开发微信小程序 纯前端导出excel表格

项目需求:前端自定义表头并输出表格

引用xlsx.core.min.js  但会有警告:[警告⚠] `utils\xlsx.core.min.js` 文件体积超过 500KB,已跳过压缩以及 ES6 转 ES5 的处理,手机端使用过大的js库影响性能。

应用:筛选订单条件如时间范围,订单类型,然后请求后端接口获取数据,获取后自定义表头及表单内数据

  1. <template>
  2. <view class="body">
  3. <view style="margin-top: 10px;">
  4. <button @click="exportClick()">导出</button>
  5. </view>
  6. </view>
  7. </template>
  8. <script>
  9. import * as XLSX from '@/utils/xlsx.core.min.js' //xlsxjs文件路径
  10. export default {
  11. data() {
  12. return {
  13. e_list: [],
  14. headerName: {} //导出表头
  15. }
  16. },
  17. onLoad() {
  18. },
  19. methods: {
  20. //获取订单列表,不分页
  21. async getList() {
  22. uni.showLoading({
  23. mask: true,
  24. title: '加载中'
  25. })
  26. const params = {}
  27. const res = await this.$u.api.获取订单列表(params)
  28. if (res.data.code == 10000) {
  29. this.e_list = res.data.data
  30. // console.log('llll', this.e_list)
  31. this.head_list = ['id']//不管导出哪个自定义表格都必须有序号
  32. //遍历选中的表头信息加入到表格头列表中
  33. for (var i in this.ordered_list) {
  34. this.head_list.push(this.ordered_list[i])
  35. }
  36. for (var j in this.received_list) {
  37. this.head_list.push(this.received_list[j])
  38. }
  39. console.log('导出表格头', this.head_list)
  40. //数据列表
  41. const excel_list = []
  42. for (var i = 0; i < this.e_list.length; i++) {
  43. //自定义序号
  44. this.e_list[i].id = i + 1
  45. // console.log(this.e_list[i].goods_list)
  46. //取e_list[i]即表单数据的键值对循环,判断e_list[i]的key==key,则value = e_list[key]
  47. const keys = Object.keys(this.e_list[i])
  48. // const values = Object.values(this.e_list[i])
  49. console.log('keys', keys)
  50. //定义所有的表头信息,用户自定义选中的组成新表头对象header
  51. const allHeaderName = {
  52. id: '序号',
  53. order_id: '订单号',
  54. send_type: '订单类型',
  55. nickname: '下单人',
  56. create_at: '下单时间',
  57. order_goods: '商品',
  58. mobile: '联系电话',
  59. pay_name: '支付状态',
  60. status_name: '订单状态',
  61. address: '地址'
  62. }
  63. const h_keys = Object.keys(allHeaderName)
  64. // const h_values = Object.values(allHeaderName)
  65. const excel_info = {}
  66. //用户自定义选中的组成新表头对象header
  67. for (var q = 0; q < this.head_list.length; q++) {
  68. const key = this.head_list[q]
  69. for (var p = 0; p < keys.length; p++) {
  70. if (key == keys[p]) {
  71. // console.log('key', key)
  72. excel_info[key] = this.e_list[i][key]
  73. }
  74. if (key == h_keys[p]) {
  75. // console.log('h_key', key)
  76. this.headerName[key] = allHeaderName[key]
  77. }
  78. }
  79. }
  80. excel_list.push(excel_info)
  81. console.log(excel_list)
  82. }
  83. uni.hideLoading()
  84. // const header = this.head_list
  85. const ExcelData = excel_list
  86. this.json2Excel(ExcelData, this.head_list, this.headerName, '订单列表')
  87. }
  88. },
  89. //导出数据
  90. exportClick() {
  91. if (this.time_range == '请选择时间' || this.order_type_id == 0 || !this.ordered_list || !this.received_list) {
  92. uni.showToast({
  93. icon: 'error',
  94. title: '请完善信息'
  95. })
  96. } else {
  97. this.getList()
  98. }
  99. },
  100. /**
  101. * json转化xlsx
  102. * @param {Object} data 数据
  103. * @param {Object} header header为数据源属性名
  104. * @param {Object} headerName 表头文案
  105. * @param {Object} fileName 文件名 ps:这里我写死了 可自行修改
  106. */
  107. json2Excel(data, header, headerName, fileName) {
  108. let wopts = {
  109. bookType: 'xlsx',
  110. bookSST: false,
  111. type: 'binary',
  112. }
  113. let workBook = {
  114. SheetNames: ['Sheet1'],
  115. Sheets: {},
  116. Props: {},
  117. }
  118. const newData = [headerName, ...data]
  119. // 1.XLSX.utils.json_to_sheet(data)接受一个对象数组并返回一个基于对象关键字自动生成的“标题”的工作表
  120. //默认的列顺序由使用Object.keys的字段的第一次出现确定
  121. // 2.将数据放入对象workBook的Sheets中等待输出
  122. //加了一句skipHeader:true,这样就会忽略原来的表头
  123. workBook.Sheets['Sheet1'] = XLSX.utils.json_to_sheet(newData, {
  124. header: header,
  125. skipHeader: true
  126. })
  127. // 3.XLSX.write()开始编写ExceL表格
  128. // 4.changeData()将数据处理成需要的输出的格式
  129. // console.log(this.changeData(XLSX.write(workBook, wopts)))
  130. let time = new Date().getTime()
  131. const StrData = this.changeData(XLSX.write(workBook, wopts))
  132. const fs = wx.getFileSystemManager() //获取全局唯一的文件管理器
  133. fs.writeFile({
  134. filePath: wx.env.USER_DATA_PATH +
  135. `/订单列表${time}.xlsx`, // wx.env.USER_DATA_PATH 指定临时文件存入的路径,后面字符串自定义
  136. data: StrData,
  137. encoding: 'binary', //二进制流文件必须是 binary
  138. success(res) {
  139. uni.hideLoading()
  140. wx.openDocument({
  141. // 打开文档
  142. filePath: wx.env.USER_DATA_PATH + `/订单列表${time}.xlsx`, //拿上面存入的文件路径
  143. showMenu: true, // 显示右上角菜单
  144. success: function(res) {},
  145. fail: function() {
  146. uni.showToast({
  147. title: `打开失败`,
  148. icon: 'error',
  149. duration: 2000,
  150. })
  151. },
  152. })
  153. },
  154. })
  155. },
  156. /**
  157. * 将数据处理成需要的输出的格式
  158. * @param {Object} s XLSX输入
  159. */
  160. changeData(s) {
  161. //如果存在ArrayBuffer对象(es6)最好采用该对象
  162. if (typeof ArrayBuffer !== 'undefined') {
  163. //1.创建一个字节长度为s.length的内存区域
  164. let buf = new ArrayBuffer(s.length)
  165. //2.创建一个指向buf的Unit8视图,开始于字节0,直到缓冲区的末尾
  166. let view = new Uint8Array(buf)
  167. //3.返回指定位置的字符的Unicode编码
  168. for (let i = 0; i != s.length; ++i) {
  169. view[i] = s.charCodeAt(i) & 0xff
  170. }
  171. return buf
  172. } else {
  173. let buf = new Array(s.length)
  174. for (let i = 0; i != s.length; ++i) {
  175. buf[i] = s.charCodeAt(i) & 0xff
  176. }
  177. return buf
  178. }
  179. },
  180. }
  181. }
  182. </script>

测试数据e_list

  1. const e_list = [
  2. {
  3. address: null,
  4. create_at: "2022-09-28 16:25:40",
  5. order_id: 95,
  6. nickname: "春困",
  7. mobile: "15076128602",
  8. pay_name: "已付款"
  9. pay_status: 1,
  10. send_type: 2,
  11. status_name: "待自提",
  12. order_goods:['白菜一斤','西红柿一盒']
  13. }
  14. ]
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/264084
推荐阅读
相关标签
  

闽ICP备14008679号