In both languages (XSQL and server-side script) it is possible manage Microsoft Excel documents

1 Create a workbook

In Excel, a workbook is a collection of one or more spreadsheets in a single file. This is the top level object for creating new sheets, etc.

Copy
<xsql-script>
    <body>
        <set name='new_workbook'>
            <excel.Workbook />
        </set>
    </body>
</xsql-script>
Copy
var mXlsNewWorkbook = new Ax.ms.Excel("new_workbook.xls");

2 Create a sheet

A spreadsheet is an aplication for organization, analysis and storage of data in tabular form. Exists methods in XSQL script and server-side script which are used to create a sheet within an excel file.

Copy
<xsql-script>
    <body>
        <set name='wb'>
            <excel.Workbook />
        </set>
		
        <set name="test_sheet">
            <excel.Workbook.createSheet name='new_sheet'>
                <wb />
            </excel.Workbook.createSheet>
        </set>
    </body>
</xsql-script>
Copy
var mXlsWb = new Ax.ms.Excel("test.xls");
var mXlsNewSheet = wb.createSheet("new_sheet");

2.1 Create a sheet from a ResultSet

The available methods allows to create spreadsheets from ResultSet.

In server-side script it is possible to add ResultSet starting at given row and column.

Copy
addRows(ins startRow, int startCol, ResultSet rs)
Copy
<xsql-script>
    <body>
        <set name='wb'>
            <excel.Workbook />
        </set>
		
        <set name="new_sheet">
            <excel.Workbook.createSheet name='new_sheet'>
                <wb />
            </excel.Workbook.createSheet>
        </set>      
        <excel.Sheet.fromResultSet >
            <new_sheet/>
            <sql.toResultSet>
                <select first='10'>
                    <columns>
                        tabname, tabid
                    </columns>
                    <from table='systables' />       
                </select>          
            </sql.toResultSet>
        </excel.Sheet.fromResultSet>
        
    </body>
</xsql-script>
Copy
var mXlsWb = new Ax.ms.Excel("test.xls");

var mXlsNewSheet = mXlsWb.createSheet("Hoja_1");   

var mRsSystables = Ax.db.executeQuery(`
    <select first='10'>
        <columns>
            tabname, tabid
        </columns>
        <from table='systables' />       
    </select>      
`);

mXlsSheet.addRows(mRsSystables);

2.2 Create a sheet from rows

The available methods allows add arrays of data as a new row to the end of Sheet

Copy
<xsql-script>
    <body>

        <vtable name='v_music'>
            <column name='brand'   type='string' />
            <column name='model'   type='string' />
            <column name='color'   type='string' />
            <column name='price'   type='integer' />
        </vtable>

        <vtable.insert name='v_music'>
            <matrix>
                { "Mazda"        , "3"       , "Rojo"   , "21900" },
                { "Volkswagen"   , "Golf"    , "Azul"   , "23000" },
                { "Nissan"       , "Sentra"  , "Blanco" , "18000" },
                { "KIA"          , "Cerato"  , "Gris"   , "15600" },
            </matrix>
        </vtable.insert>

        <set name='wb'>
		    <excel.Workbook />
		</set>
		
		<set name="new_sheet">
		    <excel.Workbook.createSheet name='new_sheet'>
		        <wb />
		    </excel.Workbook.createSheet>
	    </set>

        <excel.Sheet.fromResultSet >
            <new_sheet/>
            <vtable.toResultSet>
                <v_music />
            </vtable.toResultSet>
        </excel.Sheet.fromResultSet>
    </body>
</xsql-script>
Copy
var mXlsWorkbook = new Ax.ms.Excel("test.xls");

var mXlsSheet = mXlsWorkbook.createSheet("Hoja_1");

var mRowCars  = [
    [ "Mazda"      , "3"      , "Rojo"   , "21900" ],
    [ "Volkswagen" , "Golf"   , "Azul"   , "23000" ],
    [ "Nissan"     , "Sentra" , "Blanco" , "18000" ],
    [ "KIA"        , "Cerato" , "Gris"   , "15600" ]
    ];

mXlsSheet.addRows(mRowCars);

3 Using a formula

In this section is presented an example of managing Excel documents with a multiplication formula.

Copy
<xsql-script>
    <body>
        <!-- Create virtual table with matrix data-->
        <vtable name='v_numbers'>
            <column name='Col1'   type='integer' />
        </vtable>

        <vtable.insert name='v_numbers'>
            <matrix>
                { "3"  },
                { "4"  },
            </matrix>
        </vtable.insert>

        <!-- Create the workbook -->
        <set name='wb'>
            <excel.Workbook />
        </set>

        <!-- Create the workbook sheet with name Hoja_1 -->
        <set name="sheet">
            <excel.Workbook.createSheet name="Hoja_1">
                <wb/>
            </excel.Workbook.createSheet>
        </set>

        <!--  Create a workbook sheet from ResultSet -->    
        <excel.Sheet.fromResultSet >
            <sheet/>
            <!-- ResultSet to virtual table  -->
            <vtable.toResultSet>
                <v_numbers />
            </vtable.toResultSet>
        </excel.Sheet.fromResultSet>

        <set name="cell_form">
            <excel.Sheet.createCell row="3" col="0">
                <sheet/>
            </excel.Sheet.createCell>
        </set>      
        
        <!-- set cell with Formula 1 -->
        <excel.Cell.setCellFormula>
            <cell_form/>
            <string>A2*A3</string>
        </excel.Cell.setCellFormula>
    </body>
</xsql-script>
Copy
//Create the workbook
var mXlsWorkbook = new Ax.ms.Excel();
//Create the workbook sheet with name Hoja_1
var mXlsSheet = mXlsWorkbook.createSheet("Hoja_1");
var m_ArrayValues = [
    [3],
    [4]
    ];

mXlsSheet.getCell("A1").setCellValue("Col1");

mXlsSheet.addRows(m_ArrayValues);

mXlsSheet.getCell("A4").setCellFormula("A2*A3");

4 Example

In this section is presented an example of managing Excel documents.

In this case a book is created and the spreadsheet is created from a resultset. The expected result is printed

Copy
<xsql-script>
    <body>
        <!-- Create the workbook -->
        <set name='test_workbook'>
            <excel.Workbook />
        </set>

        <!-- Create the workbook sheet with name Hoja_1 -->
        <set name="new_sheet">
            <excel.Workbook.createSheet name="Hoja_1">
                <test_workbook/>
            </excel.Workbook.createSheet>
        </set>

        <!--  SELECT the first 5 rows of systable table and load them in a workbook -->    
        <excel.Sheet.fromResultSet >
            <new_sheet/>
            <sql.toResultSet>
                <select first='5'>
                    <columns>
                        tabname, tabid, pagesize
                    </columns>
                    <from table='systables' />       
                </select>          
            </sql.toResultSet>
        </excel.Sheet.fromResultSet>

        <!-- create a cell -->
        <set name="cell_form">
            <excel.Sheet.createCell row="7" col="2">
                <new_sheet/>
            </excel.Sheet.createCell>
        </set>      
        
        <!-- set cell with Formula -->
        <excel.Cell.setCellFormula>
            <cell_form/>
            <string>C2+C3+C4+C5+C6</string>
        </excel.Cell.setCellFormula>

        <!-- Creating a temporary EXCEL file with the workbook data -->
        <excel.Workbook.write>
            <test_workbook />
            <file name="test.xls" type="temp"/>
        </excel.Workbook.write>        
                
        <!-- Prints the ResultSet -->        
        <println>
            <!-- Load workbook into ResultSet -->
            <excel.Workbook.toResultSet start-header-row='1' start-column='A'>
                <test_workbook/>
            </excel.Workbook.toResultSet>   
        </println>
        
    </body>
</xsql-script>
+----------+-----+-------------------+
|tabname   |tabid|pagesize           |
+----------+-----+-------------------+
|systables |1    |2048               |
|syscolumns|2    |2048               |
|sysindices|3    |2048               |
|systabauth|4    |2048               |
|syscolauth|5    |2048               |
|          |     |10,240.000000000000|
+----------+-----+-------------------+
Copy
//Create the workbook
var mXlsWorkbook = new Ax.ms.Excel("test.xls");

//Create the workbook sheet with name Hoja_1
var mXlsSheet = mXlsWorkbook.createSheet("Hoja_1");

mXlsSheet.getCell("A1").setCellValue('tabname');
mXlsSheet.getCell("B1").setCellValue('tabid');
mXlsSheet.getCell("C1").setCellValue('pagesize');

//Select the first 5 rows of systable table and load them in a sheet
var mRsSystables = Ax.db.executeQuery(`
    <select first='5'>
        <columns>
            tabname, tabid, pagesize
        </columns>
        <from table='systables' />       
    </select>   
`);

mXlsSheet.addRows(mRsSystables);

mXlsSheet.getCell("C7").setCellFormula("C2+C3+C4+C5+C6");

//Prints the ResultSet
let mRsResult = mXlsSheet.toResultSet();
console.log(mRsResult);
+-------+----------+-------+--------+
 Hoja_1
+-------+----------+-------+--------+
|<null> |<null>    |<null> |<null>  |
|Row    |A         |B      |C       |
|integer|char(10)  |char(5)|char(8) |
+-------+----------+-------+--------+
|1      |tabname   |tabid  |pagesize|
|2      |systables |1      |2,048   |
|3      |syscolumns|2      |2,048   |
|4      |sysindices|3      |2,048   |
|5      |systabauth|4      |2,048   |
|6      |syscolauth|5      |2,048   |
|7      |          |       |10,240  |
+-------+----------+-------+--------+