2.3 EXCEL文件的读取与写入
EXCEL文件和Txt文件一样,可以很好地保存数据并显示数据,实现EXCEL数据的传输和MATLAB的对接,也是应用探讨最多的热门话题之一。本节讲解EXCEL文件的读取与写入操作方法。
2.3.1 EXCEL数据的读取
EXCEL文件和文本文件一样,在实际工程中,应用很广泛。EXCEL自身就带有很强大的数据处理功能,然而对于大数据时代的今天,EXCEL已经不能很好地胜任目前的数据计算任务,常常需要由MATLAB等软件进行数据计算,然后将计算结果写入到EXCEL中。同样,MATLAB工作区矩阵的容量也是有限的,很多用户都是将数据存储为EXCEL文件,方便后期的使用。因此,有必要进行EXCEL的读取与写入功能介绍。
MATLAB数据导入功能是很强大的,其具有很强的兼容性,能够对几乎所有的数据类型进行导入操作,具体如图2-27所示。
图2-27 EXCEL数据导入
如图2-27所示,EXCEL包含两个Sheet文件——Sheet1和Sheet2文件,数据导入功能,能够识别所有Sheet文件,并由用户自行选择Sheet文件进行数据的导入操作。单击导入所选内容,即可实现EXCEL文件内容导入,具体如图2-28所示。
图2-28 Sheet1文件导入数据
针对每一列数据,进行一个变量命名保存,依次为VarName1、VarName2、VarName3、VarName4,如此依次类推,分别对应于MATLAB工作区变量。每一个变量所包含的数值在第2列显示,均为11行1列的数据。用户也可以单击Sheet2进行数据的导入操作。
选择生成脚本文件,MATLAB自动生成导入EXCEL数据的函数程序文件,如下:
%% 导入电子表格中的数据 % 用于从以下电子表格导入数据的脚本 % % 工作簿: F:\MATLAB Edit 2013a\MATLAB Edit % 2012B\ysw\book\GUI设计手册\第2章\ysw.xlsx 工作表: Sheet1 % % 要扩展代码以供其他选定数据或其他电子表格使用,请生成函数来代替脚本 %% 导入数据 data = xlsread('F:\MATLAB Edit 2013a\MATLAB Edit 2012B\ysw\book\GUI设计手册\第2章\ysw.xlsx','Sheet1'); %% 将导入的数组分配给列变量名称 VarName1 = data(:,1); % 赋值 VarName2 = data(:,2); % 赋值 VarName3 = data(:,3); % 赋值 VarName4 = data(:,4); % 赋值 %% 清除临时变量 clearvars data raw;
具体如图2-29所示。
图2-29 脚本文件导入
采用函数文件进行EXCEL数据导入,选择Sheet1作为分析EXCEL数据簿,得到相应的导入函数,具体代码如下:
function [VarName1,VarName2,VarName3,VarName4] = importfile2(workbookFile, sheetName,startRow,endRow) % IMPORTFILE2 导入电子表格中的数据 % [VarName1,VarName2,VarName3,VarName4]=IMPORTFILE2(FILE)读取名为FILE的 % Microsoft Excel 电子表格文件的第一张工作表中的数据,并将该数据作为列矢量返回 % % [VarName1,VarName2,VarName3,VarName4] = IMPORTFILE2(FILE,SHEET) % 从指定的工作表中读取 % % [VarName1,VarName2,VarName3,VarName4] = % IMPORTFILE2(FILE,SHEET,STARTROW,ENDROW) 对于指定的行间隔从指定工作表中读取。对于不连续的行间隔,将STARTROW 和 ENDROW 指定为大小匹配的一对标量或矢量。要读取到文件结尾,请为 inf 指定 ENDROW % 示例: % [VarName1,VarName2,VarName3,VarName4] = % importfile2('ysw.xlsx','Sheet1',1,11); % 调用格式 % %% 输入处理 % 如果未指定工作表,则读取第一张工作表 if nargin == 1 || isempty(sheetName) sheetName = 1; % 默认EXCEL BOOK名称 end % 如果未指定行的起点和终点,则会定义默认值 if nargin <= 3 startRow = 1; % 起始行 endRow = 11; % 终止行 end %% 导入数据 data = xlsread(workbookFile, sheetName, sprintf('A%d:D%d',startRow(1), endRow(1))); for block=2:length(startRow) tmpDataBlock = xlsread(workbookFile, sheetName, sprintf('A%d:D%d', startRow(block),endRow(block))); data = [data;tmpDataBlock]; %#ok<AGROW> end %% 将导入的数组分配给列变量名称 VarName1 = data(:,1); % 变量赋值 VarName2 = data(:,2); % 变量赋值 VarName3 = data(:,3); % 变量赋值 VarName4 = data(:,4); % 变量赋值
函数具体使用如下:
>> [VarName1,VarName2,VarName3,VarName4] =importfile2('ysw.xlsx',' Sheet1',1,11) 1 1 1 1 1 8 8 3 7 2 3 6 4 8 8 7 0 0 2 9 6 3 4 6 3 7 5 1 0 8 8 0 8 2 0 0 7 4 7 4 0 1 4 1
函数importfile2('ysw.xlsx','Sheet1',1,11),Sheet1为EXCEL的第一个工作表,1表示第一行,11表示第11行,ysw.xlsx表示命名为ysw的EXCEL文件。导入的数据分别存储到VarName1、VarName2、VarName3和VarName4四个变量中。
当然MATLAB也提供了较为简单的函数实现数据的直接导入功能,即xlsread函数,该函数兼容2003版EXCEL以及更高EXCEL版本,例如2007版EXCEL、2013版EXCEL以及2014版EXCEL等。
采用xlsread函数对EXCEL进行读取操作,具体如下:
% Designed by Yu Shengwei From SWJTU University % 2015年1月3日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 data = xlsread('ysw.xlsx','Sheet1'); toc % 计时结束
运行程序输出结果如下:
data = 1 1 1 1 1 8 8 3 7 2 3 6 4 8 8 7 0 0 2 9 6 3 4 6 3 7 5 1 0 8 8 0 8 2 0 0 7 4 7 4 0 1 4 1 时间已过 1.729919 秒。
同样也可以对EXCEL某几行进行读取操作,如下:
data = xlsread('ysw.xlsx','Sheet1','A1:D3')
运行程序输出结果如下:
data = 1 1 1 1 1 8 8 3 7 2 3 6
其中,A1~D3表示从A~D列,从第1~3行,将这个区域内的元素全部取出,并存入data变量中,具体EXCEL数据如图2-30所示。
图2-30 EXCEL原始数据
修改Sheet2工作表为ysw1工作表,如图2-31所示。
图2-31 EXCEL ysw1工作表
现要求读取指定工作表的数据,具体程序如下:
tic % 运算计时 data = xlsread('ysw.xlsx','ysw1','A1:D11') % 读取EXCEL toc % 计时结束
运行程序输出结果如下:
data = 1 1 1 1 1 8 8 3 7 2 3 6 4 8 8 7 0 0 2 9 6 3 4 6 3 7 5 1 0 8 8 0 8 2 0 0 7 4 7 4 0 1 4 1 时间已过 3.039723 秒。
如此使然,用户将可以对EXCEL数据导入功能熟练掌握了。
2.3.2 EXCEL数据的写入
MATLAB提供了强大的EXCEL读取功能,同样也有着强大的EXCEL写入数据功能。MATLAB提供xlswrite函数供用户调用,如下为最简单的向EXCEL中写入数据的程序。
% Designed by Yu Shengwei From SWJTU University % 2015年2月2日 clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 format short % 数据类型 tic % 运算计时 % data = xlsread('ysw.xlsx','Sheet1') % 读EXCEL ysw = [1,1,7,4,0,6,3,0,8,7]; % 数值 xlswrite('ysw1.xlsx',ysw) % 写入EXCEL toc % 计时结束
运行程序即可向ysw1.xlsx EXCEL文件写入ysw变量数组的内容,具体如图2-32所示。
图2-32 ysw1.xlsx文件
MATLAB调用xlswrite函数进行数据写入,不需要用户提前创建EXCEL文件,即在当前工作路径下,用户不需要事先创建一个ysw1.xlsx的EXCEL文件。
通过程序向EXCEL写入数据,然后读取EXCEL数据,就能知道数据是否写入EXCEL中,具体程序如下:
ysw = [1,1,7,4,0,6,3,0,8,7]; xlswrite('ysw1.xlsx',ysw) % 写入EXCEL % 写完数据后,读取数据 data = xlsread('ysw1.xlsx','Sheet1') % 读EXCEL toc % 计时结束
运行程序输出结果如下:
data = 1 1 7 4 0 6 3 0 8 7 时间已过 15.310696 秒。
MATLAB读取EXCEL时,需要打开EXCEL,然后再提取数据,因此比较耗时,用时15.310696秒左右。
有时候用户的工作表名字可能为其他名称,而不是“Sheet1”,用户也可以进行修改,将数据写入名称为“yswysw”的工作表,具体如下:
xlswrite('ysw1.xlsx',ysw,'yswysw') % 写EXCEL
其中,yswysw为工作表名称,ysw为数据,ysw1.xlsx为EXCEL文件名称。
运行程序得到如图2-33所示结果。
图2-33 工作表重命名
如图2-33所示,EXCEL工作表名称已经修改为“yswysw”。
接下来用户可针对指定EXCEL工作表进行数据写入操作。此时用户也许会更多地关心,如何向指定的EXCEL工作表位置写入数据呢?具体MATLAB程序如下:
clc,clear,close all % 清理命令区、清理工作区、关闭显示图形 warning off % 消除警告 feature jit off % 加速代码运行 filename = 'ysw2.xlsx'; % EXCEL文件名称 A = {'Time','Temperature'; 11,7; 40,6; 30,87}; % 写入的数据 sheet = 3; % 向第三个工作表上写数据 xlRange = 'B1'; % 从B1列开始写入数据A xlswrite(filename,A,sheet,xlRange) % 写数据开始
运行程序得到如图2-34所示结果。
图2-34 指定位置写入数据
如图2-34所示结果,指定向该EXCEL的第三个工作表上的B1列位置开始写数据,同理,用户也可以向E1的位置写入数据,程序如下:
xlRange = 'E1'; % 从E1列开始写入数据A xlswrite(filename,A,sheet,xlRange) % 写数据开始
MATLAB也支持胞组数据写入,即直接写入字符和数据,具体程序如下:
filename = 'ysw2.xlsx'; % EXCEL文件名称 A = {92.0,'Yes',45.9,'No'}; % 胞组数据 sheet = 3; % 向第三个工作表上写数据 xlRange = 'E1'; % 从E1列开始写入数据A xlswrite(filename,A,sheet,xlRange) % 写数据开始
运行程序得到如图2-35所示结果。
图2-35 胞组数据写入
如图2-35所示,数据和字符类型数据直接写入,因此MATLAB中的数据写入EXCEL是极其简便的,MATLAB支持single、double、int8、int16、int32、int64、uint8、uint16、uint32、uint64、logical、char、cell等数据类型写入。