使用Matlab来创build具有范围内X和Y值的Excel图表

我有大约20列的数据,每行〜20,000行。 所有的计算都在Matlab中完成,然后创build图表。

不幸的是,我需要整个输出在Excel文件中,包括几个可编辑的图表。 使用xlswrite我创build了Excel文件,现在我正在努力按照自己的方式创build图表。

我尝试使用这个代码,但有几个错误,无法select图表的X和Y值。

  Excel = actxserver('Excel.Application'); WB = Excel.workbooks.Open('D:\...\Test.xlsx'); Charts = WB.Charts; Chart = invoke(Charts,'Add'); invoke(Chart, 'SetSourceData', Excel.Range('Sheet1!$B$2:$B$16')); %% here an error occurs 

错误:

使用COM.Excel_Application / Range时出错。 对象返回的错误代码:0x800A03EC“

我还没有find任何解决scheme通过在Matlab中的ActiveX对象添加图表。 我在这个主题find的任何post都过时或无益。


总结 ,我的问题是:

  • 如何使用Matlab在Excel中插入图表(使用一般的,最新的ActiveX代码结构)。
  • 我怎样才能selectXValue和YValues(范围)
  • 我怎样才能访问图表标题,轴线,线条外观和图例

我正在使用Excel 2016和Matlab R2017a。


编辑:

在这个星期里,我开发了一个自己的解决scheme,但仍然不能很好地工作,但是接近我想要的。 你可以看看这个代码:

重要的只是图表1。 我想将XValue设置为B列 ,将YValues设置为sheet1(Tabelle1)的H-P列

 %%%%% general Code to insert a Chart in Excel using Matlab %%%%% %% start Excel and open Workbook excel = actxserver('Excel.Application'); wb = excel.Workbooks.Open('C:\...\Test.xlsx'); %% makes the created sheet visible excel.Visible = true; %% add 1. Chart chart1 = wb.Charts.Add; %% set source data chart1.SetSourceData(wb.Worksheets.Item('Tabelle1').Range('$B:$B, $H:$P')); % 'Tabelle1' is the german equal to sheet1, my excel is german %% Name chart sheet chart1.Name = '1. TestChart'; %% Set chart title, see https://msdn.microsoft.com/en-us/library/office/ff196832.aspx chart1.HasTitle = true; chart1.ChartTitle.Text = 'Test Title'; %% Set chart types, see https://msdn.microsoft.com/en-us/library/office/ff837417.aspx chart1.ChartType = 'xlXYScatterSmoothNoMarkers'; %% Set chart legend, see https://msdn.microsoft.com/en-us/library/office/ff821884.aspx chart1.HasLegend = true; %% Set Axes Titles chart1.Axes(1).HasTitle = true; chart1.Axes(1).AxisTitle.Text = 'Time [s]'; % XAxes chart1.Axes(2).HasTitle = true; chart1.Axes(2).AxisTitle.Text = 'Temperature[°C]'; %YAxes %% add 2nd chart chart2 = wb.Charts.Add([], chart1); %place after chart1 chart2.SetSourceData(wb.Worksheets.Item('Tabelle1').Range('$B:$B, $Q:$Q')); % ... same procedure as above %% use to quit all open Excel processes % excel.Quit; 

发生另一个错误:

错误使用Interface.000208D8_0000_0000_C000_000000000046 /范围

错误:对象返回的错误代码:0x800A03EC

CodeTestmy错误(第13行)chart1.SetSourceData(wb.Worksheets.Item('Tabelle1')。Range('$ B:$ B,$ H:$ P'));


现在这个问题已经接近答案了。 对于进一步的错误相关的答案有一个相关的问题看看

正如我在评论中所build议的那样,一个更好的logging方法是使用VBA。 碰巧,VBA文档实际上可以用来直接从Matlab与COM对象进行交互的大部分猜测,因为语法是类似的。

这里是一些更新的Matlab代码,它实现了你的三点。 我已经在适当的地方提供了MSDN文档的链接:

 % Start Excel and open workbook Excel = actxserver('Excel.Application'); WB = Excel.Workbooks.Open('C:\...\test.xlsx'); % Show the workbook Excel.visible = 1; % Add chart Chart = invoke(WB.Charts,'Add'); % Get Sheet object SheetObj = Excel.Worksheets.get('Item', 'Sheet1'); % Name chart sheet Chart.Name = 'TestChart'; % Set source data range of chart % X and Y data can also be set to Matlab arrays, by Srs.Values and Srs.XValues, ensuring equal length % Y data Srs = Chart.SeriesCollection.Add(SheetObj.Range('B2:B16')); % X data, could be a Matlab array of correct length Srs.XValues = SheetObj.Range('A2:A16'); % Series name Srs.Name = 'Test Series'; % For chart types, see https://msdn.microsoft.com/en-us/library/office/ff837417.aspx Chart.ChartType = 'xlXYScatterSmooth'; % Set chart title, see https://msdn.microsoft.com/en-us/library/office/ff196832.aspx Chart.HasTitle = true; Chart.ChartTitle.Text = 'Test Title'; % Set chart legend, see https://msdn.microsoft.com/en-us/library/office/ff821884.aspx Chart.HasLegend = true; 

你的错误:

您遇到错误,因为您正在尝试访问Excel应用程序的Range对象。 这不存在! 所有Range对象都属于Sheet对象,这是我在上面的代码中首先检索的内容。


创造许多系列:

你说你有很多数据列,这里有一个方法可以通过循环来包含它们。 它还会find每列中最后一次使用的行。

 % ... CREATE WORKBOOK / CHART AS BEFORE ... % Chart.Name = 'TestChart'; % Set source data range of chart, do X and Y data for each series columns = 2:4; colnames = {'xdata', 'my series 1', 'my series 2', 'my series 3'}; for col = columns % Get Excel column *letter* from column *number* colchar = strrep([char(96+floor((col-1)/26)) char(97+rem(col-1,26))],char(96),''); % Last row of data, see https://msdn.microsoft.com/en-us/library/office/ff839539.aspx % Data must be contiguous (no gaps / blank cells) lastrow = num2str(SheetObj.Range([colchar, '2']).End('xlDown').Row); % Y data, creating range strings by concatenation of column character and row number Srs = Chart.SeriesCollection.Add(SheetObj.Range([colchar, '2:', colchar, lastrow])); % X data, same approach is used for last row, but only column = 1 = "A" Srs.XValues = SheetObj.Range(['A2:A', lastrow]); % Set column name, to use the first row do % Srs.Name = SheetObj.Range([colchar, '1']); Srs.Name = colnames{col}; end Chart.ChartType = 'xlXYScatterSmooth'; % % ... TITLE / LEGEND AS BEFORE ... 

输出图表和input“Sheet1”:

例


编辑:

在上面,我遍历列来填充y数据。 如果你知道列字母,那么你可以循环通过colchar而不是创build它。

 % There are shortcuts to creating a cell array of consecutive letters, % Like columnletters = cellstr(('H':'J')'); for colchar = {'H', 'I', 'J'}; % ... same as the above for loop, but don't need to get colchar from col lastrow = num2str(SheetObj.Range([colchar, '2']).End('xlDown').Row); Srs = Chart.SeriesCollection.Add(SheetObj.Range([colchar, '2:', colchar, lastrow])); Srs.XValues = SheetObj.Range(['A2:A', lastrow]); Srs.Name = SheetObj.Range([colchar, '1']); end