JavaScript解析Excel文件时如何逐行读取单元格值并赋值给变量
问题说明
你目前基于jQuery、JSZip、xlsx库编写了前端代码,实现上传Excel文件后将表格内容解析为JSON格式并输出到文本域的功能,现有完整代码如下:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/jszip.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.8.0/xlsx.js"></script> <script> var ExcelToJSON = function() { this.parseExcel = function(file) { var reader = new FileReader(); reader.onload = function(e) { var data = e.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]); var json_object = JSON.stringify(XL_row_object); console.log(JSON.parse(json_object)); jQuery('#xlx_json').val(json_object); }) }; reader.onerror = function(ex) { console.log(ex); }; reader.readAsBinaryString(file); }; }; function handleFileSelect(evt) { var files = evt.target.files; var xl2json = new ExcelToJSON(); xl2json.parseExcel(files[0]); } </script> <form enctype="multipart/form-data"> <input id="upload" type=file name="files[]"> </form> <textarea class="form-control" rows=35 cols=120 id="xlx_json"></textarea> <script> document.getElementById('upload').addEventListener('change', handleFileSelect, false); </script>
你需要实现逐行读取Excel解析后每一行字段值的功能,逻辑和熟悉的C实现一致,参考C示例代码如下:
void read(string fileName) { // assume int a,b,c are already declared // assuming first row of parsed data is vector for (int i = 0; i < rows.size(); i++) { a = vector[i][0]; b = vector[i][1]; c = vector[i][2]; // code for thing I am doing here(doesnt matter) } }
核心需求是遍历所有行数据,按列索引将每行对应位置的单元格值赋值给预先定义的变量,需要JavaScript侧的对应实现方案。
实现方案
JavaScript完全可以实现和上述C++逻辑完全一致的逐行按索引取值能力,核心是调整xlsx库的解析输出格式:
- 你当前使用的
sheet_to_row_object_array方法会把每行解析为以表头为键的对象,无法直接通过数字索引取列值,只需要更换解析配置,让库直接输出二维数组结构即可,和C++的vector嵌套结构完全对应。 - 具体做法是调用
sheet_to_json方法时传入配置项{header: 1},返回结果的外层数组对应所有行,内层每个数组对应一行的单元格值,列索引从0开始,和你C++里的访问逻辑完全匹配。
修改后的核心解析代码如下:
this.parseExcel = function(file) { var reader = new FileReader(); reader.onload = function(e) { var data = e.target.result; var workbook = XLSX.read(data, { type: 'binary' }); workbook.SheetNames.forEach(function(sheetName) { // 关键配置:header:1 输出二维数组,支持行列数字索引访问 var rowList = XLSX.utils.sheet_to_json(workbook.Sheets[sheetName], { header: 1 }); // 预先定义需要赋值的变量 let a, b, c; // 遍历逻辑和C++完全一致 for (let i = 0; i < rowList.length; i++) { // 可选:跳过空行 if (!rowList[i] || rowList[i].length === 0) continue; // 按列索引取值赋值 a = rowList[i][0]; // 第i行第1列 b = rowList[i][1]; // 第i行第2列 c = rowList[i][2]; // 第i行第3列 // 后续编写你的业务逻辑即可 console.log('当前行取值:', a, b, c); } // 原有输出JSON到文本域的逻辑可以保留 var json_object = JSON.stringify(rowList); jQuery('#xlx_json').val(json_object); }) }; reader.onerror = function(ex) { console.log(ex); }; reader.readAsBinaryString(file); };
补充说明
- 如果Excel第一行是表头不需要参与业务遍历,循环初始值设为
i=1即可,和C++处理方式一致。 - 如果某行列数不足你访问的索引,对应变量会被赋值为
undefined,可以根据业务需要加判空逻辑。 - 如果不想修改原有
sheet_to_row_object_array的解析逻辑,也可以遍历每行对象时通过Object.values(当前行对象)拿到值数组再按索引访问,但这种方式依赖对象键的遍历顺序,稳定性不如直接输出二维数组的方案,优先推荐前者。
内容的提问来源于stack exchange,提问作者Dfhfd
相关产品推荐
相关产品推荐

