定义方法
export function doExport(listData) {
let worksheet = 'sht1'
let str ='<tr><td style="text-align: center">学号</td><td style="text-align: center">姓名</td><td style="text-align: center">分数</td><td style="text-align: center">时长</td><td style="text-align: center">日期</td></tr>'
// 循环遍历,每行加入tr标签,每个单元格加td标签
for (let i = 0; i < listData.length; i++) {
str += '<tr>'
for (let item in listData[i]) {
// 增加\t为了不让表格显示科学计数法或者其他格式
str += `<td>${listData[i][item] + '\t'}</td>`
}
str += '</tr>'
}
// 下载的表格模板数据
let template = `<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
<head><!--[if gte mso 9]><xml encoding="UTF-8"><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>
<x:Name>${worksheet}</x:Name>
<x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet>
</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]-->
</head><body><table>${str}</table></body></html>`
// 下载模板
// #ifdef APP-PLUS
appExportFile(template)
// #endif
// 下载模板
// #ifdef MP-WEIXIN
wxExportFile(template)
// #endif
}
function appExportFile(fileData, documentName = '心肺复苏成绩单') {
console.log('开始导出数据********')
return new Promise((resolve, reject) => {
// 1. 权限检查(安卓端)
if (uni.getSystemInfoSync().platform === 'android') {
plus.android.requestPermissions(
['WRITE_EXTERNAL_STORAGE'],
() => initExport(),
(e) => reject(new Error('存储权限被拒绝'))
)
} else {
initExport()
}
function initExport() {
plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, (fs) => {
fs.root.getDirectory(documentName, { create: true }, (dirEntry) => {
const fileName = `${documentName}_${Date.now()}.xlsx`
dirEntry.getFile(fileName, { create: true }, (fileEntry) => {
fileEntry.createWriter((writer) => {
writer.onwrite = () => {
const filePath = fileEntry.toLocalURL()
resolve(filePath)
showConfirmDialog(filePath)
}
writer.onerror = (e) => reject(e)
writer.write(fileData)
}, reject)
}, reject)
}, reject)
}, reject)
// 新增确认弹窗
const showConfirmDialog = (filePath) => {
uni.showModal({
title: '导出成功',
content: `文件已保存到: ${filePath}\n是否立即查看?`,
confirmText: '立即查看',
cancelText: '稍后查看',
success: (res) => {
if (res.confirm) {
uni.openDocument({
filePath,
success: () => console.log('文档打开成功'),
fail: (err) => uni.showToast({ title: `打开失败: ${err.errMsg}`, icon: 'none' })
})
}
}
})
}
}
})
}
function wxExportFile(template, documentName = '心肺复苏成绩单') {
const fs = wx.getFileSystemManager()
// 创建文件名字, 防止重名
let filePath = wx.env.USER_DATA_PATH + '/' + (documentName + this.uuid()) + '.xls'
fs.writeFile({
filePath,
data: template,
encoding: 'utf8',
success: res => {
wx.openDocument({
filePath,
showMenu: true, //是否显示右上角菜单
success: res => console.log('打开文档成功。文件位置', filePath),
fail: err => console.log(err)
})
},
fail: err => console.info(err)
})
}
应用
import { doExport } from '../../utils/excelExport'
// listData数据类型举例
const listData =[]
for(var i=0; i < res.length; i++){
const data = {
学号:res[i].stuId,
姓名:res[i].stuName,
分数:res[i].score,
时长:formatDuration(res[i].duration),
日期:res[i].date
}
listData.push(data)
}
doExport(listData)