一、原理

利用js中FileReader对象读取文件(FileReader是一种异步读取文件机制)

1. 创建fileReader对象
2. fileReader对象 读取不同文件调用的方法不同,所以要创建正则判断读取文件类型

FileReader提供了如下方法:

1、readAsArrayBuffer(file)按字节读取文件内容,结果用ArrayBuffer对象表示。

该方法读取文件后,会在内存中创建一个ArrayBuffer对象(二进制缓冲区),将二进制数据存放在其中。通过此方式,可以直接在网络中传输二进制内容。

  var reader = new FileReader();reader.readAsArrayBuffer(file);reader.onload = function () {console.log(this.result);console.log(new Blob([this.result]))}

2、readAsBinaryString(file)按字节读取文件内容,结果为文件的二进制串

该方法会读取指定的 Blob 或 File 对象,当读取完成的时候,readyState 状态会变成DONE(已完成),并触发 loadend (en-US) 事件,同时 result 属性将包含所读取文件原始二进制格式。

3、readAsDataURL(file)读取文件内容,结果用data:url的字符串形式表示

该方法会读取指定的 Blob 或 File 对象。并生成data URl(base64编码)。

4、readAsText(file,encoding)按字符读取文件内容,结果用字符串形式表示

该方法可以用来读取文本文件,这个文件有两个参数,第一个参数用来读取File对象或Blob对象。第二个参数用来指定文件的编码,这是个可选参数,默认值为国际通用的UTF-8编码格式。

5、abort():终止文件读取操作。

该方法可以终止任何操作,在读取大文件的时候,这个方法能派上用场。

readAsText读取TXT文本文件乱码问题:

之前有过用默认编码方式进行读取TXT文件,会出现中文乱码,把reader.readAsText(file,'编码')的编码方式改为'gb2312’就不乱码了。

FileReader事件:

onloadstart:读取文件开始时触发
onprogress:读取过程中触发,会返还本次读取文件的最大字节数和已经读取完毕的字节数,可以用来做进度条
onabort:在读取中断时触发
onerror:在读取文件失败时触发
onload:在读取完成时触发
onloadend:读取结束后触发,不论成功还是失败都会触发,触发时机在onload之后

提示:因为FileReader的操作都是异步的,所以对有些需要同步获取数据的不能实现。可以用promise队列来解决异步问题。

二、案例

<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>上传文件,导出excel文件</title>
</head>
<body><h1 style="font-size: 20px; color: red;">使用a标签方式将json导出为csv文件</h1><input type="file" id="onloadFile"/><button onclick='tableToExcel()'>导出</button><script>let dateArr = []; // 日期数组let xx = []; // json数据数组// 正则表达式var reg = /(.csv|.txt|.log)$/m;var reg2 = /(.mp4)$/m;var reg3 = /(.jp[e]?g|.png)$/m;var reg4 = /(.mp3)$/m;// 获取上传标签对象const input = document.getElementById('onloadFile')input.addEventListener('change', e => {// 创建fileReader对象const reader = new FileReader();// input.files[0] 为第一个文件const file = e.target.files[0]; console.log(file.name)// 如果读取文本文件类型需要使用file对象中的readAsTest方法,并设置文字类型为utf-8类型if(reg.test(file.name)) {reader.readAsText(input.files[0], 'utf8')}// 如果读取图片视频音频这种流体文件,需要调用file对象的readAsDataUrl,该方法会将内容转换为base64类型if(reg2.test(file.name) || reg3.test(file.name) || reg4.test(file.name)) {reader.readAsDataURL(input.files[0])}// 读取文件对象reader.onload = e => {// 如果是文本对象if(reg.test(file.name)) {// e.target.result  为获取结果const xxx = e.target.result;console.log(e.target.result)// 处理获取到的文本信息dateArr = xxx.match(/^(2023)\S*/igm)console.log(dateArr)let xx2 = xxx.replace(/^(2023).*(HttpUtils)([^:]*):/igm, ',')let xx3 = xx2.replace(/^,/g, ' ')let xx4 = xx3.replace(/(\/n)/g, '')xx = JSON.parse('['+ xx4 +']')console.log(xx)}}})// 导出excel文件的方法const tableToExcel = () => {// 要导出的json数据const jsonData = xx// 列标题,逗号隔开,每一个逗号就是隔开一个单元格let str = `姓名,问题,答案,日期\n`;// 增加\t为了不让表格显示科学计数法或者其他格式for(let i = 0 ; i < jsonData.length ; i++ ){str += `${(i+1) + ' 、' + jsonData[i].user_id+'\t'},`;for(let j = 0; j < jsonData[i].history_turns.length; j++) {if(j !== 0){str+=`${''+'\t'},`}for(const key in jsonData[i].history_turns[j]) {str += `${jsonData[i].history_turns[j][key] + '\t'},`;   }if(j !== 0) {str+=`${''+'\t'},`} else {str += new Date(dateArr[i]).toLocaleString()+'\t'}str+='\n';}str+='\n';}// encodeURIComponent解决中文乱码const uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str);// 通过创建a标签实现const link = document.createElement("a");link.href = uri;// 对下载的文件命名link.download =  "用户数据表"+new Date().toLocaleDateString()+".csv";link.click();}</script>
</body>
</html>

js读取本地文本文件,并生成Excel文件相关推荐

  1. python xlwt模块生成excel文件并写入数据 xlrd读取数据

    python中一般使用 xlwt (excel write)来生成Excel文件(可以控制单元格格式),用 xlrd 来读取Excel文件,用xlrd读取excel是不能对其进行操作的. 1.xlrd ...

  2. JS学习--用JS读取本地文件

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  3. Vue.js读取本地json文件并分页显示

    Vue.js读取本地json文件并分页显示 1.功能实现 通过axios异步加载技术读取本地的json文件内容,并通过vue.js处理数据在h5页面分页显示(这里以3行数据分页) 2.student. ...

  4. 利用html5读取本地文本文件及图片文件

    利用html5可以对本地的如文本.图片等文件读取操作,html5定义了一个file对象类型来表示文件,每个file对象对应一个文件.file对象有3个属性:name.size.type.name是不包 ...

  5. html 读取本地xml文件,JS读取本地的XML文件

    要想让JS读取本地的XML代码,得具备这样的条件,一般情况下,需要一个JS文件,一个XML文件,最后这两个文件就放在相同的路径下,这样方便调用. 一.XML文件代码示例 大众计算机学习网 www.dz ...

  6. JS读取本地CSV文件数据

    JS读取本地CSV文件数据 文件中的部分数据如图 需求是需要提取出文件的数据 使用到的模块是 Papa Parse 1. 依赖安装 yarn add papaparse papaparse的基本使用可 ...

  7. node.js生成Excel文件 使用node-xlsx

    node.js生成Excel文件 简介 尝试使用excel-export以及excel-export-next没有成功,转为使用node-xlsx成功生成Excel 从接到需求开始查询可用的库 好多博 ...

  8. python xlwt写入excel_python xlwt模块生成excel文件并写入数据 xlrd读取数据

    python中一般使用 xlwt (excel write)来生成Excel文件(可以控制单元格格式),用 xlrd 来读取Excel文件,用xlrd读取excel是不能对其进行操作的. 1.xlrd ...

  9. js-xlsx js处理excel 通过sheetJSON生成Excel文件

    安装 npm install xlsx 使用 官网说明 import XLSX from 'xlsx' const workbook = XLSX.readFile('someExcel.xlsx', ...

最新文章

  1. 天津全国计算机考试报名时间2015,天津2020年计算机等级考试报名时间汇总
  2. Python设计模式-适配器模式
  3. Fedora 32 因 Bug 将推迟发布
  4. A summary of the post “How I explained OOD to my wife
  5. Spring IOC-BeanFactory的继承体系结构
  6. 在Word XP中也能插入国际音标、拼音
  7. Spring框架(二) ---- bean的歧义性
  8. Intellij Java注释模板
  9. java中的四个跳转语句_Java中的流程控制语句 (基础篇四)
  10. MOSFET(三):电源缓启动
  11. 阿里云CDN+OSS完成图片加速
  12. 最优化理论与方法(袁亚湘 孙文瑜)笔记(二)
  13. 「无捆绑不锁页」极度纯净win10 64位专业版下载地址
  14. 购物是女人的天堂,男人的地狱,不了解清楚万一以后被坑了,男人躲哪里后悔去,做这样一个web购物网站,买了货死活回不来,让双十一的女人们过过瘾
  15. ActiveMQ学习笔记(4)----JMS的API结构和开发步骤
  16. 黑暗城堡(dijkstra算法)
  17. C++从txt文本中输入和读取字符串
  18. Android 查询设备信息c/c++常用方法
  19. 一个小白对接电子面单的哪些坑?
  20. html商品分类列表页面,仿京东商城系列7------商品分类页面

热门文章

  1. apk开发教程!安卓资深架构师分享学习经验及总结,技术详细介绍
  2. 十多个巨头App上可跑智能小程序了
  3. 动态规划问题(凑硬币)理解总结
  4. android 数组赋值字符串_字符串数组的赋值
  5. 多项式求和(C语言)
  6. Java读写Excel之HSSFWorkbook、XSSFWorkbook、Workbook
  7. 大连将在东京建设软件园
  8. keycloak 验证 token
  9. 简单理解 tr069协议
  10. uclinux开发概述