首页 > 其他分享 >「趣学前端」实现读取excel文件内容小功能

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

时间:2023-02-03 14:00:38浏览次数:57  
标签:文件 obj 读取 excel list 趣学 param item

前言

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


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


Excel文件的读取

目标功能

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

Excel文件数据

两个工作表:鞋子和裤子

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

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

读取的完整数据

{
"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后缀的。

<!DOCTYPE html>
<html>
<head>
<title>读取excel文件解析内容</title>
<script src="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>
<h3 class="tip">目前只能解析简单的纵向列表数据,支持多个工作表</h3>
<div class="file">
<input type="file" accept=".xls,.xlsx" onchange="uploadFile(this)" id="myFile" />
</div>
<div class="warp">
<span>内容展示:</span>
<textarea id="content" rows="30"></textarea>
</div>
</body>
</html>

上传操作方法

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

/**
* 文件上传操作
* @param {Element} obj 选择的文件元素
* @return {void} 无
*/
function uploadFile(obj) {
//导入
if (!obj.files) {
return;
}
let f = 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 读取完成的数据 */
var jsonContent;

/**
* Excel文件处理方法
* @param {Element} obj 选择的文件元素
* @param {File} f 文件对象
* @return {void} 无
*/
function readExcelFile(obj, f) {
var reader = new FileReader();
reader.onload = function (e) {
var data = e.target.result;
jsonContent = XLSX.read(data, {
type: 'binary',
});
/** @name 工作簿中工作表的有序列表 */
const sheetNamesList = jsonContent.SheetNames;
const sheetsList = [];
sheetNamesList.map(sheetItem => {
//jsonContent.Sheets[Sheet名]获取该Sheet的数据
const sheetItemData = 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} 合并成的新数组
*/
function resetTableData(list, renameObj) {
let newList = [].concat(list);
newList.map(item => {
for (let k in item) {
const renameKey = renameObj[k];
item[renameKey] = item[k];
delete item[k];
}
});
return newList; // 最终输出
}

/**
* 数据回显
* @param {Array} list 数据数组对象
* @param {File} f 文件对象
* @return {void} 无
*/
function pageShow(list, f) {
let jsonData = '';

/** @name 列表展示的变量名枚举 */
const renameObj = {
商品名: 'goodName',
大小: 'size',
颜色: 'color',
};
let newList = [].concat(list);
newList.map(item => {
item.list = resetTableData(item.list, renameObj);
});
/** @name 最终的数据 */
let arrayData = {
fileName: f.name,
list: [].concat(newList),
};
const content = document.getElementById('content');
jsonData = JSON.stringify(arrayData, null, 4);
content.innerHTML = jsonData;
}


浏览器展示

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

完整代码

<!DOCTYPE html>
<html>
<head>
<title>读取excel文件解析内容</title>
<script src="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>
<h3 class="tip">目前只能解析简单的纵向列表数据,支持多个工作表</h3>
<div class="file">
<input type="file" accept=".xls,.xlsx" onchange="uploadFile(this)" id="myFile" />
</div>
<div class="warp">
<span>内容展示:</span>
<textarea id="content" rows="30"></textarea>
</div>
</body>

<script type="text/javascript">
/**
*FileReader读取方法:readAsBinaryString(file):开始读取指定的Blob中的内容。一旦完成,result属性中将包含所读取文件的原始二进制数据。
*@return {void} 无
**/

/** @name 读取完成的数据 */
var jsonContent;

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

/**
* Excel文件处理方法
* @param {Element} obj 选择的文件元素
* @param {File} f 文件对象
* @return {void} 无
*/
function readExcelFile(obj, f) {
var reader = new FileReader();
reader.onload = function (e) {
var data = e.target.result;
jsonContent = XLSX.read(data, {
type: 'binary',
});
/** @name 工作簿中工作表的有序列表 */
const sheetNamesList = jsonContent.SheetNames;
const sheetsList = [];
sheetNamesList.map(sheetItem => {
//jsonContent.Sheets[Sheet名]获取该Sheet的数据
const sheetItemData = 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} 合并成的新数组
*/
function resetTableData(list, renameObj) {
let newList = [].concat(list);
newList.map(item => {
for (let k in item) {
const renameKey = renameObj[k];
item[renameKey] = item[k];
delete item[k];
}
});
return newList; // 最终输出
}

/**
* 数据回显
* @param {Array} list 数据数组对象
* @param {File} f 文件对象
* @return {void} 无
*/
function pageShow(list, f) {
let jsonData = '';
/** @name 列表展示的变量名枚举 */
const renameObj = {
商品名: 'goodName',
大小: 'size',
颜色: 'color',
};
let newList = [].concat(list);
newList.map(item => {
item.list = resetTableData(item.list, renameObj);
});
/** @name 最终的数据 */
let arrayData = {
fileName: f.name,
list: [].concat(newList),
};
const content = document.getElementById('content');
jsonData = JSON.stringify(arrayData, null, 4);
content.innerHTML = jsonData;
}
</script>
</html>


总结

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

标签:文件,obj,读取,excel,list,趣学,param,item
From: https://blog.51cto.com/u_15838863/6035816

相关文章

  • Excel函数学习
    1.单条件求和=SUMIF(条件区域,求和条件,实际求和区域)2.多条件求和=SUMIFS(需要求和区域,条件区域1,求和条件1,条件区域2,求和条件2,......)3.单元格所在行位置=ROW(单......
  • python pandas设置excel列宽、缩放比例
    pandas设置excel列宽、缩放比例文件存在file_path='保存的文件路径'sheet_name='数据在Excel的sheet名'result=pd.DataFrame()withpd.ExcelWriter(file_path,......
  • python mysql直接导出excel文件
    importpymysqlimportxlwt#数据库连接对象conn=pymysql.connect(host='124.71.72.144',port=3306,user='root',password="gClUjjCh2tozZY23o",db="pay",chars......
  • 从xml读取gps数据获取经纬高
         #!/usr/bin/python#-*-coding:UTF-8-*-fromxml.dom.minidomimportparseimportxml.dom.minidom"""数据输入xmlname文件名字no......
  • geotools读取shp文件中文乱码???
    在读取shp文件之前,先要手动调用一下ShapefileDataStore的setStringCharset方法即可dataStore.setStringCharset(Charset.forName("UTF-8"));参考:https://www.osgeo.cn/p......
  • Microsoft Office Excel 打开部分文件程序崩溃
    Win10系统在最近一次系统更新后,Excel打开一些文件后,Excel软件会直接奔溃。查了很久没有查到原因,最后准备卸载重装。在卸载的时候发现安装程序里面存在Microsoft365。果断......
  • EXCEL的各种“空”的区别:blank,““ , 0 ,以及 VBA里的各种空值:empty,null,nothing 等
    原文链接:https://blog.csdn.net/xuemanqianshan/article/details/111415364 1EXCEL里的几种空值:blank,“”,01.1EXCEL里,一般有两种空值:blank,“”1.1.1空值blank空值:b......
  • 在使用cn.hutool.poi.excel,读取数据读不出String的问题
    今天想用cn.hutool.poi.excel包读取Excel数据,就一列数据,我本想用ExcelReader的readAll方法,并传入参数设置类的类型=String.class,发现没有读出数据且没有报错。经过一路翻......
  • python pandas.DataFrame 编写的Excel分割工具
    importpandasaspdfrompandasimportDataFrameasDFimportosclassSplitExcel(object): """ 分割任意的Excel文件,根据指定的列对文件进行分割,并存储到指......
  • PHP读取excel(5)
    如果数据量很大的时候,就需要用PHPExcel迭代器逐行读取,具体代码如下:<?phpheader("Content-Type:text/html;charset=utf-8");//引入读取excel类文件require"./PHPExcel/PHPEx......