MATLAB GUI设计入门与实战
上QQ阅读APP看书,第一时间看更新

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等数据类型写入。