matlab与excel数据导入导出

更新时间:2023-09-22 07:01:01 阅读量: 工程科技 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第 7 章 MATLAB 与 Excel 文件的数据交换

郑志勇 (www.ariszheng.com),谢中华

Excel 是一款非常优秀的通用表格软件,在学习、工作与科研中大量的数据可能都是以 Excel 表格的 方式存储的。如何利用 matlab 强大的数值计算功能处理 Excel 中的数据,首要解决的问题就是如何将

Excel 中的数据导入到 matlab 中或将 matlab 数值计算的结果转存入 Excel 中?为此,本章主要介绍以界面 操作方式(数据导入向导)、函数方式和 exlink 宏方式实现 matlab 与 Excel 的数据交互。

7.1 利用数据导入向导导入 Excel 文件

可以利用数据导入向导把 Excel 文件中的数据导入到 MATLAB 工作空间,步骤与 6.2.1 节相同。

【例 7.1-1】把 Excel 文件 examp71_1.xls 中的数据导入到 MATLAB 工作空间。examp71_1.xls 中的数 据格式如图 7.1-1 所示。

图 7.1-1 Excel 数据表格

可以看出文件 examp71_1.xls 中包含了某两个班的某门课的考试成绩,有序号、班级名称、学号、姓 名、平时成绩、期末成绩、总成绩和备注等数据,有数字也有文字说明。用数据导入向导会在 MATLAB

工作空间生成两个变量:data 和 textdata,data 为数值矩阵,textdata 为字符串元胞数组,它们的数据格式 如下(部分数据):

>> data % 查看导入的变量 data

data =

1

2 3 4 5 ?

>> textdata

textdata =

60101 60101 60101 60101 60101

6010101 6010102 6010103 6010104 6010105

NaN NaN NaN NaN NaN

0 0 0 0 0

63 73 0 82 80

63 73 0 82 80

% 查看导入的变量 textdata

·2·

'序号'

'' '' '' '' '' ?

'班名' '' '' '' '' ''

书名

'学号' '姓名' '平时成绩' '' '陈亮' '' '' '李旭' '' '' '刘鹏飞' '' '' '任时迁' '' '' '苏宏宇' ''

'期末成绩'

'' '' '' '' ''

'总成绩'

'' '' '' '' ''

'备注' '' '' '缺考' '' ''

7.2 调用函数读写 Excel 文件

7.2.1 调用 xlsfinfo 函数获取文件信息

在读取 Excel 目标数据文件前,可以通过 xlsfinfo 函数获取该文件的相关信息,为后续操作获得有效 信息(例如,文件类型、文件内部结构、相关的软件版本等)。

xlsinfo 函数的调用格式如下:

[typ, desc, fmt] = xlsfinfo(filename)

其中输入参数参数 filename 为字符串变量,用来指定目标文件的文件名和文件路径。若目标文件在

matlab 搜索路径下,filename 为文件名字符串即可,例如: 'abc.xls';若目标文件不在 matlab 搜索路径 下,filename 中还应包含文件的完整路径,例如:'E:\\other\\基础 matlab 案例书籍\\abc.xls'。

输出参数的含义如下:

typ:目标文件类型

desc:目标文件内部表名称(sheetname) fmt:支持目标文件的软件版本

【例 7.2-1】调用 xlsfinfo 函数读取 Excel 文件。以下代码保存在 m 文件 CaseXlsRead.m 中。

%code by ariszheng@gmail.com 10-6-22 %%

%文件名称“excel.xls”

[typ, desc, fmt] = xlsfinfo('excel.xls')

%文件在当前工作目录下,直接输入文件名称即可。 system('taskkill /F /IM EXCEL.EXE');

注释:在用 matlab2009a 与 Excel2007 进行数据交互时,每次使用 xls 类函数,都会重新开启一个 Excel 进程,若反复使用 xls 类函数会导致系统中多个 Excel 进程并存,消耗系统资源,导致系统运行速度

下降,故作者使用 system('taskkill /F /IM EXCEL.EXE')调用 windows 的 taskkill 函数关闭刚使用的 Excel 进 程。

本例输出结果如下:

typ =

Microsoft Excel Spreadsheet %文件类别为 excel 文件 desc =

'Sheet1' 'Sheet2' 'Sheet3' %文件中数据表为 'Sheet1' 'Sheet2' 'Sheet3' fmt = xlExcel8

%文件版本为 xlExcel8 版本 对应的为 excel 97~2003 版本 成功: 已终止进程 \,其 PID 为 5508。

7.2.2 调用 xlsread 函数读取数据

章名

·3·

数据导入向导在导入 Excel 文件时调用了 xlsread 函数,xlsread 函数用来读取 Excel 工作表中的数 据。原理是这样的,当用户系统安装有 Excel 时,MATLAB 创建 Excel 服务器,通过服务器接口读取数 据。当用户系统没有安装 Excel 或 MATLAB 不能访问 COM 服务器时,MATLAB 利用基本模式(Basic

mode)读取数据,即把 Excel 文件作为二进制映像文件读取进来,然后读取其中的数据。xlsread 函数的 调用格式如下:

1.num = xlsread(filename)

读取由 filename 指定的 Excel 文件中第 1 个工作表中的数据,返回一个双精度矩阵 num. 输入参数 filename 是由单引号括起来的字符串,用来指定目标文件的文件名和文件路径。

当 Excel 工作表的顶部或底部有一个或多个非数字行(如图 7.1-1 中的第 1 行),左边或右边有一个 或多个非数字列(如图 7.1-1 中的第 H 列)时,在输出中不包括这些行和列。例如,xlsread 会忽略一个电 子表格顶部的文字说明。

如图 7.1-1 中的第 D 列,它是一个处于内部的列。对于内部的行或列,即使它有部分非数字单元格, 甚至全部都是非数字单元格,xlsread 也不会忽略这样的行或列。在读取的矩阵 num 中,非数字单元格位 置用 NaN 代替。

2.num = xlsread(filename, -1)

在 Excel 界面中打开数据文件,允许用户交互式选取要读取的工作表以及工作表中需要导入的数据区 域。这种调用会弹出一个提示界面,提示用户选择 Excel 工作表中的数据区域。在某个工作表上单击并拖 动鼠标即可选择数据区域,然后单击提示界面上的“确定”按钮即可导入所选区域的数据。

3.num = xlsread(filename, sheet)

用参数 sheet 指定读取的工作表。sheet 可以是单引号括起来的字符串,也可以是正整数,当是字符串 时,用来指定工作表的名字,当是正整数时,用来指定工作表的序号。

4.num = xlsread(filename, range)

用参数 range 指定读取的单元格区域。range 是字符串,为了区分 sheet 和 range 参数,range 参数必需 是包含冒号,形如 'C1:C2' 的表示区域的字符串。若 range 参数中没有冒号,xlsread 就会把它作为工作表 的名字或序号,这就可能导致错误。

5.num = xlsread(filename, sheet, range) 同时指定工作表和工作表区域。

【例 7.2-2】调用 xlsread 函数读取文件 examp71_1.xls 第 1 个工作表中区域 A2:H4 的数据。命令及结 果如下:

% 读取文件 examp71_1.xls 第 1 个工作表中单元格 A2:H4 中的数据 % 第一种方式:

>> num = xlsread('examp71_1.xls','A2:H4') % 返回读取的数据矩阵 num

num =

1

2 3

% 第二种方式:

>> num = xlsread('examp71_1.xls',1,'A2:H4')

num =

% 返回读取的数据矩阵 num

60101 60101 60101

6010101 6010102 6010103 NaN NaN NaN

0 0 0

63 73 0

63 73 0

·4·

1 2 3

60101 60101 60101

6010101 6010102 6010103 书名

NaN NaN NaN 0 0 0 63 73 0 63 73 0

% 第三种方式:

>> num = xlsread('examp71_1.xls','Sheet1','A2:H4')

num =

1 60101 6010101 NaN 0 63 63 2 60101 6010102 NaN 0 73 73 3 60101 6010103 NaN 0 0 0

可以看出上述命令中用到的三种调用方式的作用是相同的,读取到了相同的数据。 6.num = xlsread(filename, sheet, range, 'basic')

用基本模式(Basic mode)读取数据。当用户系统没有安装 Excel 时,用这种模式导入数据,此时导 入功能受限,range 参数的值会被忽略,可以设定 range 参数的值为空字符串(''),而 sheet 参数必须是 字符串,此时读取的是整个工作表中的数据。

7.num = xlsread(filename, ?, functionhandle)

在读取电子表格里的数据之前,先调用由函数句柄 functionhandle 指定的函数。它允许用户在读取数 据之前对数据进行一些操作,例如在读取之前变换数据类型。

用户可以编写自己的函数,把函数句柄传递给 xlsread 函数。当调用 xlsread 函数时,它从电子表格读 取数据,把用户函数作用在这些数据上,然后返回最终结果。 xlsread 函数在调用用户函数时,它通过 Excel 服务器 Range 对象的接口访问电子表格的数据,所以用户函数必须包括作为输入输出的接口。

【例 7.2-3】将文件 examp71_1.xls 第 1 个工作表中 A2 至 C3 单元格中的数据加 1,并读取变换后的数 据。

首先编写用户函数如下:

function DataRange = setplusone1(DataRange) for k = 1:DataRange.Count

DataRange.Value{k} = DataRange.Value{k}+1; % 将单元格取值加 1 end

用户函数中的输入和输出均为 DataRange,其实它就是一个变量名,用户可以随便指定。当 xlsread 函数调用用户函数时,会通过 DataRange 参数传递 Range 对象的接口,默认情况下传递的是第 1 个工作表 对象的 UsedRange 接口,用户函数通过这个接口访问工作表中的数据。

把用户函数句柄作为 xlsread 函数的最后一个输入,可以如下调用:

% 读取文件 examp71_1.xls 第 1 个工作表中单元格 A2:C3 中的数据,将数据分别加 1 后返回 >> convertdata = xlsread('examp71_1.xls', '', 'A2:C3', '', @setplusone1)

convertdata =

2 3

60102 60102

6010102 6010103

% 返回读取的数据矩阵 num

8.[num, txt]= xlsread(filename, ?)

返回数字矩阵 num 和文本数据 txt. txt 是一个元胞数组,如同例 7.1-1 中的 textdata,txt 中与数字对应 位置的元胞为空字符串('')。

9.[num, txt, raw] = xlsread(filename, ?)

num 和 txt 的解释同上,返回的 raw 为未经处理的元胞数组,既包含数字,又包含文本数据。

章名

10.[num, txt, raw, X] = xlsread(filename, ?, functionhandle)

·5·

返回用户函数的额外的输出 X。此时的用户函数应有两个输出,第 1 个输出为 Range 对象的接口, 第 2 个输出为这里的 X。

例如,可以将例 7.2-3 中的用户函数增加一个输出,变为如下形式:

function [DataRange, customdata] = setplusone2(DataRange) for k = 1:DataRange.Count

DataRange.Value{k} = DataRange.Value{k}+1; % 将单元格取值加 1 customdata(k) = DataRange.Value{k}; % 把单元格取值赋给变量 customdata end

% 按照所选区域中单元格行数和列数把向量 customdata 变为矩阵 customdata = reshape(customdata, DataRange.Rows.Count, DataRange.Columns.Count); 把函数句柄作为 xlsread 函数的最后一个输入,读取文件 examp71_1.xls 第 1 个工作表中 A2 至 H2 单 元格中的数据,命令如下:

% 读取文件 examp71_1.xls 第 1 个工作表中单元格 A2:H2 中的数据,将读取到的数据分别加 1 % 返回数值矩阵 num,文本矩阵 txt,元胞数组 raw,变换后数值矩阵 X >> [num, txt, raw, X] = xlsread('examp71_1.xls', '', 'A2:H2', '', @setplusone2)

num =

2

txt =

{}

raw =

[2]

X =

2

60102

6010102 NaN

1

64

64

NaN

[60102]

[6010102]

[NaN] [1]

[64]

[64]

[NaN]

60102

6010102

NaN

1

64

64

11.xlsread filename sheet range basic

xlsread 函数的命令行调用方式。此时 sheet 参数必须是字符串(例如 Sheet3),当 sheet 参数中有空 格时,必须用单引号括起来(例如 'Income 2002')。

7.2.3 调用 xlswrite 函数把数据写入 Excel 文件

xlswrite 函数用来将数据矩阵 M 写入 Excel 文件,其主要调用方式如下:

xlswrite(filename, M)

xlswrite(filename, M, sheet) xlswrite(filename, M, range)

xlswrite(filename, M, sheet, range) status = xlswrite(filename, ?)

[status, message] = xlswrite(filename, ?)

其中输入参数 filename 为字符串变量,用来指定文件名和文件路径。若 filename 指定的文件不存 在,则创建一个新文件,文件的扩展名决定了 Excel 文件的格式。若扩展名为“.xls”,则创建一个 Excel 97-2003 下的文件,若扩展名为“.xlsx”、“.xlsb”或“.xlsm”,则创建一个 Excel 2007 格式的文件。

M 可以是一个 m×n 的数值型矩阵或字符型矩阵,也可以是一个 m×n 的元胞数组,此时每一个元胞 只包含一个元素。由于不同版本的 Excel 所能支持的最大行数和列数是不一样的,所以能写入的最大矩阵

本文来源:https://www.bwwdw.com/article/eyyd.html

Top