「趣学前端」实现读取excel文件内容小功能

简介: 用技术实现梦想,用梦想打开前端技术之门。分享一下读取excel文件内容小功能是如何实现的。

前言

我们在做业务需求的时候,会遇到展示表格的页面,如果只有一个表格,我们可以直接把内容填充到我们的代码中,有时候业务需要不同的分类展示不同的表格,而表格内容是静态的,这类需求,我之前的处理是写个本地json文件,每次新增让产品直接把数据录到json文件中。有时候业务会把Excel表格发给我,我自己进行录入。闲暇的时候我在想,可否通过解析Excel文件直接拿到内容呢?


于是我进行了后面的尝试。


Excel文件的读取

目标功能

我想实现的功能主要有几部分:读取Excel文件,识别多个工作表,每个工作表按行将数据放入数组中。最终解析输入如下:

Excel文件数据

两个工作表:鞋子和裤子

image.jpeg


image.jpeg

读取的完整数据

{
"fileName": "测试读取.xlsx",
"list": [
        {
"sheetName": "鞋子",
"list": [
                {
"goodName": "鞋子A版",
"size": "37",
"color": "白色"                },
                {
"goodName": "鞋子B版",
"size": "38",
"color": "米色"                },
                {
"goodName": "鞋子C版",
"size": "38",
"color": "黑色"                }
            ]
        },
        {
"sheetName": "裤子",
"list": [
                {
"goodName": "裤子A版",
"size": "S",
"color": "白色"                },
                {
"goodName": "裤子B版",
"size": "M",
"color": "黑色"                },
                {
"goodName": "裤子C版",
"size": "L",
"color": "红色"                },
                {
"goodName": "裤子D版",
"size": "XL",
"color": "紫色"                }
            ]
        }
    ]
}


下面我将功能进行细分。

读取Excel文件

解析插件

插件:xlsx.core.min.js

官网:https://github.com/sheetjs/sheetjs


读取方法

FileReader可以读取Excel文件内容,它的详细知识点可以查看MDN

我这里使用的FileReader.readAsBinaryString(file) :开始读取指定的Blob中的内容。一旦完成,result属性中将包含所读取文件的原始二进制数据。


HTML部分

包括文件上传和数据内容展示两部分,其中文件上传有限制文件类型必须是.xls或.xlsx后缀的。

<!DOCTYPEhtml><html><head><title>读取excel文件解析内容</title><scriptsrc="https://cdn.bootcss.com/xlsx/0.11.5/xlsx.core.min.js"></script><style>      .warp {
width: 100%;
display: flex;
justify-content: flex-start;
margin-top: 10px;
      }
span {
display: block;
      }
textarea {
width: 80%;
display: block;
      }
      .file {
margin-bottom: 15px;
      }
      .tip {
margin-bottom: 15px;
      }
</style></head><body><h3class="tip">目前只能解析简单的纵向列表数据,支持多个工作表</h3><divclass="file"><inputtype="file"accept=".xls,.xlsx"onchange="uploadFile(this)"id="myFile"/></div><divclass="warp"><span>内容展示:</span><textareaid="content"rows="30"></textarea></div></body></html>

上传操作方法

先判断上传文件是否为空,如果不为空才进行下一步。

/** * 文件上传操作 * @param {Element} obj 选择的文件元素 * @return {void} 无 */functionuploadFile(obj) {
//导入if (!obj.files) {
return;
  }
letf=obj.files[0];
readExcelFile(obj, f);
}


文件读取

XLSX为sheetjs插件提供的方法

  • XLSX.read(data, read_opts):尝试解析data
  • workbook.SheetNames 是工作簿中工作表的有序列表;
  • wb.Sheets[sheetname] 返回一个代表工作表的对象;
  • XLSX.utils.sheet_to_json生成不同类型的 JS 对象。
/** @name 读取完成的数据 */varjsonContent;
/** * Excel文件处理方法 * @param {Element} obj 选择的文件元素 * @param {File} f 文件对象 * @return {void} 无 */functionreadExcelFile(obj, f) {
varreader=newFileReader();
reader.onload=function (e) {
vardata=e.target.result;
jsonContent=XLSX.read(data, {
type: 'binary',
    });
/** @name 工作簿中工作表的有序列表 */constsheetNamesList=jsonContent.SheetNames;
constsheetsList= [];
sheetNamesList.map(sheetItem=> {
//jsonContent.Sheets[Sheet名]获取该Sheet的数据constsheetItemData=jsonContent.Sheets[sheetItem];
sheetsList.push({
sheetName: sheetItem,
list: XLSX.utils.sheet_to_json(sheetItemData), // 数据转成json格式      });
    });
pageShow(sheetsList, f);
  };
reader.readAsBinaryString(f);
}


重组Excel文件数据

  • 现在的数据key为工作表表头的值,是中文名称,可以根据定义的变量名进行数据重组,所以我加了一个变量枚举renameObj。注:如果多个工作表的表头不一致,可重置renameObj对象,并改造resetTableData方法内的代码即可;
  • resetTableData方法会将数据的所有key替换成枚举中的变量值;
  • 变量arrayData为最终的处理之后的Excel数据,这时已经将Excel文件中的数据处理成了方便前端在页面回显的数据。
/** * 重组key-value * @param {Array} list 需要操作的数组 * @param {Object} renameObj 重命名变量对象 * @return {Array} 合并成的新数组 */functionresetTableData(list, renameObj) {
letnewList= [].concat(list);
newList.map(item=> {
for (letkinitem) {
constrenameKey=renameObj[k];
item[renameKey] =item[k];
deleteitem[k];
    }
  });
returnnewList; // 最终输出}
/** * 数据回显 * @param {Array} list 数据数组对象 * @param {File} f 文件对象 * @return {void} 无 */functionpageShow(list, f) {
letjsonData='';
/** @name 列表展示的变量名枚举 */constrenameObj= {
商品名: 'goodName',
大小: 'size',
颜色: 'color',
  };
letnewList= [].concat(list);
newList.map(item=> {
item.list=resetTableData(item.list, renameObj);
  });
/** @name 最终的数据 */letarrayData= {
fileName: f.name,
list: [].concat(newList),
  };
constcontent=document.getElementById('content');
jsonData=JSON.stringify(arrayData, null, 4);
content.innerHTML=jsonData;
}


浏览器展示

image.jpeg

完整代码

<!DOCTYPEhtml><html><head><title>读取excel文件解析内容</title><scriptsrc="https://cdn.bootcss.com/xlsx/0.11.5/xlsx.core.min.js"></script><style>      .warp {
width: 100%;
display: flex;
justify-content: flex-start;
margin-top: 10px;
      }
span {
display: block;
      }
textarea {
width: 80%;
display: block;
      }
      .file {
margin-bottom: 15px;
      }
      .tip {
margin-bottom: 15px;
      }
</style></head><body><h3class="tip">目前只能解析简单的纵向列表数据,支持多个工作表</h3><divclass="file"><inputtype="file"accept=".xls,.xlsx"onchange="uploadFile(this)"id="myFile"/></div><divclass="warp"><span>内容展示:</span><textareaid="content"rows="30"></textarea></div></body><scripttype="text/javascript">/**     *FileReader读取方法:readAsBinaryString(file):开始读取指定的Blob中的内容。一旦完成,result属性中将包含所读取文件的原始二进制数据。     *@return {void} 无     **//** @name 读取完成的数据 */varjsonContent;
/**     * 文件上传操作     * @param {Element} obj 选择的文件元素     * @return {void} 无     */functionuploadFile(obj) {
//导入if (!obj.files) {
return;
      }
letf=obj.files[0];
readExcelFile(obj, f);
    }
/**     * Excel文件处理方法     * @param {Element} obj 选择的文件元素     * @param {File} f 文件对象     * @return {void} 无     */functionreadExcelFile(obj, f) {
varreader=newFileReader();
reader.onload=function (e) {
vardata=e.target.result;
jsonContent=XLSX.read(data, {
type: 'binary',
        });
/** @name 工作簿中工作表的有序列表 */constsheetNamesList=jsonContent.SheetNames;
constsheetsList= [];
sheetNamesList.map(sheetItem=> {
//jsonContent.Sheets[Sheet名]获取该Sheet的数据constsheetItemData=jsonContent.Sheets[sheetItem];
sheetsList.push({
sheetName: sheetItem,
list: XLSX.utils.sheet_to_json(sheetItemData), // 数据转成json格式          });
        });
pageShow(sheetsList, f);
      };
reader.readAsBinaryString(f);
    }
/**     * 重组key-value     * @param {Array} list 需要操作的数组     * @param {Object} renameObj 重命名变量对象     * @return {Array} 合并成的新数组     */functionresetTableData(list, renameObj) {
letnewList= [].concat(list);
newList.map(item=> {
for (letkinitem) {
constrenameKey=renameObj[k];
item[renameKey] =item[k];
deleteitem[k];
        }
      });
returnnewList; // 最终输出    }
/**     * 数据回显     * @param {Array} list 数据数组对象     * @param {File} f 文件对象     * @return {void} 无     */functionpageShow(list, f) {
letjsonData='';
/** @name 列表展示的变量名枚举 */constrenameObj= {
商品名: 'goodName',
大小: 'size',
颜色: 'color',
      };
letnewList= [].concat(list);
newList.map(item=> {
item.list=resetTableData(item.list, renameObj);
      });
/** @name 最终的数据 */letarrayData= {
fileName: f.name,
list: [].concat(newList),
      };
constcontent=document.getElementById('content');
jsonData=JSON.stringify(arrayData, null, 4);
content.innerHTML=jsonData;
    }
</script></html>


总结

日常开发中,如果觉得哪些不方便、不顺手的,不妨写个小工具协助开发,避免简单的重复的工作占用我们过多的时间。

目录
相关文章
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
691 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
9月前
|
Python
Excel中如何批量重命名工作表与将每个工作表导出到单独Excel文件
本文介绍了如何在Excel中使用VBA批量重命名工作表、根据单元格内容修改颜色,以及将工作表导出为独立文件的方法。同时提供了Python实现导出工作表的代码示例,适用于自动化处理Excel文档。
|
存储 前端开发 JavaScript
调用DeepSeek API增强版纯前端实现方案,支持文件上传和内容解析功能
本方案基于DeepSeek API增强版,提供纯前端实现的文件上传与内容解析功能。通过HTML和JavaScript,用户可选择文件并调用API完成上传及解析操作。方案支持多种文件格式(如PDF、TXT、DOCX),具备简化架构、提高响应速度和增强安全性等优势。示例代码展示了文件上传、内容解析及结果展示的完整流程,适合快速构建高效Web应用。开发者可根据需求扩展功能,满足多样化场景要求。
3712 64
|
Dart 前端开发
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
515 75
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
11月前
|
人工智能 算法 安全
使用CodeBuddy实现批量转换PPT、Excel、Word为PDF文件工具
通过 CodeBuddy 实现本地批量转换工具,让复杂的文档处理需求转化为 “需求描述→代码生成→一键运行” 的极简流程,真正实现 “技术为效率服务” 的目标。感兴趣的快来体验下把
716 10
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
3659 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
文字识别 Serverless 开发工具
【全自动改PDF名】批量OCR识别提取PDF自定义指定区域内容保存到 Excel 以及根据PDF文件内容的标题来批量重命名
学校和教育机构常需处理成绩单、报名表等PDF文件。通过OCR技术,可自动提取学生信息并录入Excel,便于统计分析和存档管理。本文介绍使用阿里云服务实现批量OCR识别、内容提取、重命名及导出表格的完整步骤,包括开通相关服务、编写代码、部署函数计算和设置自动化触发器等。提供Python示例代码和详细操作指南,帮助用户高效处理PDF文件。 链接: - 百度网盘:[链接](https://pan.baidu.com/s/1mWsg7mDZq2pZ8xdKzdn5Hg?pwd=8866) - 腾讯网盘:[链接](https://share.weiyun.com/a77jklXK)
2252 5
|
Python
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分到不同的工作表中。本文通过一个示例代码展示了如何生成一个包含总成绩表和三个班级表的Excel文件。代码首先创建了一个包含学生姓名、班级和各科成绩的数据框,然后按班级分组,将每个班级的数据分别写入不同的工作表。最后,生成的Excel文件将包含四个工作表,分别为总成绩表和三个班级的成绩表。
342 6
按条件将Excel文件拆分到不同的工作表
|
数据可视化 数据处理 Python
使用Pandas实现Excel中的数据透视表功能
本文介绍了如何使用Python的Pandas库实现Excel中的数据透视表功能,包括环境准备、创建模拟销售数据、代码实现及输出等步骤。通过具体示例展示了按地区和销售员汇总销售额的不同方法,如求和、平均值、最大值等,帮助读者掌握Pandas在数据处理上的强大能力。
587 12

热门文章

最新文章

下一篇
开通oss服务