uniapp微信小程序数据导出表格

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

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

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

<template>
	<view class="body">
		<view style="margin-top: 10px;">
			<button @click="exportClick()">导出</button>
		</view>
	</view>
</template>

<script>
	import * as XLSX from '@/utils/xlsx.core.min.js' //xlsxjs文件路径
	export default {
		data() {
			return {
				e_list: [],
				headerName: {} //导出表头
			}
		},
		onLoad() {
			
		},
		methods: {
			//获取订单列表,不分页
			async getList() {
				uni.showLoading({
					mask: true,
					title: '加载中'
				})
				const params = {}
				const res = await this.$u.api.获取订单列表(params)
				if (res.data.code == 10000) {
					this.e_list = res.data.data
					// console.log('llll', this.e_list)
					this.head_list = ['id']//不管导出哪个自定义表格都必须有序号

                    //遍历选中的表头信息加入到表格头列表中
					for (var i in this.ordered_list) {
						this.head_list.push(this.ordered_list[i])
					}
					for (var j in this.received_list) {
						this.head_list.push(this.received_list[j])
					}
					console.log('导出表格头', this.head_list)
                    //数据列表
					const excel_list = []
					for (var i = 0; i < this.e_list.length; i++) {
                        //自定义序号
						this.e_list[i].id = i + 1
						// console.log(this.e_list[i].goods_list)
						//取e_list[i]即表单数据的键值对循环,判断e_list[i]的key==key,则value = e_list[key]
						const keys = Object.keys(this.e_list[i])
						// const values = Object.values(this.e_list[i])
						console.log('keys', keys)
                        //定义所有的表头信息,用户自定义选中的组成新表头对象header
						const allHeaderName = {
							id: '序号',
							order_id: '订单号',
							send_type: '订单类型',
							nickname: '下单人',
							create_at: '下单时间',
							order_goods: '商品',
							mobile: '联系电话',
							pay_name: '支付状态',
							status_name: '订单状态',
							address: '地址'
						}
						const h_keys = Object.keys(allHeaderName)
						// const h_values = Object.values(allHeaderName)
						const excel_info = {}
                        //用户自定义选中的组成新表头对象header
						for (var q = 0; q < this.head_list.length; q++) {
							const key = this.head_list[q]
							for (var p = 0; p < keys.length; p++) {
								if (key == keys[p]) {
									// console.log('key', key)
									excel_info[key] = this.e_list[i][key]
								}
								if (key == h_keys[p]) {
									// console.log('h_key', key)
									this.headerName[key] = allHeaderName[key]
								}

							}
						}
						excel_list.push(excel_info)
						console.log(excel_list)
					}
					uni.hideLoading()
					// const header = this.head_list
					const ExcelData = excel_list
					this.json2Excel(ExcelData, this.head_list, this.headerName, '订单列表')
				}
			},
			//导出数据
			exportClick() {
				if (this.time_range == '请选择时间' || this.order_type_id == 0 || !this.ordered_list || !this.received_list) {
					uni.showToast({
						icon: 'error',
						title: '请完善信息'
					})
				} else {
					this.getList()
				}
			},
			/**
			 * json转化xlsx
			 * @param {Object} data 数据
			 * @param {Object} header header为数据源属性名
			 * @param {Object} headerName 表头文案
			 * @param {Object} fileName 文件名 ps:这里我写死了 可自行修改
			 */
			json2Excel(data, header, headerName, fileName) {
				let wopts = {
					bookType: 'xlsx',
					bookSST: false,
					type: 'binary',
				}
				let workBook = {
					SheetNames: ['Sheet1'],
					Sheets: {},
					Props: {},
				}
				const newData = [headerName, ...data]
				// 1.XLSX.utils.json_to_sheet(data)接受一个对象数组并返回一个基于对象关键字自动生成的“标题”的工作表
				//默认的列顺序由使用Object.keys的字段的第一次出现确定
				// 2.将数据放入对象workBook的Sheets中等待输出
				//加了一句skipHeader:true,这样就会忽略原来的表头
				workBook.Sheets['Sheet1'] = XLSX.utils.json_to_sheet(newData, {
					header: header,
					skipHeader: true
				})
				// 3.XLSX.write()开始编写ExceL表格
				// 4.changeData()将数据处理成需要的输出的格式
				// console.log(this.changeData(XLSX.write(workBook, wopts)))
				let time = new Date().getTime()
				const StrData = this.changeData(XLSX.write(workBook, wopts))
				const fs = wx.getFileSystemManager() //获取全局唯一的文件管理器
				fs.writeFile({
					filePath: wx.env.USER_DATA_PATH +
						`/订单列表${time}.xlsx`, // wx.env.USER_DATA_PATH 指定临时文件存入的路径,后面字符串自定义
					data: StrData,
					encoding: 'binary', //二进制流文件必须是 binary
					success(res) {
						uni.hideLoading()
						wx.openDocument({
							// 打开文档
							filePath: wx.env.USER_DATA_PATH + `/订单列表${time}.xlsx`, //拿上面存入的文件路径
							showMenu: true, // 显示右上角菜单
							success: function(res) {},
							fail: function() {
								uni.showToast({
									title: `打开失败`,
									icon: 'error',
									duration: 2000,
								})
							},
						})
					},
				})
			},
			/**
			 * 将数据处理成需要的输出的格式
			 * @param {Object} s XLSX输入
			 */
			changeData(s) {
				//如果存在ArrayBuffer对象(es6)最好采用该对象
				if (typeof ArrayBuffer !== 'undefined') {
					//1.创建一个字节长度为s.length的内存区域
					let buf = new ArrayBuffer(s.length)
					//2.创建一个指向buf的Unit8视图,开始于字节0,直到缓冲区的末尾
					let view = new Uint8Array(buf)
					//3.返回指定位置的字符的Unicode编码
					for (let i = 0; i != s.length; ++i) {
						view[i] = s.charCodeAt(i) & 0xff
					}
					return buf
				} else {
					let buf = new Array(s.length)
					for (let i = 0; i != s.length; ++i) {
						buf[i] = s.charCodeAt(i) & 0xff
					}
					return buf
				}
			},


		}
	}
</script>

测试数据e_list

const e_list = [
{
address: null,
create_at: "2022-09-28 16:25:40",
order_id: 95,
nickname: "春困",
mobile: "15076128602",
pay_name: "已付款"
pay_status: 1,
send_type: 2,
status_name: "待自提",
order_goods:['白菜一斤','西红柿一盒']
}
]
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当面试官问到uniapp微信小程序相关的试题时,你可以参考以下问题答案: 1. 什么是uniapp? - uniapp是一个基于Vue.js开发跨平台应用框架,可以同时开发iOS、Android、H5和微信小程序等多个平台的应用。 2. 什么是微信小程序? - 微信小程序是一种在微信平台上运行的应用程序,用户可以在微信中直接使用,无需下载安装。 3. uniapp微信小程序有什么关系? - uniapp可以开发微信小程序,通过uniapp的跨平台特性,开发者只需要编写一套代码,就可以同时在多个平台上运行。 4. uniapp开发微信小程序的优势有哪些? - 跨平台开发:只需编写一套代码,即可在多个平台上运行。 - 开发效率高:使用Vue.js进行开发,具有简洁、灵活的语法,提高开发效率。 - 统一的UI组件:uniapp提供了一套统一的UI组件库,方便开发者快速构建界面。 - 支持原生能力:uniapp支持调用原生API,可以实现更多的功能。 5. uniapp开发微信小程序的限制有哪些? - 对于一些特定的微信小程序API,uniapp可能无法直接调用,需要通过插件或自定义组件来实现。 - 由于不同平台的差异,一些特定的样式和功能在不同平台上可能会有差异。 6. uniapp中如何实现微信小程序的页面跳转? - 可以使用uniapp提供的`uni.navigateTo`、`uni.redirectTo`、`uni.switchTab`等方法来实现页面跳转。 7. uniapp中如何调用微信小程序的原生API? - 可以使用uniapp提供的`uni.request`、`uni.showToast`等方法来调用微信小程序的原生API。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值