lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


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