Matlab R2017b中readtable读取Excel缺失最后一列的问题及解决
MATLAB R2017b
readtable 读取Excel时最后一列丢失的原因与解决办法 问题原因分析
从你的示例数据和读取结果来看,核心问题出在MATLAB R2017b版本中readtable的自动数据类型检测逻辑上:
- 默认情况下,
readtable会通过表格的前8行数据来判断每一列的数据类型。如果某一列的前8行都是空值,它会默认这一列没有有效数据,直接跳过读取。 - 你的示例里前两行的
IbXch列是空的,第三行才有值,刚好触发了这个检测规则,导致最后一列被忽略。
另外还要注意你代码里的这一行:
result(:,end)=[]; % append empty list in case no data
这行代码是主动删除结果的最后一列,就算后续解决了读取问题,这行也会把刚读到的最后一列删掉,建议先注释掉再测试。
解决方案
下面提供几种可行的解决办法,你可以根据自己的需求选择:
1. 手动指定所有列的数据类型
通过'VariableTypes'参数强制指定每一列的数据类型,让readtable必须读取所有列,不再依赖自动检测。比如你的表格有11列,对应设置类型如下(根据实际数据调整类型):
function assetslist = loadAssets() xlFileDetails = 'mypath'; xlsheet = 'mysheet'; % 按列顺序指定数据类型,长度要和Excel列数一致 varTypes = {'double','string','string','string','double','string','string','string','string','string','string'}; result = readtable(xlFileDetails,'Sheet',xlsheet,... 'ReadRowNames',true,'ReadVariableNames',true,... 'VariableTypes',varTypes); % result(:,end)=[]; % 注释掉这行,避免删除最后一列 assetslist = result; end
2. 调整类型检测的行数上限
用'MaxRowsForTypeDetection'参数,让readtable检测所有行的数据来判断列类型,而不是只看前8行。可以先获取表格总行数,再设置这个参数:
function assetslist = loadAssets() xlFileDetails = 'mypath'; xlsheet = 'mysheet'; % 先获取Excel表格的总行数 [~,~,rawData] = xlsread(xlFileDetails, xlsheet); totalRows = size(rawData, 1); result = readtable(xlFileDetails,'Sheet',xlsheet,... 'ReadRowNames',true,'ReadVariableNames',true,... 'MaxRowsForTypeDetection',totalRows); % result(:,end)=[]; % 注释掉这行 assetslist = result; end
3. 检查Excel文件格式
先确认Excel里的最后一列没有被隐藏,且该列所有单元格的格式统一(比如设为「常规」或「文本」格式),避免因单元格格式异常导致readtable识别错误。
内容的提问来源于stack exchange,提问作者pashute
相关产品推荐
相关产品推荐

