| xlsgen > overview > VB, VBA developer |
If you are a VB or VBA developer then this section will get you up and running. The remainder of this section assumes that xlsgen is already installed on your machine.
In your programming environment, click on Tools \ References as in the capture below : (please note the name of the menu options vary according to the language of your programming environment. The following assumes that an English version is being used.)

When the References dialog box, check out whether the component titled ExcelGenerator. ARsT design. is already listed and checked. If yes, then click on OK and you can skip what's below.
Click on the Browse button on the right, then browse the folders for the following file : c: \ program files \ xlsgen \ xlsgen.dll.

The component should appear, selected and checked as in the screen capture above. If the component does not show, it is either not installed, or not registered. Reinstall the software and pay attention to the message boxes that show up, if any. Please contact the technical support.
Click OK. Your project is ready to use xlsgen.
Objects and underlying programming interfaces can be looked up by bringing the object browser (hit F2). A screen capture like that one should appear :

Generating an Excel file always begin with a prologue, and always ends with an epilogue.
The prologue can be broken down as follows :
And this can be done with the following code :
| VB code |
Dim engine As CoXlsEngine
Set engine = CreateObject("ExcelGenerator.ARsTDesign")
Dim wbk As IXlsWorkbook
Set wbk = engine.New("c:\myfile.xls")
Dim wksht As IXlsWorksheet
Set wksht = wbk.AddWorksheet("sheet1")
... ' your code begins here
|
Then programming interfaces can be used to put content in cells, and add all the necessary code to generate the excel file.
Until you end up with the epilogue, which can be broken down as follows :
And this can be done with the following code :
| VB code |
... ' your code ends here wbk.Close Set engine = Nothing |
All in all, the entire code pattern is :
| VB code |
Sub mycustomcode()
' create a running instance of the generator
Dim engine As CoXlsEngine
Set engine = CreateObject("ExcelGenerator.ARsTDesign")
' create a new Excel file, and get a workbook to work with
Dim wbk As IXlsWorkbook
Set wbk = engine.New("c:\myfile.xls")
' create a new worksheet
Dim wksht As IXlsWorksheet
Set wksht = wbk.AddWorksheet("sheet1")
... ' your code begins here
' commit all the work, and make sure the .xls file is ready to use
wbk.Close
' free the memory from the running instance
Set engine = Nothing
End Sub
|
Please note that as you type VB code, intellisense provides you with all interfaces and objects involved, as in :

| ASP (VBScript, JScript) developer |
ASP specific informationIf xlsgen is used to generate and write Excel files on the file system (very likely), it must be ensured that the target folder has effectively been granted write permissions. Remember that when running a web application, the user is not the local interactive account, but ASP/ASPNET (or NETWORKSERVICE if you are running on Windows Server 2003) and those users are not granted such right for obvious reasons. Make sure to know that while there is no restriction or significant drawback to writing Excel files on the file system in general, xlsgen actually supports an in-memory scenario which does not require write permissions to be granted and is thus perhaps better suited to meet restricted environments. The xlsgen install comes with a code sample called 'inmemory' showing how to proceed. To grant write permissions to an ASP/ASP.NET web server :
If you do that, you are all set (no need to restart IIS). For instance, you can write a statement like xlsgenEngine.New(@"c:\tmp\test.xls"); and forget about access-denied errors. Note that you can do this as well from the IIS control panel. Just right-click there, create a virtual folder, and then proceed with the name alias, Write permission and actual file system folder. |
If you are a VBScript or JScript developer then this section will get you up and running. The remainder of this section assumes that xlsgen is already installed on the server-side.
An equivalent technique than for VB, VBA developers is required to start a session with ASP code. Below is an example of code pattern :
| ASP VBScript code |
<%@ Language="VBSCRIPT" %>
<%
Dim szOutputFolder
szOutputFolder = "c:\Inetpub\excelfiles\"
' create a server-side instance of the generator
If IsEmpty(Session("MyObj")) Then
Set Session("MyObj") = Server.CreateObject("ExcelGenerator.ARsTdesign")
End If
If Not(IsEmpty(Session("MyObj"))) Then
' create a new Excel file, and retrieve a workbook
Dim wbk
Set wbk = Session("MyObj").New(szOutputFolder & "myfile.xls")
' create a new worksheet
Dim wksht
Set wksht = wbk.AddWorksheet("sheet1")
' sample code
wksht.Label(9,1) = "hello world!"
' your code begins here
' ...
wbk.Close
' notify IIS of the actual Excel output
Response.Redirect szOutputFolder & "myfile.xls"
End If
%>
|
Since this code runs the generator on the server-side, the client machine need not xlsgen installed at all.
If you allow your web server to retrieve arbitrary buffer content from a physical file, then instead of redirecting the output to the .xls file above, you could just as well directly output the buffer along with the Excel MIME type. The destination machine at the other end needs to have Excel installed in order to see it automatically open. Code goes like this :
| ASP VBScript code, server-side code |
Response.Buffer = true Response.CacheControl = "no-cache" ' ... paste all the same than above ... ' grab the raw binary content from myfile.xls ' TODO : buffer = ... ( szOutputFolder & "myfile.xls" ) ' .XLS ==> application/vnd.ms-excel ' .XLSX ==> application/vnd.openxmlformats-officedocument.spreadsheetml.sheet ' .XLSM ==> application/vnd.ms-excel.sheet.macroEnabled.12 ' .XLTX ==> application/vnd.openxmlformats-officedocument.spreadsheetml.template ' .XLTM ==> application/vnd.ms-excel.template.macroEnabled.12 ' .XLAM ==> application/vnd.ms-excel.addin.macroEnabled.12 Response.ContentType = "application/vnd.ms-excel" Response.BinaryWrite ( buffer ) Response.End |
Please note that with scripting code, objects used are never typed, that's why the underlying programming interfaces never appear explicitely in the code.
Below is the equivalent code for JScript developers :
| ASP JScript code, server-side code |
<%@ Language="JSCRIPT" %>
<%
var szOutputFolder
szOutputFolder = "c:\\Inetpub\\excelfiles\\"
// create a server-side instance of the generator
var xlsgen = Server.CreateObject("ExcelGenerator.ARsTdesign")
// create a new Excel file, and retrieve a workbook
var wbk = xlsgen.New(szOutputFolder + "myfile.xls")
// create a new worksheet
var wksht = wbk.AddWorksheet("sheet1")
// sample code
wksht.Label(9,1) = "hello world!"
// your code begins here
// ...
wbk.Close()
Response.Redirect (szOutputFolder + "myfile.xls")
%>
|
There are ASP.NET code samples written in C# available in the install.
Instead of executing code on the server-side, you can, depending on the requirements, have the generator execute on the client-side. Of course, this requires xlsgen to be installed on the client-side.
Below is the VBScript and JScript code for client-side. Typical scenarios are local script execution.
| VBScript code, client-side code |
' xlsgen_clientside.vbs
' to run this code, double-click on the .vbs file
Dim szOutputFolder
szOutputFolder = "c:\excelfiles\"
Dim xlsgen
Set xlsgen = CreateObject("ExcelGenerator.ARsTdesign")
' create a new Excel file, and retrieve a workbook
Dim wbk
Set wbk = xlsgen.New(szOutputFolder & "myfile.xls")
' create a new worksheet
Dim wksht
Set wksht = wbk.AddWorksheet("sheet1")
' sample code
wksht.Label(9,1) = "hello world!"
' your code begins here
' ...
wbk.Close
' free the memory
Set xlsgen = Nothing
|
| JScript code, client-side code |
' xlsgen_clientside.js
' to run this code, double-click on the .js file
var szOutputFolder
szOutputFolder = "c:\\excelfiles\\"
// create a server-side instance of the generator
var xlsgen = new ActiveXObject("ExcelGenerator.ARsTdesign")
// create a new Excel file, and retrieve a workbook
var wbk = xlsgen.New(szOutputFolder + "myfile.xls")
// create a new worksheet
var wksht = wbk.AddWorksheet("sheet1")
// sample code
wksht.Label(9,1) = "hello world!"
// your code begins here
// ...
wbk.Close()
// free the memory
xlsgen = null
|
| C#, Managed C++, ASP.NET developer |
There are ASP.NET code samples written in C# available in the install.
An equivalent technique than for VB, VBA developers is required to start a session with .NET code. This session is described in this product tour.
The resulting code pattern for an arbitration Excel generation is the following :
| C# code |
// create a running instance of the generator xlsgen.CoXlsEngine engine = new xlsgen.CoXlsEngine(); // create a new Excel file, and retrieve a workbook to work with IXlsWorkbook wbk = engine.New( @"c:\myfile.xls" ); // create a new worksheet IXlsWorksheet wksht = wbk.AddWorksheet( "sheet1" ); // your code begins here ... // commit all work, and make sure the .xls file is ready to use wbk.Close(); // free the memory from the running instance System.Runtime.InteropServices.Marshal.ReleaseComObject(engine); |
ASP.NET specific informationIf xlsgen is used to generate and write Excel files on the file system (very likely), it must be ensured that the target folder has effectively been granted write permissions. Remember that when running a web application, the user is not the local interactive account, but ASP/ASPNET (or NETWORKSERVICE if you are running on Windows Server 2003) and those users are not granted such right for obvious reasons. Make sure to know that while there is no restriction or significant drawback to writing Excel files on the file system in general, xlsgen actually supports an in-memory scenario which does not require write permissions to be granted and is thus perhaps better suited to meet restricted environments. The xlsgen install comes with a code sample called 'inmemory' showing how to proceed. To grant write permissions to an ASP/ASP.NET web server :
If you do that, you are all set (no need to restart IIS). For instance, you can write a statement like xlsgenEngine.New(@"c:\tmp\test.xls"); and forget about access-denied errors. Note that you can do this as well from the IIS control panel. Just right-click there, create a virtual folder, and then proceed with the name alias, Write permission and actual file system folder. |
ASP.NET 64-bit specific informationBy default ASP.NET 64-bit has stronger and tightened security configuration bits. Which results in having to make changes in order to run xlsgen on a 64-bit OS using ASP.NET. It works as follows : In order to be able to run xlsgen at all, you must use the isolated server (or use the 64-bit version of xlsgen.dll, which we manually send) since ASP.NET is a 64-bit application. See the isolated server pages for setting it up. The execution access bits must be manually set to "everyone" using Windows's DCOMcnfg.exe tool. In order to do this, hit Windows+R, enter DCOMcnfg.exe and hit enter. Unfold "Component services / Computers / My computer / DCOM configuration", and you should see a key called "ExcelGenerator". Right-click on it, and click on the Security tab. From there, change the appropriate security option to "everyone" (loosen up the screw). In case you don't see the "ExcelGenerator" key, it is probably because you are running Windows 2008 server R2 or Windows 7 64-bit. There is a behavior change in Windows, and the workaround works as follows. Hit Windows+R, enter mmc -32 and hit enter. Then add the Component services snap-in from there. That should fix it and from now on it will be possible to use DCOMcnfg.exe again. |
.NET specific informationDue to the undeterministic nature of the .NET garbage collection mechanism, you must ensure that the xlsgen object instances are never prematurely collected, otherwise this will lead to a program execution crash. For some reason that should be explained by the implementers of the .NET run-time, the garbage collector sometimes incorrectly believes that objects being used are...not being used anymore and can be collected. This can cause xlsgen objects to be prematurely disconnected. To avoid the problem, you can "pin" the objects. Here is how.
|
| Java developer |
Java provides a great opportunity for the Java community to benefit from a versatile Excel generator. The Java code generation is not tied to any Java x.yy release so it should work with all of them.
At run-time, the Java code calls an xlsgen library (xlsgen.jar) that is a proxy to an interop layer to native code. The interop layer uses JNI (Java Native Interface) to interface with C code and actually make COM calls. Since any Java method call in the object model eventually makes a COM call, this only work on Windows.
Because of this, at run-time you need not only xlsgen.jar but also a proxy dll called xlsgen_jproxy.dll. xlsgen.jar is a regular Java package which simply reflects the xlsgen object model (a workbook can create one or more worksheets and so on). The source code for this library is given for documentation purpose only. xlsgen_jproxy.dll is a native dll with over 300 native functions that are in turn mapped to the actual COM object model. Java types are mapped into native types back and forth.
How to build a Java piece of code :
javac.exe and java.exe can be found. Note that using a variable like JAVA_HOME is pure convenience, not a requirement.
set PATH=%JAVA_HOME%;%PATH%. This makes sure the compiler can be accessed from the command-line.
javac -classpath .;..\xlsgen.jar test.java, where test.java is the name of a Java file to compile and xlsgen.jar is the library available from the parent folder.
test.class should be created/updated.
How to run a Java code :
xlsgen_jproxy.dll exists, and is in the same folder than test.class. Why the same folder? In fact, the proxy gets loaded in memory the moment an instance of the XlsEngine class gets created. Which is exactly what test.class does.
xlsgen.jar is still available and in the parent folder
java -classpath .;..\xlsgen.jar test
Note, file xlsgen.jar can be placed just about anywhere. The steps above simply assume this file is in the parent folder for demonstration purpose. xlsgen.jar was compiled using JDK 1.4.2. You can always rebuild xlsgen.jar using a different JDK version by just following the steps in readme.txt file in the java/xlsgen folder of the install.
Here is a sample Java code that creates a trivial Excel workbook :
| Java code |
import xlsgen.*;
class test {
public static void main(String[] args) {
// create an engine instance
XlsEngine engine = new XlsEngine("./../../../xlsgen.dll");
// create a new Excel file
XlsWorkbook workbook = engine.New("myfile.xls");
// create a worksheet
XlsWorksheet wksht = workbook.AddWorksheet("sheet1");
// put a label
wksht.putLabel(1 /*row*/,1 /*column*/, "Hello!");
// we are done
workbook.Close();
}
}
|
| VB.NET developer |
VB.NET has a slightly different syntax than C#. You have to use the Imports statement instead of using. Forget about prefixing assignments with a Set keyword. Create an Excel workbook with a CoXlsEngine object. And whenever you create a new Excel workbook, you must enclose the New statement in closed brackets, because the VB.NET compiler is confused with the New symbol otherwise used for constructors.
In short, here is a regular VB.NET sample code :
| VB.NET code |
' the statement that allows us to use the xlsgen object model from VB.NET code
Imports Interop.xlsgen
' create a running instance of the generator
Dim engine As New CoXlsEngine
' create a new Excel file, and retrieve a workbook to work with
Dim wbk As IXlsWorkbook
wbk = engine.[New]("c:\myfile.xls")
' create a new worksheet
Dim wksht As IXlsWorksheet
wksht = wbk.AddWorksheet("sheet1")
... ' your code begins here
' commit all the work, and make sure the .xls file is ready to use
wbk.Close
' free the memory from the running instance
engine = Nothing
|
| AutoIt developer |
The AutoIt scripting language is very much like VBScript, supports COM/Automation and can use xlsgen.
| AutoIt code |
Local $engine = ObjCreate("ExcelGenerator.ARsTdesign")
$workbook = $engine.New("sample.xlsx")
$worksheet = $workbook.AddWorksheet("Sheet1")
$worksheet.Label(2, 3) = "Hello world!"
$workbook.Close
$engine = 0
Exit
|
| PowerShell developer |
| PowerShell scripting code |
$engine = new-object -ComObject ExcelGenerator.ARsTDesign $workbook = $engine.New( "C:\tmp\myfile.xlsx" ) $wksht001 = $workbook.AddWorksheet( "Sheet1" ) $wksht001.Cell(1,2).HtmlFloat = "<font color=#000000 size=11 name=""Calibri"">154</font>" $wksht001.Cell(1,3).HtmlLabel = "<font color=#000000 size=11 name=""Calibri"">this is a test</font>" $wksht001.Cell(3,3).HtmlFloat = "<font color=#000000 size=11 name=""Calibri"">1</font>" $wksht001.Cell(4,3).HtmlFloat = "<font color=#000000 size=11 name=""Calibri"">2</font>" $workbook.Close() |
| C/C++ developer |
There are samples part of the install written in C and C++.
C/C++ provides the most granular way to access COM with two techniques, depending on which you prefer :
Choice 1 involves a technique known as smart pointers.
Choice 2 involves the use of raw COM interfaces.
In order to use smart pointers, the type-library embedded in the Excel generator must be imported. This is done with a single statement in your code :
| C/C++ code |
#import "c:\program files\xlsgen\xlsgen.dll" no_function_mapping //alternatively, depending on your Visual Studio C++ compiler version, // //#import "progid:ExcelGenerator.ARsTdesign" no_function_mapping // //or // //#import "libid:2BDEA919-2489-4ED2-8F55-C12D74DAD9B8" no_function_mapping |
If you run your project at this point, two new files will get automatically generated. The xlsgen.tlh and xlsgen.tli files are wrappers around the xlsgen programming interfaces and hide a lot of technical details behind COM programming.
The code pattern resulting from the use of smart pointers is :
| C/C++ code |
// initialize the COM library
::CoInitialize(NULL);
{ // braces are here to reduce the scope of the smart pointers (automatic gc)
// create a running instance of the generator
xlsgen::IXlsEnginePtr engine( __uuidof(xlsgen::CoXlsEngine) );
// create a new Excel file, and retrieve a workbook to work with
xlsgen::IXlsWorkbookPtr wbk;
wbk = engine->New( L"myfile.xls" );
// create a new worksheet
xlsgen::IXlsWorksheetPtr wksht;
wksht = wbk->AddWorksheet( L"sheet1" );
// your code begins here
// ...
// commit all work, and make sure the .xls file is ready to use
wbk->Close();
} // the end of scope automatically frees the memory from all out-of-scope objects
// in case you are not using variable scoping, make sure to call
// the .Release() method on each smart pointer, as in :
// wksht.Release();
// wbk.Release();
// engine.Release();
// frees the COM library
::CoUninitialize();
|
If for any reason, you want to see the generated file in Excel, then use the following code :
| C/C++ code |
::ShellExecute(NULL,"open","myfile.xls",NULL,NULL,SW_SHOW); |
If you don't like C++ smart pointers, you may want to use the raw COM interfaces. Either case, it performs COM early binding so the performance should not change.
In order to make that happen, the C/C++ developer needs to program against the resulting interface headers. Those headers are provided with the setup, check out the xlsgen_i.h and xlsgen_i.c files. When xlsgen is installed, those files are installed along in that directory : c: \ program files \ xlsgen. If you want to create those headers by hand, then the procedure is as follows :
View...
typedef enum statements are at the top of the idl file, still within the library xlsgen scope, but before interface definitions. For some unknown reason, OLEView tends to shuffle the order of what gets declared and this confuses the compiler.
xlsgen_i.h in the "Output File Name" edit box
xlsgen_i.h in the "Output File Name" edit box
Compile
xlsgen_i.h and xlsgen_i.c files from your project directory
The xlsgen_i.h file holds all interface declarations. The xlsgen_i.c file holds the GUIDs of objects and interfaces.
In your project, add the following lines of code :
| C/C++ code |
#include <objbase.h> #include "xlsgen_i.c" // relative or absolute path might be required for compilation #include "xlsgen_i.h" // relative or absolute path might be required for compilation |
The code pattern resulting from the use of raw COM interfaces is :
| C/C++ code |
// initialize the COM library
::CoInitialize(NULL);
{
// create a running instance of the generator
IXlsEngine* pGenerator = NULL;
HRESULT hr = ::CoCreateInstance(CLSID_CoXlsEngine,
NULL, CLSCTX_ALL ,
IID_IXlsEngine,
(void**)&pGenerator);
if (SUCCEEDED(hr))
{
// create a new Excel file, and retrieve a workbook to work with
IXlsWorkbook* pWbk= NULL;
pGenerator->New( L"myfile.xls", &pWbk);
// create a new worksheet
IXlsWorksheet* pWksht = NULL;
pWbk->AddWorksheet( L"sheet1", &pWksht);
// your code begins here
// ...
// commit all work, and make sure the .xls file is ready to use
pWbk->Close();
// free the memory from the running instance
pWksht->Release();
pWbk->Release();
pGenerator->Release();
}
}
::CoUninitialize();
|
If for any reason, you want to see the generated file in Excel, then use the following code :
| C/C++ code |
::ShellExecute(NULL,"open","myfile.xls",NULL,NULL,SW_SHOW); |
xlsgen documentation. © ARsT Design all rights reserved.