利⽤matlab导⼊或读取数据⾄Excel(COM⽅法和xlswrite,xlsread⽅法)利⽤matlab导⼊或读取数据⾄Excel(COM⽅法和xlswrite、xlsread⽅法)
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⽅法
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);
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上
textstyle
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);
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);%hods在这⾥可以查到
num_w;
%获取列数
robj3=exlSheet1.Rows.End(2);
num_lumn;
%⽣成储存矩阵,⽤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
垂直对齐 VerticalAlignment 选项
名称值
靠下-4107
居中-4108
靠上-4160

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。