读/写Excel电子表格数据

在工作中,很多分析数据都是以Excel文件保存的,所以在MATLAB中进行Excel数据文件的数据导入和导出很重要。

从Excel电子表格读入数据

在MATLAB中实现Excel文件数据的读取,主要有工具导入和使用readtable函数、xlsread函数、SpreadsheetDatastore函数导入等方法。

1.使用readtable函数导入Excel数据

用readtable函数可以读取Excel文件,该函数的语法格式如下。

T = readtable(filename):通过从文件中读取列数据来创建表。readtable函数根据文件的扩展名确定文件格式:

txt、.dat 或 .csv(适用于带分隔符的文本文件)

xls、.xlsb、.xlsm、.xlsx、.xltm、.xltx 或 .ods(适用于电子表格文件)

readtable为文件中的每列在T中创建一个变量,并从文件的第一行中读取变量名称。在默认情况下,如果整列均为数值,则已创建的变量是double型的,如果列中的任意一个元素不是数值,则为字符向量单元数组。

T = readtable(filename,Name,Value):根据文件创建表,并通过一个或多个名称-值对组参数指定其他选项。例如,可以指定readtable是将文件的第一行读取为变量名称还是数据。

T = readtable(filename,opts):使用导入选项opts创建表。

T = readtable(filename,opts,Name,Value):使用导入选项opts创建表,并通过以下一个或多个名称-值对组参数指定其他选项:ReadVariableNames、ReadRowNames、DateLocale、Encoding、Sheet和Basic。

【例1-7】从Excel文件patients.xls中读取数据,根据第一行的变量名和第一列的行名称创建表。

在MATLAB命令窗口中输入:

T = readtable('patients.xls','ReadRowNames',true);

T(1:5,1:4)

ans =

Gender Age Location Height

________ ___ ___________________________ ______

Smith 'Male' 38 'County General Hospital' 71

Johnson 'Male' 43 'VA Hospital' 69

Williams 'Female' 38 'St. Mary's Medical Center' 64

Jones 'Female' 40 'VA Hospital' 67

Brown 'Female' 49 'County General Hospital' 64

可以从电子表格中读取指定范围内的数据,例如:

T = readtable('patients.xls',...

'Range','C2:E6',...

'ReadVariableNames',false)

T =

Var1 Var2 Var3

____ ___________________________ ____

38 'County General Hospital' 71

43 'VA Hospital' 69

38 'St. Mary's Medical Center' 64

40 'VA Hospital' 67

49 'County General Hospital' 64

ReadVariableNames设置为false,表示不用第一行数据作为变量名,此时自动设置变量名为Var1, Var2,…,VarN。

2.使用xlsread函数导入Excel数据

使用xlsread函数读取Excel电子表格文件数据,该函数的语格式如下。

num = xlsread(filename):读取名为filename的Excel电子表格工作表中的第一张工作表,并在一个矩阵中返回数据。

num = xlsread(filename,sheet):读取指定的工作表。

num = xlsread(filename,xlRange):从工作簿的第一个工作表的指定范围内读取数据。使用 Excel 范围语法,例如 'A1:C3'。

num = xlsread(filename,sheet,xlRange):读取指定的工作表和范围。

num = xlsread(filename,sheet,xlRange,'basic'):在basic导入模式下读取电子表格中的数据。如果你的计算机未安装Windows版Excel,则xlsread会自动在basic导入模式下运行,该模式支持 XLS、XLSX、XLSM、XLTX 和 XLTM 文件。如果不指定所有参数,则使用空字符向量 '' 作为占位符,例如,num = xlsread(filename,'','','basic')。

[num,txt,raw] = xlsread(___):还使用先前语法中的任何输入参数,在单元数组txt中返回文本字段,在单元数组raw中返回数值数据和文本数据。

___ = xlsread(filename,-1):打开一个Excel窗口,以便用交互方式来选择数据。选择工作表,将鼠标拖曳到所需范围上,然后单击“确定”按钮。只有安装了Excel软件的计算机才支持此语法。

[num,txt,raw,custom] = xlsread(filename,sheet,xlRange,'',processFcn)(其中processFcn 是函数句柄):读取电子表格,对数据调用processFcn,并在数组num中以数值数据的形式返回最终结果。xlsread函数在单元数组txt中返回文本字段、在单元数组raw中返回数值和文本数据,并在数组custom中返回processFcn的第二个输出。xlsread函数不会更改电子表格中存储的数据。只有安装了Excel软件的计算机才支持此语法。

【例1-8】下面先创建一个Excel文件xlsfile.xlsx,如图1-4所示。然后使用xlsread函数读取该文件中的数据。

Document Image

图1-4 创建Excel文件

将xlsfile.xlsx文件复制到当前工作路径中,在MATLAB命令窗口中输入:

filename = 'xlsfile.xlsx';

A = xlsread(filename)

A =

10 1 1000

12 2 NaN

10 3 1300

默认时读取数值数据,非数值数据作为空值处理,并显示为NaN。

可以指定读取的范围,例如:

filename = 'xlsfile.xlsx';

sheet = 1;

xlRange = 'B2:C4';

A2 = xlsread(filename,sheet,xlRange)

A2 =

1 1000

2 NaN

3 1300

可以从文件中读取数值数据、文本数据和合并数据,例如:

[num,txt,raw] = xlsread('xlsfile.xlsx')

num =

10 1 1000

12 2 NaN

10 3 1300

txt =

'面积' '品种' '产量'

'' '' ''

'' '' 'x'

raw =

'面积' '品种' '产量'

[ 10] [ 1] [1000]

[ 12] [ 2] 'x'

[ 10] [ 3] [1300]

3.使用工具导入Excel数据

在MATLAB的“主页”工具栏中单击“导入数据”按钮,打开“导入数据”对话框。选择数据类型为电子表格,浏览并选择要导入的电子表格文件的名称,单击“打开”按钮,打开“导入”对话框,如图1-5所示。

Document Image

图1-5 用工具导入电子表格数据

导入MATLAB中的数据类型可以是列矢量、矩阵、单元数组或表。设置好后,单击“导入所选内容”按钮,导入选择的数据。

将数据导出为Excel文件

在MATLAB中,使用xlswrite函数可以将数据写入Excel电子表格文件中,该函数的语法格式如下。

xlswrite(filename,A):将矩阵A写入Excel文件filename中的第一张工作表中,从单元格A1开始写入。

xlswrite(filename,A,sheet):将数据写入指定的工作表。

xlswrite(filename,A,xlRange):将数据写入工作簿的第一个工作表中由xlRange指定的矩形区域内。写入时使用Excel范围的语法,例如 ‘A1:C3’。

xlswrite(filename,A,sheet,xlRange):将数据写入指定的工作表和范围中。

status = xlswrite(___):使用先前语法中的任何输入参数返回写入操作的状态。当操作成功时,status 为1;否则,status为0。

[status,message] = xlswrite(___):在结构体message中返回写入操作生成的任何警告或错误消息。

【例1-9】在MATLAB当前工作路径下创建一个Excel文件xlsdata.xlsx,将包含6个数字的向量写入到该文件中。

filename = 'xlsdata.xlsx';

A = [1 2 3 4 5 6];

xlswrite(filename,A)

可以在写入时指定在电子表格中的范围,例如:

filename = 'xlsdata2.xlsx';

A = {'序号','名称','年龄';1,'张三',28;2,'李四',23;3,'王二',25};

sheet=2;

xlRange='D1';

xlswrite(filename,A,sheet,xlRange)