转自http://blog.sina.com.cn/s/blog_6aaea1760100r08x.html
总结出以下几种MATLAB读写excel数据的情况:
1、读取当前路径下的excel表格,存储数据,文字字符
[number,txt,raw]=xlsread(‘file.xls’);
其中:file为所要读取的excel;
number中含有file.xls中的数据,不包含表头,如果遇到有非数字的字符则为NaN;
txt中含有file.xls中的所有非数字字符,包含表头,遇见数字则为空字符;
raw中存储的是file.xls中的原始数据,不做任何处理,也包含表头。
注1:输入参数中.xls可以不写;输出参数可以缺省,只有一个参数只取数字,两个含字符;
注2:文件名和表格中的内容均允许有汉字的存在。
例1:当前路径下有名为0520的excel表格。其中内容如下图1:
在MATLAB中执行命令:[number,txt,raw]=xlsread('0520')
结果如下:
2、读取指定路径下的excel表格,存储数据,文字字符
[number,txt,raw]=xlsread(‘address’);
其中:address为所要读取的excel表格的地址;
number中含有表格中的数据,不包含表头,如果遇到有非数字的字符则为NaN;
txt中含有表格中的所有非数字字符,包含表头,遇见数字则为空字符;
raw中存储的是表格中的原始数据,不做任何处理,也包含表头。
例2:[number,txt,raw]=xlsread('D:\My Documents\MATLAB\shudu\0520')
结果如上面图2。
注1:本例中的表格将英文改成汉字,验证效果是一样的,MATLAB读表允许汉字存在。
3、读取指定表格指定区域的内容
[number,txt,raw]=xlsread('file.xls or address','Sheet','range')
其中:‘Sheet1’是指定页数的表格,可以是自命名,如‘初级题40’;
‘a1:c3’是读取的范围,是从a1到c3的矩形区域;
其他输入输出参数与前面一致。
注1:里面的‘Sheet1’和‘sheet1’,‘a1:c3’和‘A1:C3’效果等同,即不区分大小写
例3:[number,txt,raw]=xlsread('0520','Sheet1','a1:c3')
4、读取区域含有空白或者字符,需要用特定数值替代
对于所读取的数据有时达不到自己的需求,比如,表格中有空白位置,读出来就是“NaN”,例如本人所要做的数独解题,题目中只有部分位置是非零数字,其余为空白待填,这时xlsread命令会直接将表格中的空白位置用“NaN”替代,如下图4(1):
A= xlsread('数独题目.xls','a121:i129')
由上面结果可知,“NaN”替代了所有空白位置。但这样有时并不适合进行MATLAB运算,比如填数独就是。这时需要将这些空白位置用特定的值替代,这里我们可以用以下命令将空白位置全部赋成0
A(isnan(A))=0,
结果如下图4(2):
图4(2)
注1:isnan函数判断是否为nan,是返回1,否则返回0。
5、动态区域读取
前面所读取的excel区域是固定的,比如是‘Sheet1’的‘A1:C3’,但可能会碰到区域不是固定的,比如我要随机选取数独题,事先无法得知选哪个题,也就无法确定范围,这时就碰到如何读取动态区域的问题。方法其实和前面类似,关键是获取动态的字符串即可。如果需要获取动态区域的数值,需要用到字符串转换将数字转成字符串。
例5:数独难度有“初级”、“高级”、“专家级”和“骨灰级”,放在excel表“数独题目”中,每个级别有40个题目。先让用户选取难度即被,再随机选取1到40题中的一题。
步骤如下:
Step1:选取难度,可以用menu命令制作选取菜单
lever = menu('select a lever','primary','senior','experts','hardcore');
switch lever
case 1
sheet='初级题40';
disp('you choose lever: primary!');
case 2
sheet='高级题40';
disp('you choose lever: senior! ');
case 3
sheet='专家题40';
disp('you choose lever: experts! ');
case 4
sheet='骨灰题40';
disp('you choose lever: hardcore! ');
end
Step2:随机选题,确定题号和起始位置
n=randint(1,1,[1,40]); %%%%选取1到40中的随机数一个
fprintf('question number is %d\n',n)
start=(n-1)*10+1; %%%%确定起始位置
Step3:获取区域的动态字符串,使用字符串拼接,需要将数字转成字符
cxd1='a';
cxd2=num2str(start); %%%%数字转字符
cxd3=':';
cxd4='i';
cxd5=num2str(start+8);
cxd=[cxd1 cxd2 cxd3 cxd4 cxd5]; %%%%动态区域
Step4:读取表格,并把空白位置置零
A = xlsread('D:\暂存\数独大全\数独题目.xls',sheet,cxd);
A(isnan(A))=0;
结果如下图5(1)和5(2):先从菜单选取“primary”,抽中第37题。
6、数据写入excel中
方法和读取类似,不再说明,直接上例子
例6,将数独求解结果写入excel中,页不变,行不变,列向右移6格的区域中
zxc1='o';
zxc2=num2str(start);
zxc3=':';
zxc4='w';
zxc5=num2str(start+8);
zxc=[zxc1 zxc2 zxc3 zxc4 zxc5];
success = xlswrite('D:\暂存\数独大全\数独题目.xls',A,sheet,zxc);
其中:xlswrite第一个参数为表格名,或者地址
第二个参数“A”,为要写入的数据
第三个参数“sheet”为表格页,与前面读取时同一个值
第四个参数“zxc”为写入区域,获取方法同样是字符串拼接。
数独题求解后结果写入excel中,如下图6