9***@qq.com
9***@qq.com
  • 发布:2025-06-08 09:37
  • 更新:2025-06-09 09:10
  • 阅读:18

5+APP 在安卓端导出excel文件失败

分类:5+ SDK

5+APP 在安卓端导出excel文件失败
端提示
09:30:31.941 开始导出日记... at js/main.js:547
09:30:31.941 正在格式化数据... at js/main.js:554
09:30:31.941 正在创建工作表... at js/main.js:567
09:30:31.941 正在创建工作簿... at js/main.js:586
09:30:31.941 正在生成Excel文件... at js/main.js:590
09:30:31.958 检测到 HBuilder X 环境,使用文件系统保存文件... at js/main.js:601
09:30:31.973 存储权限获取成功 at js/main.js:607
09:30:31.973 下载路径: /storage/emulated/0/Android/data/io.dcloud.HBuilder/downloads/ at js/main.js:612
09:30:31.973 获取目录成功 at js/main.js:615
09:30:31.973 创建文件成功 at js/main.js:617
09:30:31.991 创建写入器成功 at js/main.js:619
09:30:31.991 开始写入文件... at js/main.js:648
09:30:31.991 undefined

// 导入导出功能
function importDiaries() {
const fileInput = document.createElement('input');
fileInput.type = 'file';
fileInput.accept = '.xlsx,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
fileInput.style.display = 'none';

fileInput.addEventListener('change', async (event) => {  
    const file = event.target.files[0];  
    if (!file) {  
        document.body.removeChild(fileInput);  
        return;  
    }  

    // 检查文件格式  
    if (!file.name.endsWith('.xlsx') && !file.type.includes('spreadsheetml')) {  
        alert('请选择Excel文件(.xlsx),可以参考 data/diary_template.xlsx 的格式');  
        document.body.removeChild(fileInput);  
        return;  
    }  

    const maxSize = 10 * 1024 * 1024; // 10MB  
    if (file.size > maxSize) {  
        alert('文件太大,请选择小于10MB的文件');  
        document.body.removeChild(fileInput);  
        return;  
    }  

    const loadingToast = document.createElement('div');  
    loadingToast.className = 'loading-toast';  
    loadingToast.textContent = '正在导入文件...';  
    document.body.appendChild(loadingToast);  

    try {  
        const arrayBuffer = await file.arrayBuffer();  
        const workbook = XLSX.read(arrayBuffer, { type: 'array' });  
        const firstSheetName = workbook.SheetNames[0];  
        const worksheet = workbook.Sheets[firstSheetName];  
        const rawData = XLSX.utils.sheet_to_json(worksheet);  

        if (!Array.isArray(rawData) || rawData.length === 0) {  
            throw new Error('导入的文件格式不正确或为空');  
        }  

        const newDiaries = rawData.map(item => {  
            let dateStr = item['日期'] || item['date'];  
            if (!dateStr) {  
                throw new Error('导入的数据缺少日期字段');  
            }  

            let dateObj;  
            if (typeof dateStr === 'string') {  
                if (!isNaN(dateStr)) {  
                    dateObj = XLSX.SSF.parse_date_code(parseFloat(dateStr));  
                } else {  
                    dateObj = new Date(dateStr);  
                }  
            } else if (typeof dateStr === 'number') {  
                dateObj = XLSX.SSF.parse_date_code(dateStr);  
            } else {  
                throw new Error('日期格式不正确');  
            }  

            if (isNaN(dateObj.getTime())) {  
                throw new Error('日期格式不正确');  
            }  

            const year = dateObj.getFullYear();  
            const month = String(dateObj.getMonth() + 1).padStart(2, '0');  
            const day = String(dateObj.getDate()).padStart(2, '0');  
            const formattedDate = `${year}-${month}-${day}`;  

            const content = {};  
            for (const [key, label] of Object.entries(DIARY_FIELDS)) {  
                content[key] = item[label] || item[key] || '';  
            }  

            return { date: formattedDate, content };  
        });  

        const existingDates = new Set(diaries.map(d => d.date));  
        const uniqueNewDiaries = newDiaries.filter(diary => !existingDates.has(diary.date));  

        if (uniqueNewDiaries.length === 0) {  
            alert('没有新的日记可以导入,所有日记都已存在');  
        } else {  
            diaries = [...diaries, ...uniqueNewDiaries];  
            saveAndRender();  
            alert(`成功导入 ${uniqueNewDiaries.length} 条新日记`);  
        }  

    } catch (error) {  
        console.error('导入失败:', error);  
        alert(`导入失败: ${error.message}`);  
    } finally {  
        document.body.removeChild(loadingToast);  
        document.body.removeChild(fileInput);  
    }  
});  

document.body.appendChild(fileInput);  

if (/Android|iPhone|iPad|iPod/i.test(navigator.userAgent)) {  
    setTimeout(() => {  
        fileInput.click();  
    }, 0);  
} else {  
    fileInput.click();  
}  

}

function exportDiaries() {
if (diaries.length === 0) {
alert('没有日记可以导出');
return;
}

console.log('开始导出日记...');  
const loadingToast = document.createElement('div');  
loadingToast.className = 'loading-toast';  
loadingToast.textContent = '正在生成文件...';  
document.body.appendChild(loadingToast);  

try {  
    console.log('正在格式化数据...');  
    const formattedDiaries = diaries.map(diary => {  
        const content = diary.content || {};  
        const result = { '日期': diary.date };  
        for (const [key, label] of Object.entries(DIARY_FIELDS)) {  
            const value = content[key];  
            result[label] = value && value.trim() !== '' ? value : '';  
        }  
        return result;  
    }).filter(diary => {  
        return Object.values(diary).some(value => value && value.trim() !== '');  
    });  

    console.log('正在创建工作表...');  
    const worksheet = XLSX.utils.json_to_sheet(formattedDiaries, {  
        header: ['日期', ...Object.values(DIARY_FIELDS)],  
        skipHeader: false  
    });
2025-06-08 09:37 负责人:无 分享
已邀请:
2***@qq.com

2***@qq.com - 我想发财

参考一下: exportTrainingPlanToExcel这个方法只是我这边处理表格数据的,用了sheet.js这个库

const { ws } = this.exportTrainingPlanToExcel(data)
// csv格式不需要设置字段之间的分隔符
const csvws = utils.sheet_to_csv(ws)
// xlsx格式需要设置字段之间的分隔符,默认为逗号,此处改为/T分隔符
// const csvws = utils.sheet_to_csv(worksheet, {
// FS: '\t' // 设置字段之间的分隔符为制表符
// })
console.log(csvws)
let fileName = _doc/planData-${new Date().getTime()}.csv
try {
// 使用H5+ API将文件写入本地
plus.io.requestFileSystem(plus.io.PRIVATE_WWW, function (fs) {
fs.root.getFile(fileName, { create: true }, function (fileEntry) {
fileEntry.createWriter(function (writer) {
writer.write(csvws)
writer.onwrite = function () {
console.log('文件写入成功')
successCallback && successCallback(plus.io.convertLocalFileSystemURL(fileName))
}
})
})
})
} catch (error) {
console.error('文件写入失败: ' + error.message)
errorCallback && errorCallback(error.message)
}

要回复问题请先登录注册