项目中的一个小需求。
需要将xls格式的文件转为csv格式的文件,用来存储到数据库中,
90行代码
<input type="file" id="xls" value="上传xls文件" onchange="generate()">
<div id='down'></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.12.13/xlsx.js"></script>
<script>
// 处理表头
function _dealWithHead(obj) {
let arr = [];
for (let i in obj) {
arr.push(obj[i])
}
return arr;
}
// 处理数据逻辑
function _changeData(workbook, persons) {
// let fromTo = '';
// 遍历每张表读取
for (let sheet in workbook.Sheets) {
if (workbook.Sheets.hasOwnProperty(sheet)) {
// fromTo = workbook.Sheets[sheet]['!ref'];
persons = persons.concat(XLSX.utils.sheet_to_json(workbook.Sheets[sheet]));
// break; // 如果只取第一张表,就取消注释这行
}
}
let head = [];
let p = persons;
for (let i = 0; i < p.length; i++) {
head.push(_dealWithHead(p[i]))
}
let csvRows = [];
for (let j = 0; j < head.length; j++) {
csvRows.push(head[j].join(','))
}
let csvString = csvRows.join('\n'); //BOM的方式解决EXCEL乱码问题 let
BOM = '\uFEFF';
csvString = BOM + csvString;
_generateTag(csvString);
}
//生成下载标签
function _generateTag(csvString) {
let tag = document.createElement('a');
tag.href = 'data:attachment/csv,' +
encodeURI(csvString);
tag.target = '_blank';
tag.innerHTML = '下载csv文件';
tag.download = 'result.csv';
document.getElementById('down').appendChild(tag);
}
function generate(e) {
let files = document.getElementById('xls').files;
// 拦截其他格式文件
if (files[0].name.split('.')[1] !== 'xls') {
alert('文件格式不支持');
return;
}
let fileReader = new FileReader();
fileReader.onload = function (ev) {
try {
var data = ev.target.result,
workbook = XLSX.read(data, {
type: 'binary'
}), // 以二进制流方式读取得到整份excel表格对象
persons = []; // 存储获取到的数据
} catch (e) {
alert('只支持xls格式的文件');
return;
}
_changeData(workbook, persons);
// 表格的表格范围,可用于判断表头是否数量是否正确
};
// 以二进制方式打开文件
fileReader.readAsBinaryString(files[0]);
};