利用matlab导入或读取数据至Excel(COM方法和xlswrite、xlsread方法)
- 1 Matlab自带函数
-
- 1.1写入Excel
- 1.2读取Excel
- 1.3示例
- 2 COM方法
-
- 2.1 文件的读取与写入
-
- 2.1.1 应用1:利用Excel画画
- 2.2 纯数据的快速写入编辑
- 2.3 Excel中图表Chart的绘制
2020.12月更新,增加Chart图表的绘制。可以实现利用matlab在excel里绘制柱形图、散点图等图表。
2021年 4月更新,修复x2column函数在x大于1352时转换错误的bug
太长不看版结论:xlswrite、xlsread方法简单,实现功能简单。COM方法复杂,实现功能复杂。
废话不多说了,这篇文章不写前言和简介了。
1 Matlab自带函数
1.1写入Excel
matlab自带函数xlswrite,可以用来写入excel数据。
格式为:
xlswrite(filename,A,sheet,xlRange)
第一个filename是excel名称,如’WriteIt.xlsx’;
A是要写入的数据,最好是cell格式的;
sheet是要写入的表格,1代表第一个表格,如果没有,则会新建一个。也可以用名称替代,比如’sheet1’;
xlRange是excel的数据输入范围,格式为’A1:F6’,代表选择A1到F6之间的范围输入数据
在新版本2019则不推荐用xlswrite,换成了一个新的函数writecell
基本用法和xlswrite差不多
1.2读取Excel
matlab自带函数xlsread读取excel函数,格式为
[Read_num,Read_txt,Read_all] =xlsread('WriteIt.xlsx');
输出有3个,代表输出数字(mat格式),输出文字(cell格式),和总的输出(cell格式)。
在2019版本之后,matlab不推荐xlsread,换成了readcell函数,用法也差不多。
1.3示例
代码如下:
clear
clc
%利用matlab自带的函数写入excel
Size=3;
A=magic(Size);
data=cell(4,3);
data(2:4,:)=num2cell(A);
data(1,1:3)={'a','b','c'};
range=['A1:',char(abs('A')-1+Size),num2str(Size+1)];
%2019版本
% writecell(data,'WriteIt.xlsx','Sheet',1,'Range',range,'AutoFitWidth',true);
%2006版本
xlswrite('WriteIt.xlsx',data,1,range);
%利用matlab自带的函数读取excel数据
%2019版本
% Read_data=readcell('WriteIt.xlsx');
%2006版本
[Read_num,Read_txt,Read_all] =xlsread('WriteIt.xlsx');
实际输出的Excel形式如下:

2 COM方法
本章参考:
实战Matlab之文件与数据接口技术(江泽林、刘维)
Microsoft相关网上文档(https://docs.microsoft.com/zh-cn/office/vba/api/excel.workbook)
COM方法,就是利用Excel提供的COM接口,在Matlab中调用Excel中的一些功能。
如果在调试过程中出现错误,需要手动在 任务管理器 中,进程那一栏,手动结束EXCEL.EXE进程,才能正常重新执行程序。如果调试正确,则不需要。
2.1 文件的读取与写入
上图为一个演示文档,名称为‘实验.xlsx’。文件包含两个Sheet,分别为‘火箭发射’和‘附录’。
上图左为‘火箭发射’Sheet,其中包含数字格式设置、填充颜色设置、字体设置、对齐方式设置、文字颜色设置、文字大小设置、文字加粗和倾斜设置。
上图右为‘附录’Sheet,其中包含公式的设置,B列公式为B2=100-($A2)^2,向下填充。
本文目前程序,不包含的信息有且不限于:合并单元格、边框信息、图表绘制、条件格式、筛选等。
下面程序演示了读取‘实验.xlsx’文件中所有的相关信息,然后新建一个excel文件,将读取的信息全部写入的例子。
%读取格式,写成函数形式
%复制表格
filename='实验.xlsx';
Excel_Data=Read_Excel(filename);
filename2='实验2.xlsx';
Write_Excel(filename2,Excel_Data);
%后面是相关函数
function Write_Excel(filename,Excel_Data)
% file=fullfile(pwd, file);%加上全路径
exl=actxserver('excel.application');
exlWkbk=exl.WorkBooks.Add();
E_WS=exlWkbk.Worksheets;
%创建2个表格
sheet_N=size(Excel_Data,1);
for k=1:sheet_N
E_WS.Item(k).Select;%选择第k个表格
E_WS_k=E_WS.Item(k);
E_WS_k.Name=Excel_Data{k,1};%建立名字
if sheet_N>1 && k<sheet_N
E_WS.Item(1).Select;%选择第一个表格
E_WS.Add([], E_WS.Item(E_WS.Count));%在后面添加一个新sheet
end
E_WS.Item(k).Select;%重新选择回第k个表格
exlSheet1=exl.Activesheet;%选中当前工作表
Data_K=Excel_Data{k,2};%获取当前工作表数据
num_rows=size(Data_K,1);%行数
num_columns=size(Data_K,2);%列数
for x=1:num_columns
X=x2columns(x);%把列转换为Excel的索引格式
for y=1:num_rows
dat_range=[X,num2str(y),':',X,num2str(y)];
%选中要写入的范围
rngObj=exlSheet1.Range(dat_range);
%选中到Font上
Data_Font=rngObj.Font;
%写入字体颜色
Color10=Data_K(y,x).TextColor;
Color16=[dec2hex(Color10(1),2),dec2hex(Color10(2),2),dec2hex(Color10(3),2)];%由三组16进制数组成,分别为BGR对应的16进制
Data_Font.Color=hex2dec(Color16);
%改变字体格式
Data_Font.Name=Data_K(y,x).TextStyle;%字体
Data_Font.Size=Data_K(y,x).TextSize;%文字大小
Data_Font.Bold=Data_K(y,x).IfBold;%是否加粗
Data_Font.Italic=Data_K(y,x).IfItalic;%是否倾斜
%选中到cell上
Data_Cells=rngObj.Cells;
%单元格数字格式
Data_Cells.NumberFormat=Data_K(y,x).Format;%输出单元格数字格式
%宽度和高度
Data_Cells.ColumnWidth=Data_K(y,x).Width;
Data_Cells.RowHeight=Data_K(y,x).Height;
%设置对齐方式
XYA=Data_K(y,x).XYAlignment;
Data_Cells.HorizontalAlignment=XYA(1);%水平对齐
Data_Cells.VerticalAlignment=XYA(2);%垂直对齐
%选中到Interior上
Data_Interior=rngObj.Interior;
%设置背景颜色
Color10=Data_K(y,x).BGColor;
Color16=[dec2hex(Color10(1),2),dec2hex(Color10(2),2),dec2hex(Color10(3),2)];%由三组16进制数组成,分别为BGR对应的16进制
Data_Interior.Color=hex2dec(Color16);
%写入范围内的数据内容
if strcmp(Data_K(y,x).Data,Data_K(y,x).Formula)
rngObj.Value=Data_K(y,x).Data;%值
else
rngObj.Formula=Data_K(y,x).Formula;%公式
end
%设置边框(默认边框)
Data_Borders=rngObj.Borders;
Color16=[dec2hex(212,2),dec2hex(212,2),dec2hex(212,2)];%由三组16进制数组成,分别为BGR对应的16进制
Data_Borders.Color=hex2dec(Color16);
end
end
end
exlWkbk.SaveAs(filename);
exlWkbk. Close;
exl.Quit;
exl.delete;
end
function Excel_Data=Read_Excel(filename)
%读取ReadMe文件
exl = actxserver('excel.application');
exlWkbk=exl.Workbooks;
%打开excel文件
exlFile=exlWkbk.Open(filename);
Num_Sheets=exlFile.Sheets.Count;%总的sheet数量
Excel_Data=cell(Num_Sheets,2);%创建储存cell
%按照sheet进行遍历循环
for k=1:Num_Sheets
E_WS=exlFile.Worksheets;
E_WS.Item(k).Select;%选择第k个表格
%打开sheet表格
exlSheet1=exlFile.Sheets.Item(k);
Sheet_Name=exlSheet1.Name;%表格名字
%读取最大最小范围
%获取行数
robj2=exlSheet1.Columns.End(4);%exlSheet1.Columns.methods在这里可以查到
num_rows=robj2.row;
%获取列数
robj3=exlSheet1.Rows.End(2);
num_columns=robj3.column;
%生成储存矩阵,用stuct结构储存
Data_All=struct([]);
%遍历循环每个sheet内的单元格
for x=1:num_columns
X=x2columns(x);
%每行进行循环
for y=1:num_rows
dat_range=[X,num2str(y),':',X,num2str(y)];
%选中要读取的范围
rngObj=exlSheet1.Range(dat_range);
%读取范围内的数据内容
Data_I=rngObj.Value;%值
Data_All(y,x).Data=Data_I;
Data_Formula_I=rngObj.Formula;%公式
Data_All(y,x).Formula=Data_Formula_I;
%选中到Font上
Data_Font=rngObj.Font;
%查看字体颜色
Text_Color_I=dec2hex(Data_Font.Color,6);%由三组16进制数组成,分别为RGB对应的16进制
Data_All(y,x).TextColor=[hex2dec(Text_Color_I(1:2)),hex2dec(Text_Color_I(3:4)),hex2dec(Text_Color_I(5:6))];
%查看字体格式
Data_All(y,x).TextStyle=Data_Font.Name;%字体
Data_All(y,x).TextSize=Data_Font.Size;%文字大小
Data_All(y,x).IfBold=Data_Font.Bold;%是否加粗
Data_All(y,x).IfItalic=Data_Font.Italic;%是否倾斜
%选中到cell上
Data_Cells=rngObj.Cells;
%单元格数字格式
Format_I=Data_Cells.NumberFormat;%输出单元格数字格式
Data_All(y,x).Format=Format_I;
%宽度和高度
Width_I=Data_Cells.ColumnWidth;
Height_I=Data_Cells.RowHeight;
Data_All(y,x).Width=Width_I;
Data_All(y,x).Height=Height_I;
%查看对齐方式
A_X_I=Data_Cells.HorizontalAlignment;%水平对齐
A_Y_I=Data_Cells.VerticalAlignment;%垂直对齐
Data_All(y,x).XYAlignment=[A_X_I,A_Y_I];
%选中到Interior上
Data_Interior=rngObj.Interior;
%查看背景颜色
Data_BGColor_I=dec2hex(Data_Interior.Color,6);%由三组16进制数组成,分别为RGB对应的16进制
Data_All(y,x).BGColor=[hex2dec(Data_BGColor_I(1:2)),hex2dec(Data_BGColor_I(3:4)),hex2dec(Data_BGColor_I(5:6))];
end
end
Excel_Data{k,1}=Sheet_Name;
Excel_Data{k,2}=Data_All;
end
%关闭
exlWkbk.Close;
exl.Quit;
exl.delete;
end
function X=x2columns(x)
%生成列编号
if x<=26
X=char(abs('A')-1+x);
elseif x<702
X=[char(abs('A')-1+ fix((x-1)/26) ),char(abs('A')-1+mod(x-1,26)+1)];
elseif x==702
X='ZZ';
elseif x<=16384
X=[char(abs('A')-1+ fix(x/26/26) ),char(abs('A')-1+ fix((x-1)/26)-fix(x/26/26)*26 ),char(abs('A')-1+mod(x-1,26)+1)];
elseif x>16384
error('列数过多,目前程序不支持,请自行更改代码')
end
end
一些相应的选项在下面介绍。
水平对齐 HorizontalAlignment 选项
名称 | 值 |
---|---|
居中 | -4108 |
靠左 | -4131 |
靠右 | -4152 |
两端对齐 | -4130 |
跨列居中 | 7 |
参考:https://docs.microsoft.com/zh-cn/office/vba/api/excel.xlhalign
垂直对齐 VerticalAlignment 选项
名称 | 值 |
---|---|
靠下 | -4107 |
居中 | -4108 |
靠上 | -4160 |
参考:https://docs.microsoft.com/zh-cn/office/vba/api/excel.xlvalign
边框样式说明
名称 | 值 |
---|---|
实线 | 1 |
无线条 | -4142 |
虚线 | -4115 |
双实线 | -4119 |
点划线 | 4 |
参考:https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.office.interop.excel.xllinestyle?view=excel-pia
区域边框位置
名称 | 值 |
---|---|
左上角到右下角的边框 | 5 |
左下角到右上角的边框 | 6 |
区域底部的边框 | 9 |
区域左边缘的边框 | 7 |
区域右边缘的边框 | 10 |
区域顶部的边框 | 8 |
所有单元格的水平边框 | 12 |
所有单元格的垂直边框 | 11 |
参考:https://docs.microsoft.com/zh-cn/office/vba/api/excel.xlbordersindex
颜色说明
比如Excel中的颜色值为16422450,则转换为RGB需要:
1 将16422450转换为16进制:'FA9632'
2 将这个16进制划分为3部分,分别对应B通道'FA',G通道'96',和R通道'32'
3 将这3个16进制转换为10进制,则对应B通道250,G通道150,和R通道50
4 这个颜色的RGB为:[50,150,250]
2.1.1 应用1:利用Excel画画
原理,利用Matlab设置每个单元的颜色,调整好长宽。其余都是空。利用这个也可以实现不同数值不同的背景颜色效果。
涉及到自定义数据,和修改现有的Excel文件。
把视图缩放设为25%,最终输出效果:
相关代码
clear
clc
%绘制excel画
C=imread('landOcean.jpg');
C2=imresize(C, [128,256]);
xLength=size(C2,2);
yLength=size(C2,1);
%创建生成Excel用到的数据
Data_K=struct([]);
for x=1:xLength
for y=1:yLength
%其余变量都是空和默认
Data_K(y,x).Data=NaN;
Data_K(y,x).Formula='';
Data_K(y,x).TextColor=[0,0,0];
Data_K(y,x).TextStyle='等线';
Data_K(y,x).TextSize=11;
Data_K(y,x).IfBold=false;
Data_K(y,x).IfItalic=false;
Data_K(y,x).Format='G/通用格式';
Data_K(y,x).XYAlignment=[1,-4107];
%只设置宽度和颜色
Data_K(y,x).Width=0.4374*4;%代表4mm
Data_K(y,x).Height=2.7682*4;%代表4mm
Color=[C2(y,x,3),C2(y,x,2),C2(y,x,1)];%BGR的顺序
%Color16=[dec2hex(Color(1),2),dec2hex(Color(2),2),dec2hex(Color(3),2)];%由三组16进制数组成,分别为BGR对应的16进制
Data_K(y,x).BGColor=Color;
end
end
Excel_Data=cell(1,2);
Excel_Data{1,1}='landOcean';%Sheet名称
Excel_Data{1,2}=Data_K;
%将数据写入到Excel
Write_Excel('landOcean.xlsx',Excel_Data)
%下面代码为删除边框用
exl=actxserver('excel.application');
exlWkbk=exl.Workbooks;
%打开excel文件
exlFile=exlWkbk.Open('landOcean.xlsx');
exlSheet1=exlFile.Sheets.Item(1);
%选择图像范围
X=x2columns(xLength);
dat_range=['A1:',X,num2str(yLength)];
rngObj=exlSheet1.Range(dat_range);
%删除边框
Data_Borders=rngObj.Borders;
Data_Borders.LineStyle=-4142;
%之后处理收尾
exlFile.Save;%修改之后必须保存
exlWkbk.Close;
exl.Quit;
exl.delete;
function Write_Excel(filename,Excel_Data)
% file=fullfile(pwd, file);%加上全路径
exl=actxserver('excel.application');
exlWkbk=exl.WorkBooks.Add();
E_WS=exlWkbk.Worksheets;
%创建N个表格
sheet_N=size(Excel_Data,1);
for k=1:sheet_N
E_WS.Item(k).Select;%选择第k个表格
E_WS_k=E_WS.Item(k);
E_WS_k.Name=Excel_Data{k,1};%建立名字
if sheet_N>1 && k<sheet_N
E_WS.Item(1).Select;%选择第一个表格
E_WS.Add([], E_WS.Item(E_WS.Count));%在后面添加一个新sheet
end
E_WS.Item(k).Select;%重新选择回第k个表格
exlSheet1=exl.Activesheet;%选中当前工作表
Data_K=Excel_Data{k,2};%获取当前工作表数据
num_rows=size(Data_K,1);%行数
num_columns=size(Data_K,2);%列数
for x=1:num_columns
X=x2columns(x);%把列转换为Excel的索引格式
for y=1:num_rows
dat_range=[X,num2str(y),':',X,num2str(y)];
%选中要写入的范围
rngObj=exlSheet1.Range(dat_range);
%选中到Font上
Data_Font=rngObj.Font;
%写入字体颜色
Color10=Data_K(y,x).TextColor;
Color16=[dec2hex(Color10(1),2),dec2hex(Color10(2),2),dec2hex(Color10(3),2)];%由三组16进制数组成,分别为BGR对应的16进制
Data_Font.Color=hex2dec(Color16);
%改变字体格式
Data_Font.Name=Data_K(y,x).TextStyle;%字体
Data_Font.Size=Data_K(y,x).TextSize;%文字大小
Data_Font.Bold=Data_K(y,x).IfBold;%是否加粗
Data_Font.Italic=Data_K(y,x).IfItalic;%是否倾斜
%选中到cell上
Data_Cells=rngObj.Cells;
%单元格数字格式
Data_Cells.NumberFormat=Data_K(y,x).Format;%输出单元格数字格式
%宽度和高度
Data_Cells.ColumnWidth=Data_K(y,x).Width;
Data_Cells.RowHeight=Data_K(y,x).Height;
%设置对齐方式
XYA=Data_K(y,x).XYAlignment;
Data_Cells.HorizontalAlignment=XYA(1);%水平对齐
Data_Cells.VerticalAlignment=XYA(2);%垂直对齐
%选中到Interior上
Data_Interior=rngObj.Interior;
%设置背景颜色
Color10=Data_K(y,x).BGColor;
Color16=[dec2hex(Color10(1),2),dec2hex(Color10(2),2),dec2hex(Color10(3),2)];%由三组16进制数组成,分别为BGR对应的16进制
Data_Interior.Color=hex2dec(Color16);
%写入范围内的数据内容
if strcmp(Data_K(y,x).Data,Data_K(y,x).Formula)
rngObj.Value=Data_K(y,x).Data;%值
else
rngObj.Formula=Data_K(y,x).Formula;%公式
end
%设置边框(默认边框)
Data_Borders=rngObj.Borders;
Color16=[dec2hex(212,2),dec2hex(212,2),dec2hex(212,2)];%由三组16进制数组成,分别为BGR对应的16进制
Data_Borders.Color=hex2dec(Color16);
end
end
end
exlWkbk.SaveAs(filename);
exlWkbk.Close;
exl.Quit;
exl.delete;
end
function X=x2columns(x)
%生成列编号
if x<=26
X=char(abs('A')-1+x);
elseif x<702
X=[char(abs('A')-1+ fix((x-1)/26) ),char(abs('A')-1+mod(x-1,26)+1)];
elseif x==702
X='ZZ';
elseif x<=16384
X=[char(abs('A')+ fix((x-703)/26/26) ),char(abs('A')+mod(fix( (x-703)/26 ),26) ),char(abs('A')+mod(x-1,26))];
elseif x>16384
error('列数过多,目前程序不支持,请自行更改代码')
end
end
这个程序速度较慢。如果想加快速度,可以删除掉除了颜色以外的其余内容代码,比如Font、对齐方式、边框设置等。
2.2 纯数据的快速写入编辑
如果一个一个单元进行编辑设置,速度会很慢,所以为了加快速度,可以直接范围进行设置数值。
下面展示一个程序,生成5个sheet的Excel表格,每个sheet表格重新命名,并写入数据。没有任何其余格式设置,写入速度快,适合快速的批量生成Excel。
代码如下:
clear
clc
close all
file='WriteIt.xlsx';
% file=fullfile(pwd, file);
exl=actxserver('excel.application');
exlWkbk=exl.WorkBooks.Add();
E_WS=exlWkbk.Worksheets;
%创建5个表格
sheet_N=5;
for k=1:sheet_N
E_WS.Item(k).Select;%选择第k个表格
E_WS_k=E_WS.Item(k);
E_WS_k.Name=['表格',num2str(k)];
if sheet_N>1 && k<sheet_N
E_WS.Item(1).Select;%选择第一个表格
E_WS.Add([], E_WS.Item(E_WS.Count));%在后面添加一个新sheet
end
E_WS.Item(k).Select;%选择第k个表格
%创建数据和写入范围
Size=2*k+1;
A=magic(Size);
data=num2cell(A);
range=['A1:',char(abs('A')-1+Size),num2str(Size)];
%整体赋值方法
E_WS.Item(k).Select;%选择第k个表格
ran=exl.Activesheet.get('Range', range);
ran.value=data;
end
exlWkbk.SaveAs(file);
exlWkbk. Close;
exl.Quit;
exl.delete;
2.3 Excel中图表Chart的绘制
这里大量借鉴了Excel录制的宏代码。首先创建一个没有数据的表格,然后再添加数据。
输出效果:
matlab的代码如下
clear
clc
close all
file='Test.xlsx';
%创建文件
exl=actxserver('excel.application');
exlWkbk=exl.WorkBooks.Add();
E_WS=exlWkbk.Worksheets;
%选择第一个表格
E_WS.Item(1).Select
%exlSheet1=exlFile.Sheets.Item(1);
%选中当前活动表格
exlASh=exl.Activesheet;
%添加数据
data=num2cell(rand(5,2));
range='A1:B5';
ran=exl.Activesheet.get('Range', range);
ran.value=data;
%选择当前表格中的形状选项
exlASh_Shape=exlASh.Shapes;
%选择最开始的数据(这个数据是为了创建表格用)
exlASh.Range('A1:A2').Select;
%添加表格
Exl_AddCh=exlASh_Shape.AddChart2();%默认是直方图
Exl_Ch=Exl_AddCh.Chart;
Exl_Ch.ChartType='xlXYScatterSmooth';
Exl_Ch.FullSeriesCollection(1).Delete;
%重新定义系列和数据点
Exl_Ch.SeriesCollection.NewSeries;
Ch_Data_1=Exl_Ch.FullSeriesCollection(1);%系列1
Ch_Data_1.Name='系列1';
Ch_Data_1.XValues='=Sheet1!$A$1:$A$5';
Ch_Data_1.Values='=Sheet1!$B$1:$B$5';
%添加和更改坐标轴名称
Exl_Ch.Axes(1).HasTitle=true;
Exl_Ch.Axes(2).HasTitle=true;
Ch_Tt_X=Exl_Ch.Axes(1).AxisTitle;
Ch_Tt_X.Caption='X轴';
Ch_Tt_Y=Exl_Ch.Axes(2).AxisTitle;
Ch_Tt_Y.Caption='Y轴';
%添加趋势线
Trend_1=Exl_Ch.FullSeriesCollection(1).Trendlines.Add;
Trend_1.DisplayEquation=true;
Trend_1.DisplayRSquared=true;
%更改Chart位置和大小
exlASh_Shape1=exlASh_Shape.Item(1);
exlASh_Shape1.Top=50;
exlASh_Shape1.Left=160;
exlASh_Shape1.Height=300;
exlASh_Shape1.Width=300;
%保存
exlWkbk.SaveAs(file);
%exlFile.Save;%如果对文件进行读取和修改,用这个
%关闭程序
exlWkbk. Close;
exl.Quit;
exl.delete;
其中,不同图形的名称可以利用excel录制宏的方式查到。以下举几个例子:
名称 | 值 |
---|---|
柱形图 | xlColumnClustered |
直方图 | xlHistogram |
饼状图 | xlPie |
散点图 | xlXYScatter |
平滑曲线连接的散点图 | xlXYScatterSmooth |
平滑曲线连接的散点图(没点) | xlXYScatterSmoothNoMarkers |