Hi Thomas
Ah great, thanks for testing it with Excel 2010. Its good to know it works for both. I will cut Microsoft some slack then, at least their changes to the API from 2003 onwards didn't break backwards compatibility then.
I need a break from wrestling with this, I will do a bit more on it tomorrow, as I need the chart to appear in the data sheet rather than a separate sheet and need to add some other small things. Hopefully that wont be as fiddly.
Geoff
> From: Thomas.Buergel@varian.com
> To: lua-l@lists.lua.org
> Date: Mon, 4 May 2015 18:28:16 +0000
> Subject: RE: Frustration with Luacom and Excel
>
> Hi Geoff,
>
> Nice :) You get used to the peculiarities after a while.
>
> > Full working code below.
> > Note for future "Googlers", this sample works for Excel 2003 but almost certainly
> > wont work for Excel 2010. (Just use Thomas's earlier snippet for later Excel versions)
>
> I just tried it with Excel 2010. It works there, too, so yours is the more compatible/generic version.
>
> Cheers,
> Tom
>
> ---
> From: lua-l-bounces@lists.lua.org [mailto:lua-l-bounces@lists.lua.org] On Behalf Of Geoff Smith
> Sent: Monday, May 04, 2015 8:18 PM
> To: Lua mailing list
> Subject: RE: Frustration with Luacom and Excel
>
> Hi Thomas
>
> Yay, cracked it !!! . With your help I managed to get it working now with Excel 2003
>
> Lots more trial and error and persistence, this is what I discovered
>
> You were right , for Excel 2003 you need 1 less level of indirection. I.e
>
> local chart = graphsheet:ChartObjects():Add(xOffset, yOffset, width, height)
>
> But that still didn't work, it wouldn't let me do the setSourceData() on the chart object.
>
> I changed that slightly to be
>
> chart:Activate()
>
> -- associate the source data with the chart
> excel.ActiveChart:SetSourceData(sourceData)
>
> It was happy to do it that way, must just be differences between 2003 and 2010
>
> It still didn't work though, as it wouldn't set the Title properties. The reason for this is that its very fussy about ordering of lines.
>
> The order must be xxx.ChartTitle.Text must be after xxx.HasTitle, and both of these must be after the SetSourceData, else it doesn't work.
>
>
> Full working code below.
> Note for future "Googlers", this sample works for Excel 2003 but almost certainly wont work for Excel 2010. (Just use Thomas's earlier snippet for later Excel versions)
>
> Thanks again
>
> Geoff
>
>
>
> -----------------------------------------------------------------------
>
> local luacom = require "luacom"
>
> local function GetExcel()
> local excel = luacom.GetObject("Excel.Application")
> if not excel then
> excel = luacom.CreateObject("Excel.Application")
> end
> if not excel then
> return false, "Can't instantiate Excel"
> end
> local typeinfo = luacom.GetTypeInfo(excel)
> local typelib = typeinfo:GetTypeLib()
> local enums = typelib:ExportEnumerations()
> return excel, enums
> end
>
> local excel, xlenums = assert(GetExcel())
>
> -- add a simple line chart from the data in "datasheet",
> -- place the chart in "graphsheet"
> local function AddGraph(graphsheet, datasheet)
> local width, height = 640, 320
> local xOffset, yOffset = 32, 32
> -- add the chart at the specified location
> local chart = graphsheet:ChartObjects():Add(xOffset, yOffset, width, height)
> -- set the chart type
> chart.ChartType = xlenums.XlChartType.xlLine
> -- figure out how large our data set is
> local numRows = datasheet.Columns(1):End(xlenums.XlDirection.xlDown).Row
> local numColumns = datasheet.Rows(1):End(xlenums.XlDirection.xlToRight).Column
> -- this range describes the data set to add to the chart
> local sourceData = datasheet:Range(datasheet.Cells(1, 1), datasheet.Cells(numRows, numColumns))
> chart:Activate()
> -- associate the source data with the chart
> excel.ActiveChart:SetSourceData(sourceData)
> excel.ActiveChart.HasTitle = true
> excel.ActiveChart.ChartTitle.Text = graphsheet.Name .. " for " .. datasheet.Name
> return chart
> end
>
> ---------------------------- Main code starts here ------------------------------
>
> -- add a new workbook
> local book = excel.Workbooks:Add()
> -- use sheet 1 for the data
> local sheet1 = book.Worksheets(1)
> sheet1.Name = "Data"
> -- and sheet 2 for the graph
> local sheet2 = book.Worksheets(2)
> sheet2.Name = "Chart"
> excel.Visible = true
> excel.DisplayAlerts = false
> math.randomseed(os.time())
> -- create three columns, 100 entries each, of data
> for col=1, 3 do
> -- row 1: title
> sheet1.Cells(1, col).Value2 = ("Data series %d"):format(col)
> -- row 2-100: data
> for row=2, 100 do
> sheet1.Cells(row, col).Value2 = math.floor(math.random() * 100)
> end
> end
> -- add a graph on sheet 2, taking its data from sheet 1
> AddGraph(sheet2, sheet1)
> --~ book:SaveAs([[c:\mygraph.xls]])
> --~ book:Close()
>
>
>
>
>
>
>
>
>
>
>
> > From: Thomas.Buergel@varian.com
> > To: lua-l@lists.lua.org
> > Date: Mon, 4 May 2015 15:45:50 +0000
> > Subject: RE: Frustration with Luacom and Excel
> >
> > Hi Geoff,
> >
> > > Was that a typo in your reply ? you said "version of Excel, which, in my case, is 2003"
> >
> > Yes, sorry, you're absolutely right - the version on my end is *2010*. :)
> >
> > BTW, after lots of digging I seem to have found the Excel 2003 official documentation. It seems somewhat complete but not quite...
> >
> > Entry point: https://msdn.microsoft.com/en-us/library/aa220733%28v=office.11%29.aspx
> > How-to for charts (VBA): https://msdn.microsoft.com/en-us/library/aa203725%28v=office.11%29.aspx
> >
> > Maybe the changes to the Excel API weren't so large, but my example is just using it in a 2010-only way. I don't know enough about Excel to say what's the case, though setting a title of a chart seems like something that must have been there from day 1.
> >
> > Good luck with getting it running the way you want.
> >
> > Tom
> >
> >
>