NGTools/uni_modules/sv-excel-json-each/js_sdk/parseExcel.js

125 lines
3.9 KiB
JavaScript
Raw Normal View History

import pickFile from './plusFilePicker.js'
async function urlToBase64(url) {
// #ifndef MP-WEIXIN
// 注意url必须为http或者https协议路径本地file路径不行
let res = await uni.request({
url: url,
method: 'GET',
responseType: 'arraybuffer'
});
// 容错处理
if (Array.isArray(res)) {
res = res.find(item => item && item.data)
}
let base64 = uni.arrayBufferToBase64(res.data); //把arraybuffer转成base64
// #endif
// #ifdef MP-WEIXIN
const fs = wx.getFileSystemManager()
let base64 = fs.readFileSync(url, 'base64')
// #endif
return base64
}
/**
* 文件选择 表格文件导入 返回表格数据
* @param callback 为了兼容安卓文件选择此处使用callback回调来接受解析后的json参数其他平台勿使用该回调
*/
export async function importToJson(sheetList = [], callback) {
// #ifdef H5
let fileRes = await uni.chooseFile({
count: 1,
extension: ['.xls', '.xlsx']
});
// fileRes可能是单对象也可能是数组且数组中存在某项为null的情况需要容错处理以取出真实文件数据对象
if (Array.isArray(fileRes)) {
fileRes = fileRes.find(item => item && item.tempFilePaths.length > 0)
}
const filePath = fileRes.tempFilePaths[0]
return await fileToJson(filePath, sheetList)
// #endif
// #ifdef MP-WEIXIN
const fileRes = await wx.chooseMessageFile({
count: 1,
type: 'file',
extension: ['.xls', '.xlsx']
})
const filePath = fileRes.tempFiles[0].path
return await fileToJson(filePath, sheetList)
// #endif
// #ifdef APP
switch (plus.os.name) {
case "Android":
// Android平台: plus.android.*
// 安卓需要先使用Native.js进行文件选择上传文件后再进行解析
pickFile.PickFile(async (src) => {
let srcPath = 'file://' + src;
console.log('==== srcPath :', srcPath);
const upRes = await uniCloud.uploadFile({
filePath: srcPath,
// 同名会导致报错 policy_does_not_allow_file_overwrite
// cloudPath可由 想要存储的文件夹/文件名 拼接若不拼文件夹名则默认存储在cloudstorage文件夹中
cloudPath: `cloudstorage/${Date.now()}`,
cloudPathAsRealPath: true
})
console.log('==== upRes :', upRes);
const filePath = upRes.fileID
callback(await fileToJson(filePath, sheetList))
});
break;
case "iOS":
// iOS平台: plus.ios.*
break;
default:
// 其它平台
break;
}
// #endif
}
/**
* 表格文件导入 返回表格数据
*/
async function fileToJson(path, sheetList) {
const base = await urlToBase64(path);
const eachObj = uniCloud.importObject('sv-excel-json-each')
const dataRes = await eachObj.getExcelToJson({
data: base,
sheetList
})
return dataRes
}
/**
* 数据导出 返回表格文件下载
* @param {Object} options
* file文件模式可自动下载并返回文件下载路径base64模式不提供自动下载并直接返回base64字串
*/
export async function exportToExcel(options) {
const eachObj = uniCloud.importObject('sv-excel-json-each')
const dataRes = await eachObj.getJsonToExcel(options.params)
if (dataRes.code == 0) {
if (options.autoDownload && options.params.type == 'file') {
/**
* 下载文件资源到本地客户端直接发起一个 HTTP GET 请求返回文件的本地临时路径
* 注意在HbuilderX内置浏览器中无法正常运行
* @tutorial https://uniapp.dcloud.net.cn/api/request/network-file.html#downloadfile
*/
uni.downloadFile({
url: dataRes.data,
success: (res) => {
uni.openDocument({
filePath: res.tempFilePath,
showMenu: true,
});
}
})
}
} else {
console.error('==== dataRes :', dataRes);
}
return dataRes.data
}