利用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 |