javascript - 上传excel文件时显示进度条
问题描述
我正在尝试制作包含上传 excel 并将数据存储在数据库中的网络。上传 excel 数据时,我想显示进度条,因为通常它会占用大文件。截至目前,我阅读了 excel 文件并用XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName], {defval: ""});
我已经尝试过来自互联网的解决方案,但这只是简单的活动,比如上传将它放在另一个文件夹中,我想制作进度条,其中进度条的值指示已经解析了多少行。但是XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName], {defval: ""});
它会一次性解析所有行,因此进度条会立即从 0 变为 100。
你们能帮我吗,如何在这种情况下制作进度条,或者你们知道如何不一次逐行解析excel吗?
顺便说一句,我正在用 php 和 javascript 构建它
$("#fileUploader").change(function(evt) {
document.getElementById("progressBar").value = 0;
document.getElementById("status").innerHTML = "Uploading ...";
var selectedFile = evt.target.files[0];
var reader = new FileReader();
reader.onload = function(event) {
var data = event.target.result;
var workbook = XLSX.read(data, {
type: 'binary'
});
workbook.SheetNames.forEach(function(sheetName) {
var XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName], {
defval: ""
});
var json_object = JSON.stringify(XL_row_object);
$.ajax({
type: "POST",
url: "add.php",
data: {
json: JSON.stringify(XL_row_object)
}
});
var percent = (event.loaded / event.total) * 100;
document.getElementById("progressBar").value = Math.round(percent);
})
};
reader.onerror = function(event) {
console.error("File could not be read! Code " + event.target.error.code);
};
reader.readAsBinaryString(selectedFile);
});
<label for="myfile">Select a file:</label>
<form id="upload_form" enctype="multipart/form-data" method="post">
<input type="file" name="fileUploader" id="fileUploader"><br>
<progress id="progressBar" value="0" max="100" style="width:300px;"></progress>
<h3 id="status"></h3>
</form>
PS:我不知道如何放置 xlxs 脚本,所以如果你在这里运行会出错
解决方案
$("#fileUploader").change(async evt => {
const [progressBar, status] = document.querySelectorAll('#progressBar, #status')
progressBar.value = 0
status.innerText = 'Uploading'
const [selectedFile] = evt.target.files;
const data = await selectedFile.arrayBuffer()
const workbook = XLSX.read(new Uint8Array(data), {
type: 'array'
})
workbook.SheetNames.forEach(sheetName => {
const XL_row_object = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName], {
defval: ""
});
const json = JSON.stringify(XL_row_object)
const xhr = new XMLHttpRequest()
xhr.upload.onprogress = evt => {
const percent = (evt.loaded / evt.total) * 100;
progressBar.value = Math.round(percent)
}
xhr.send(json)
})
})
推荐阅读
- ruby-on-rails - 如何使用 ajax 重新加载我的部分评论?
- spring - 我插入一个空列,然后在接下来保存数据
- python - 如何找出函数(的源代码)是否包含对特定模块的方法的调用?
- uwp - Devops:错误 CS0234:命名空间“Windows”中不存在类型或命名空间名称“ApplicationModel”
- node.js - WebSocket 握手期间出错:缺少“连接”标头
- excel - 列值更改时插入表头行
- algorithm - 求两个圆的公共弧的长度
- c# - C# 应用程序 - 需要帮助实现循环
- php - 在 PHP 中确保 Unix 时间
- amazon-web-services - AWS EC2 S3 冲突