xlsgen > overview > Visual components |
Visual components
xlsgen has an open architecture which allows general-purpose ActiveX controls to be instantiated, parametrized using Excel formulas, and create snapshot pictures in Excel.
Visual components are a very powerful feature of xlsgen that goes beyond Excel capabilities :
The xlsgen install has a sample code called visual component written in no less than 7 programming languages, showing the basics of visual components.
Also, xlsgen installs four such controls :
A Vumeter
A vumeter is an ActiveX control whose purpose is to provide a clue of where a target value is inside boundaries. A vumeter can be customized like changing colors in order to put an emphasis, adding a title, and so on.
What identifies the vumeter as an ActiveX control is the unique identifier : Vumeter.ARsTdesign.1.
Here is an example of how to instantiate a vumeter using xlsgen code.
Java code |
// create a vumeter, and customize it XlsWorksheet wksht = workbook.AddWorksheet("sheet"); // NewVisualComponent(progId, row1, col1, row2, col2, // topoffset, leftoffset, bottomoffset, rightoffset) XlsVisualComponent compVumeter = wksht.NewVisualComponent("Vumeter.ARsTdesign.1", 1,1, 10,3, 0,0,0,0); wksht.putNumber(4,4, 65); // setting parameter: Value compVumeter.getParameterByName("SetValue").putFormula("=$D$4"); // reading parameter: Value String value = compVumeter.getParameterByName("GetValue").getFormula(); // setting parameter: Title compVumeter.getParameterByName("SetTitle").putValueAsLabel("(revenue)"); // setting parameter: ColorRightSlice compVumeter.getParameterByName("SetColorRightSlice").putFormula("=8947967"); // RGB shade of blue (8947967 = 0x8888FF) |
VB code |
' create a vumeter, and customize it Dim wksht As IXlsWorksheet Set wksht = workbook.AddWorksheet("sheet") ' NewVisualComponent(progId, row1, col1, row2, col2, ' topoffset, leftoffset, bottomoffset, rightoffset) Dim compVumeter As IXlsVisualComponent Set compVumeter = wksht.NewVisualComponent("Vumeter.ARsTdesign.1", _ 1, 1, 10, 3, 0, 0, 0, 0) wksht.Number(4, 4) = 65 ' setting parameter: Value compVumeter.ParameterByName("SetValue").Formula = "=$D$4" ' reading parameter: Value Dim value As String value = compVumeter.ParameterByName("GetValue").Formula ' setting parameter: Title compVumeter.ParameterByName("SetTitle").ValueAsLabel = "(revenue)" ' setting parameter: ColorRightSlice compVumeter.ParameterByName("SetColorRightSlice").Formula = "=8947967" ' 8947967 = &H8888FF |
C# code |
// create a vumeter, and customize it IXlsWorksheet wksht = workbook.AddWorksheet("sheet"); // NewVisualComponent(progId, row1, col1, row2, col2, // topoffset, leftoffset, bottomoffset, rightoffset) IXlsVisualComponent compVumeter = wksht.NewVisualComponent("Vumeter.ARsTdesign.1", 1,1, 10,3, 0,0,0,0); wksht.set_Number(4,4, 65); // setting parameter: Value compVumeter.get_ParameterByName("SetValue").Formula = "=$D$4"; // reading parameter: Value String val = compVumeter.get_ParameterByName("GetValue").Formula; // setting parameter: Title compVumeter.get_ParameterByName("SetTitle").ValueAsLabel = "(revenue)"; // setting parameter: ColorRightSlice compVumeter.get_ParameterByName("SetColorRightSlice").Formula = "=8947967"; // RGB shade of blue (8947967 = 0x8888FF) |
C/C++ code |
// create a vumeter and customize it // xlsgen::IXlsWorksheetPtr wksht = workbook->AddWorksheet(L"sheet"); // NewVisualComponent(progId, row1, col1, row2, col2, // topoffset, leftoffset, bottomoffset, rightoffset) xlsgen::IXlsVisualComponentPtr comp = wksht->NewVisualComponent(L"Vumeter.ARsTdesign.1", 1,1, 10,3, 0,0,0,0); wksht->Number[4][4] = 65; // setting parameter: Value comp->ParameterByName[L"SetValue"]->Formula = L"=$D$4"; // reading parameter: Value _bstr_t value = comp->ParameterByName[L"GetValue"]->Formula; // setting parameter: Title comp->ParameterByName[L"SetTitle"]->ValueAsLabel = L"(revenue)"; // setting parameter: ColorRightSlice comp->ParameterByName[L"SetColorRightSlice"]->Formula = L"=8947967"; // shade of blue (8947967 = 0x8888FF) |
The vu-meter comes as part of the xlsgen package, but you can of course use any other third-party vu-meter ActiveX control out there. The vu-meter from the xlsgen package has the following programmable properties :
Min
: minimum value to be taken into account. Defaults to 0.
Max
: maximum value to be taken into account. Defaults to 100.
Value
: the value to display.
OldValue
: sets the old value to display. The old value and current value are both displayed.
Title
: optional title to display.
ColorRightSlice
: 24-bit RGB color of the slice on the right of the value.
ColorLeftSlice
: 24-bit RGB color of the slice on the left of the value.
ColorOfValue
: 24-bit RGB color of the value.
A Vumeter with different parameters
Microsoft ships Visual Basic 6.0 with a freely redistribuable chart control. If you have not installed Visual Basic 6.0, it is probable you can't use this ActiveX control. The corresponding file is C:\Windows\System32\MSCHRT20.OCX, which is an ActiveX control. The identifier is : MSChart20Lib.MSChart.2. This ActiveX control has nothing to do with Excel. Here is an example of how to use it, what we do is set the data source to draw the bar columns from.
The Microsoft chart control
Java code |
// create a chart, and attach two series XlsVisualComponent compChart = wksht.NewVisualComponent("MSChart20Lib.MSChart.2", 1,5, 14,8, 0,0,0,0); wksht.putLabel(4,6, "revenue"); wksht.putNumber(5,6, 50); wksht.putNumber(6,6, 70); wksht.putNumber(7,6, 100); wksht.putNumber(8,6, 60); wksht.putLabel(4,7, "cost"); wksht.putNumber(5,7, 50); wksht.putNumber(6,7, 40); wksht.putNumber(7,7, 30); wksht.putNumber(8,7, 20); // setting parameter: ChartData XlsVisualComponentParameter paramChartData = compChart.getParameterByName("SetChartData"); paramChartData.putFormula("=$F$4:$G$8"); |
VB code |
' create a chart, and attach two series Dim compChart As IXlsVisualComponent Set compChart = wksht.NewVisualComponent("MSChart20Lib.MSChart.2", _ 1, 5, 14, 8, 0, 0, 0, 0) wksht.Label(4, 6) = "revenue" wksht.Number(5, 6) = 50 wksht.Number(6, 6) = 70 wksht.Number(7, 6) = 100 wksht.Number(8, 6) = 60 wksht.Label(4, 7) = "cost" wksht.Number(5, 7) = 50 wksht.Number(6, 7) = 40 wksht.Number(7, 7) = 30 wksht.Number(8, 7) = 20 ' setting parameter: ChartData Dim paramChartData As IXlsVisualComponentParameter Set paramChartData = compChart.ParameterByName("SetChartData") paramChartData.Formula = "=$F$4:$G$8" |
C# code |
// create a chart, and attach two series IXlsVisualComponent compChart = wksht.NewVisualComponent("MSChart20Lib.MSChart.2", 1,5, 14,8, 0,0,0,0); wksht.set_Label(4,6, "revenue"); wksht.set_Number(5,6, 50); wksht.set_Number(6,6, 70); wksht.set_Number(7,6, 100); wksht.set_Number(8,6, 60); wksht.set_Label(4,7, "cost"); wksht.set_Number(5,7, 50); wksht.set_Number(6,7, 40); wksht.set_Number(7,7, 30); wksht.set_Number(8,7, 20); // setting parameter: ChartData IXlsVisualComponentParameter paramChartData = compChart.get_ParameterByName("SetChartData"); paramChartData.Formula = "=$F$4:$G$8"; |
C/C++ code |
// create a chart (using the Microsoft chart control) // xlsgen::IXlsVisualComponentPtr comp = wksht->NewVisualComponent(L"MSChart20Lib.MSChart.2", 1,5, 14,8, 0,0,0,0); wksht->Label[4][6] = L"revenue"; wksht->Number[5][6] = 50; wksht->Number[6][6] = 70; wksht->Number[7][6] = 100; wksht->Number[8][6] = 60; wksht->Label[4][7] = L"cost"; wksht->Number[5][7] = 50; wksht->Number[6][7] = 40; wksht->Number[7][7] = 30; wksht->Number[8][7] = 20; // setting parameter: ChartData xlsgen::IXlsVisualComponentParameterPtr param = comp->ParameterByName[L"SetChartData"]; param->Formula = L"=$F$4:$G$8"; |
sparklines
See sparklines.
Google charts
There is a dedicated page in the documentation.
Geomaps
There is a dedicated page in the documentation.
Bubble clouds
There is a dedicated page in the documentation.
Traffic lights
There is a dedicated page in the documentation.
Gauge
There is a dedicated page in the documentation.
It is possible to not only insert and render any ActiveX control, also to create snapshots at any moment. Towards that end, the IXlsVisualComponent interface includes extraction methods :
By iterating the mechanism 1) setting values to parameters 2) rendering, you can build interactive or sequential snapshots of controls. For instance, this can be used in interactive business intelligence dashboards.
Once you know the identifier (progId) of the ActiveX control, you can run it. If you don't set any of its parameters, it can still render into a snapshot that can be inserted in an Excel spreadsheet, but the interesting scenarios occur by working with parameters. ActiveX controls usually provide a healthy number of parameters to customize their behavior and layout. For instance, if you are working with a chart control, expect to be able to select the chart type, the data source, and so on.
To get the list of parameters, you can do it in at least two ways :
Using the object browser to get the list of parameters
Java code |
// create a vumeter and list the parameters XlsVisualComponent compVumeter = wksht.NewVisualComponent("Vumeter.ARsTdesign.1", 1,1, 10,3, 0,0,0,0); long nbParameters = compVumeter.getCount(); for (int i = 1; i <= nbParameters; i++) { XlsVisualComponentParameter param = compVumeter.getParameterByIndex(i); String name = param.getName(); int t = param.getType(); String nativeType = param.getNativeType(); } |
VB code |
' create a vumeter and list the parameters Dim compVumeter As IXlsVisualComponent Set compVumeter = wksht.NewVisualComponent("Vumeter.ARsTdesign.1", _ 1, 1, 10, 3, 0, 0, 0, 0) Dim nbParameters nbParameters = compVumeter.Count For i = 1 To nbParameters Dim param As IXlsVisualComponentParameter Set param = compVumeter.ParameterByIndex(i) Dim name As String name = param.name Dim t t = param.Type Dim nativeType As String nativeType = param.nativeType Next |
C# code |
// create a vumeter and list the parameters IXlsVisualComponent compVumeter = wksht.NewVisualComponent("Vumeter.ARsTdesign.1", 1,1, 10,3, 0,0,0,0); long nbParameters = compVumeter.Count; for (int i = 1; i <= nbParameters; i++) { IXlsVisualComponentParameter param = compVumeter.get_ParameterByIndex(i); String name = param.Name; enumDataType t = param.Type; String nativeType = param.NativeType; System.Console.WriteLine("{0} ({1})", name, nativeType); } |
C/C++ code |
// create a vumeter and list the parameters // xlsgen::IXlsVisualComponentPtr comp = wksht->NewVisualComponent(L"Vumeter.ARsTdesign.1", 1,1, 10,3, 0,0,0,0); long nbParameters = comp->Count; for (long i = 1; i <= nbParameters; i++) { xlsgen::IXlsVisualComponentParameterPtr param = comp->ParameterByIndex[i]; _bstr_t name = param->Name; int t = param->Type; _bstr_t nativeType = param->NativeType; WCHAR s[256]; swprintf(s, L"%s (%s)\r\n", (LPWSTR)name, (LPWSTR)nativeType); OutputDebugStringW(s); } |
A number of programming environments allow to build your own ActiveX controls. Whether you are working with VB, Delphi, C++, VB.NET/C#, there is always a way to do it. Here are a couple suggestions :
xlsgen documentation. © ARsT Design all rights reserved.