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
});
1 个回复
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)
}