ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

MATLAB读取Excel数据全攻略:readtable参数解析与实战避坑指南

2026/9/9 22:23:40 拓冰建站 浏览量
MATLAB读取Excel数据全攻略:readtable参数解析与实战避坑指南 简介面向 MATLAB 初学者的资源包聚焦“从 Excel 读取数据”这一常见需求提供了可直接运行的完整示例适合课程作业、数据分析与科研预研等场景。资源共含 4 个文件压缩后仅 118KB其中 xlsx 文件作为测试数据m 文件为读取主程序txt 与 docx 文档则分别给出运行要点与详细说明结构清晰、便于按需查阅。通过主程序与配套数据的配合读者可以理解 MATLAB 处理 Excel 数据的基本流程包括数据文件的选择方式、脚本执行环境设置以及常见报错的应对思路即使之前没有接触过相关函数也能按文档指引快速跑通从打开示例数据到生成结果一气呵成。该资源已有 1975 人学习体量轻但内容完整尤其适合刚接触 MATLAB、希望在短时间内上手 Excel 数据读取的初学者用于课程实验、课题预研或日常数据处理均可。整体而言这是一份拿来即用、易于扩展的入门范例可帮助读者将方法迁移到自己的数据文件中节省探索时间。 干我们这行的人几乎每天都要面对同一个动作把Excel里那一堆表格数据弄进MATLAB里做分析。这活儿听起来简单但真用起来全是细节。有人还在用xlsread有人干脆复制粘贴更多人是一边百度一边踩坑——读出来的类型不对、中文表头变乱码、大文件卡到怀疑人生。这篇文章我直接把我平时最常用的一套方法完整拆给你看围绕MATLAB读取Excel数据这条主线从函数选型、参数拆解、实操案例到问题排查一条龙讲清楚。无论你是刚接触MATLAB的学生还是常年跟数据打交道的工程师都能在这篇里找到能直接抄走的方案。1. 先选对工具readtable才是当前的主力方案1.1 为什么我不用xlsread了如果你是老用户肯定知道MATLAB早年读取Excel基本全靠xlsread。这个函数确实能干活但用起来有两个明显不舒服的地方一是它返回的输出很别扭要同时拿数值、文本、原始数据三块内容经常要多写两行代码去拼二是处理大文件的时候速度是真的慢要是Excel里再带点格式读一次能急死人。后面MATLAB推出了readtable系列函数我个人强烈建议新代码直接用readtable老代码也尽快迁移过来。我列个对比表你就明白了函数返回类型适用场景推荐程度readtabletable日常数据表读取、混合类型列首选readmatrix数值矩阵整张表都是纯数值数值较多时推荐readcell元胞数组数据非常不规则、需要保留原样兜底方案xlsread多变量输出老代码兼容新代码不建议不推荐readtable最核心的优势是它会自动把Excel中的列识别成MATLAB的table变量数值列归数值列文本列归文本列读取出来就是一个结构完整的表格对象。后面不管是按列名取数、画图、喂给机器学习模型还是用write函数直接写回去做结果汇报都非常顺手。1.2 readtable读取后到底拿到的是什么很多人第一次用readtable不知道读出来这个东西到底是什么。你可以把它理解成一个“带名字的Excel表格”每个列都自动生成了一个变量名有行有列并且在输出窗口里显示得清清楚楚。我随便举个例子。假设有一个Excel文件data.xlsx里面第一行是表头下面跟着几百行数据。执行这一行代码T readtable(data.xlsx);你会在工作区看到T是一个table里面有多个变量variable。如果表头是英文变量名就直接用表头如果表头是中文MATLAB会自动处理成类似Var1、Var2这样的合法变量名。需要用哪列数据可以直接用T.变量名取出来比如plot(T.Timestamp, T.Value)这个体验比传统xlsread那种num(:, 3)按列索引找数字的方式友好太多了。而且table本身就是MATLAB推荐的数据容器后续做数据清洗、分组统计、表格合并都有对应函数省非常多事。2. readtable关键参数详解这些细节能帮你少踩一半的坑2.1 参数速查表只写readtable(文件名)能应对一半场景但真实世界的Excel往往没那么规矩。我经手的文件里至少有一半需要调整参数下面这几个是我实际用到频率最高的建议直接收藏。参数作用示例Sheet指定读取哪个工作表readtable(a.xlsx,Sheet,Sheet2)Range指定读取区域readtable(a.xlsx,Range,A1:D100)ReadVariableNames是否把第一行当变量名readtable(a.xlsx,ReadVariableNames,false)TreatAsMissing哪些文本当作缺失值readtable(a.xlsx,TreatAsMissing,{NA,NULL})NumHeaderLines跳过文件开头的若干行readtable(a.xlsx,NumHeaderLines,3)TextType文本列以string还是cell保存readtable(a.xlsx,TextType,string)这里我重点说几个容易出问题的参数。ReadVariableNames这个参数默认是true也就是把Excel第一行当作列名。但如果你这个文件第一行其实是表标题或者本来就没有表头那么一定要设成false否则第一行数据会被吞进去当列名整张表的数据就全错位了。Range参数适合只读取某个区域的数据。比如我只想读B2到F200这一段就可以写Range,B2:F200。注意如果表里有中文列名或者带合并单元格我往往会配合ReadVariableNames一起设置避免区域错位。TreatAsMissing这个参数很多人不太注意。如果你的Excel里面用NA、NULL、—这类文本表示空值默认读出来会被当成字符串后面一旦做数值计算就各种报错。把这个参数配上让MATLAB直接把这些字符串视为缺失值missing一劳永逸。2.2 中文表头、空值、合并单元格的处理中文表头本身没有问题readtable能正常读取。但如果你希望变量名变成可读性比较强的内容而不是自动命名的Var1、Var2我建议还是表头用英文或者拼音。MATLAB变量名不能以数字开头不能包含空格、横线、百分号等特殊符号所以中文表头反而比一些特殊字符更安全。遇到空单元格readtable的处理逻辑是数值列的空格变成NaN文本列的空格变成missing值之后你可以用rmmissing、fillmissing这类函数统一清洗。这个设计比xlsread返回一个空字符串数组要靠谱得多至少类型是统一的不用再一个个去判空。合并单元格是另一大坑。Excel里合并单元格读进来只有左上角那个单元格是有值的其余都是NaN。如果文件是别人做的我建议你读取前先跟对方确认哪些位置是合并过的要么让对方取消合并要么你在MATLAB里用fillmissing按前面的值填充处理一下。没有谁能在不确认的情况下猜到合并单元格的真实意图。2.3 日期数据要特别小心Excel里的日期是历史遗留的重灾区。如果你在Excel里看到单元格显示2024-03-15它底层存的可能是一串整数比如45366这种“从1900年1月1日起的天数”。readtable读取这种列时有时候会直接返回一个double数组你根本看不出这是日期。我遇到过很多次这种状况代码跑着跑着发现日期横坐标全是几千、几万的数。处理方法很直接用datetime转换T.Date datetime(T.Date, ConvertFrom, excel);如果Excel里存的是文本型日期比如2024/03/15这种字符串那就用T.Date datetime(T.Date, InputFormat, yyyy/MM/dd);日期问题没有万能解因为你得先搞清楚Excel里到底存的是序列号还是文本字符串。我一般拿到文件第一件事就是把日期列画个散点图或者用unique看一眼确认数据类型再动手。3. 实操案例三种最常见的读取场景3.1 场景一批量读取多个Excel文件并纵向合并我经常遇到的情况是一组实验数据被拆成了几十个Excel文件每个文件结构相同只是内容不同。一个个读显然不行就得写循环批量读取。在写代码之前还有个细节dir列出的文件顺序可不一定是文件名排序后的顺序尤其是文件名里有编号的时候可能会变成1、10、11、2这种乱序。如果你在意的就是这个顺序记得先对文件名做排序或者手动构造文件名列表。% 设定文件夹路径 folder D:\exp_data\; files dir(fullfile(folder, *.xlsx)); % 按文件名排序避免1、10、11的问题 [~, idx] sort({files.name}); files files(idx); % 循环读取并纵向合并 allData table(); for i 1:length(files) T readtable(fullfile(folder, files(i).name)); allData [allData; T]; % 或者 vertcat(allData, T) end这段代码跑完所有文件的数据就都拼到一张大表里了。如果每个文件的表头列名不完全一致用竖着拼接的方式会出问题因为table要求两张表的列名和列数一致。遇到这种情况我一般先用intersect或者outerjoin做对齐或者干脆在读取时指定统一的列名。3.2 场景二读取指定区域和跨Sheet数据有些Excel文件特别“豪华”一个文件里十几个Sheet每个Sheet里可能还有几行标题注释真正的数据藏在中间区域。这时候不指定参数直接readtable会把注释也读进来乱成一团。我自己的处理思路是先花两分钟打开Excel文件看一眼结构再定参数。比如每个Sheet的数据都是A10到G200那么可以这样写% 读取Sheet1和Sheet2的指定区域 T1 readtable(multi.xlsx, Sheet, Sheet1, Range, A10:G200); T2 readtable(multi.xlsx, Sheet, Sheet2, Range, A10:G200);注意一点Range里面写的区域是从Excel左上角开始算的如果数据前面有空行这个区域不是自动跳过的你必须明确指定起点。如果Sheet数量很多把Sheet名整理成一个cell数组循环一下也行。还有一种不常见但很实用的需求读取整个工作簿的所有Sheet。可以先获取Sheet列表再逐个读取。获取方式可以用sheetnames(multi.xlsx)这个函数返回一个字符串数组直接循环遍历。3.3 场景三遇到超大型Excel怎么读才不卡Excel文件超过几十MB或者单个Sheet有几十万行数据读起来就非常吃力了。readtable本身做了很多优化但终究要一次性把整个文件往内存里装大文件的内存占用和等待时间都很可观。我的经验是这样的几十万行以内readtable基本还能接受耐心等一会儿就出来了但如果上百万行或者你有大量不同文件要做类似处理就不要再硬扛了。一个很实用的方案是用datastore来处理Excel文件。它是MATLAB里专门用来处理“放不下”的大数据的接口可以分批读取、逐块处理把需要计算的内容一批一批地算完再汇总。基础用法是这样ds datastore(bigdata.xlsx, ReadSize, sheet);ReadSize这个参数可以控制每次读入多少比较灵活。使用datastore的代价是模板列类型可能没有readtable那么智能有些细节需要先预览数据再调整但至少不会因为内存不足闪退。如果你的真实场景是那种动不动几个G的Excel那我建议你先跟业务方沟通让他们导出成csv或者parquet格式效率能差出几十倍。Excel本身就不是为大数据设计的。4. 问题排查与避坑指南4.1 高频报错与对应处理我整理了这几年用MATLAB读Excel遇到的高频报错以及我的处理方案做成了一张速查表希望对你有帮助。报错/现象常见原因处理方式错误使用 detectImportOptions文件被占用、格式不对、不是有效xlsx先确认文件能正常打开路径不要有特殊符号读出来全是NaN数值列中有文本或者单元格是空值用TreatAsMissing或先数据清洗再读日期列变成数字Excel内部存的是日期序列号用datetime转换参考前文的“ConvertFrom”方案中文变量名变成Var1MATLAB会自动标准化变量名读取后手动修改变量名或ReadVariableNames设为false读取特别慢文件太大或Excel中格式复杂改成readmatrix或csv或考虑datastore找不到文件路径写错或当前工作目录不对用绝对路径或先cd到文件目录再读内存不足文件过大一次性载入分块读取或转成其他格式出现报错时第一个动作永远是看工作区的变量大小和类型第二个动作是用whos检查当前数据占了多少内存。这两个信息能帮你快速判断是类型问题还是资源问题。4.2 浮点与文本型数字的坑读Excel时精度问题也很容易被忽略。Excel里的数字是用double精度存储的理论上MATLAB也是double所以大部分情况下没问题。但有一种情况特别坑Excel里有些数字看起来是整数实际存储时被格式化成了一堆小数比如0.1这个数在二进制里是无限循环的。如果你在Excel里用公式算过再读到MATLAB里两个看似相等的数用比较却返回false。我建议在需要精确比较或做索引的时候不要直接用而是用ismembertol做容差比较或者用round先修约到合理的精度。做数据分析不是做账请务必接受浮点误差的存在。还有一种情况是文本型数字。Excel里某些列看起来是数字左边角落有个绿色小三角说明它其实是文本存储的数值。readtable对这种列很可能会当成文本列处理导致后面计算全错。我习惯在读取之后加一步检查如果这列类型是string或cell先尝试用str2double转成数值。T.Value str2double(string(T.Value));4.3 升级老代码的几个提醒如果你手头还有一堆用xlsread写的旧代码我建议有空的时候统一升级一下。但升级不是无脑替换有几个东西需要注意。第一xlsread返回的三元组[num, txt, raw]中很多老代码依赖raw里的原始数据而readtable没有raw这个输出。如果要用原始文本可以先用readcell替代再根据格式转成table。第二老代码里如果大量使用xlswrite写Excel新版本虽然还兼容但官方推荐用writetable或writematrix。我记得某些情况下xlswrite会弹兼容性警告这倒不是错误但有洁癖的人看着确实不舒服。第三升级之前先明确你的MATLAB版本。readtable在R2013b之后才推出后面的版本功能越来越完善比如变量名标准化、日期自动识别等都是逐步加进来的。如果你还在用很老的版本可能得优先考虑升级MATLAB本身而不是纠结函数。第四点也是我最想提醒的不要因为嫌麻烦就长期依赖复制粘贴。短期看似省事长期下来代码无法复现数据量一上来就崩溃追悔莫及。一次性把读取脚本写好后续每次换数据、换文件都直接套用才是正经做事的方式。最后说一个我自己养成的习惯我拿到任何一个未知结构的Excel第一步永远是先预览不是直接读进来就跑。预览的方式很简单用detectImportOptions看一眼MATLAB自己判断的格式用sheetnames看看有哪些Sheet再用readtable抓前几行看字段类型。这个流程加起来不超过十秒钟但能帮你避开绝大多数因为“文件结构跟预期不一样”导致的报错。另外所有涉及Excel的脚本我一律在文件开头加一行清空工作区的代码clear; clc;防止以前的旧变量干扰新读取的数据。很多时候读出来的数据不对根本不是读取的问题而是工作区里还残留着上一个文件的同名变量。做数据工作最怕的不是报错而是用了错误的数据还感觉不到。保持怀疑永远先检查数据本身再怀疑代码。祝各位早点摆脱Excel读取的折腾。本文还有配套的精品资源点击获取