Added documentation for worksheet tables.

Feature request #33
This commit is contained in:
John McNamara 2021-08-22 19:30:31 +01:00
parent 0a273e9629
commit b185df6765
25 changed files with 803 additions and 34 deletions

View file

@ -35,6 +35,7 @@ my @examples = (
[ 'data_validate.c', 'Examples of worksheet data validation and drop down lists' ],
[ 'conditional_format1.c', 'A simple conditional formatting example' ],
[ 'conditional_format2.c', 'An advanced conditional formatting example' ],
[ 'tables.c', 'Example of table to a worksheet.' ],
[ 'images.c', 'Example of adding images to a worksheet.' ],
[ 'image_buffer.c', 'Example of adding an image from a memory buffer.' ],
[ 'headers_footers.c', 'Example of adding worksheet headers/footers' ],

View file

@ -856,6 +856,7 @@ INPUT = src/mainpage.dox \
src/working_with_autofilters.dox \
src/working_with_data_validation.dox \
src/working_with_conditional_formatting.dox \
src/working_with_tables.dox \
src/working_with_comments.dox \
src/working_with_outlines.dox \
src/working_with_memory.dox \

BIN
docs/images/tables1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

BIN
docs/images/tables10.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
docs/images/tables11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

BIN
docs/images/tables12.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
docs/images/tables13.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
docs/images/tables14.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
docs/images/tables2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
docs/images/tables3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
docs/images/tables4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

BIN
docs/images/tables5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
docs/images/tables6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
docs/images/tables7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
docs/images/tables8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
docs/images/tables9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

View file

@ -388,7 +388,7 @@ a format to a cell or a range of cells based on certain criteria.
<table width="600">
<tr>
<td>@ref conditional_format1.c "&lt;&lt; conditional_format1.c"</td>
<td align="right">@ref images.c "images.c &gt;&gt;"</td>
<td align="right">@ref tables.c "tables.c &gt;&gt;"</td>
</tr>
</table>
@ -402,11 +402,30 @@ criteria.
@example images.c
@example tables.c
<table width="600">
<tr>
<td>@ref conditional_format2.c "&lt;&lt; conditional_format2.c"</td>
<td align="right">@ref images.c "images.c &gt;&gt;"</td>
</tr>
</table>
Example of how to add tables to a worksheet. Tables in Excel are used to group
rows and columns of data into a single structure that can be referenced in a
formula or formatted collectively.
@image html tables12.png
@example images.c
<table width="600">
<tr>
<td>@ref tables.c "&lt;&lt; tables.c"</td>
<td align="right">@ref image_buffer.c "image_buffer.c &gt;&gt;"</td>
</tr>
</table>

View file

@ -183,6 +183,16 @@ criteria.
@image html conditional_format1.png
##############################################################
@example tables.c
Example of how to add tables to a worksheet. Tables in Excel are used to group
rows and columns of data into a single structure that can be referenced in a
formula or formatted collectively.
@image html tables12.png
##############################################################
@example images.c

View file

@ -61,6 +61,7 @@ following sections for more information:
- @ref working_with_autofilters
- @ref working_with_data_validation
- @ref working_with_conditional_formatting
- @ref working_with_tables
- @ref working_with_comments
- @ref working_with_outlines
- @ref working_with_memory

View file

@ -1275,6 +1275,6 @@ For example to apply one conditional format to two ranges, `B3:K6` and
@endcode
Next: @ref working_with_comments
Next: @ref working_with_tables
*/

View file

@ -17,6 +17,28 @@ However, there are a few potential issues and differences that the user should
be aware of. These are explained in the following sections.
@section ww_formulas_results Formula Results
Libxlsxwriter doesn't calculate the result of a formula and instead stores the
value 0 as the formula result. It then sets a global flag in the XLSX file to
say that all formulas and functions should be recalculated when the file is
opened.
This is the method recommended in the Excel documentation and in general it
works fine with spreadsheet applications. However, applications that don't
have a facility to calculate formulas will only display the 0
results. Examples of such applications are Excel Viewer, PDF Converters, and
some mobile device applications.
If required, it is also possible to specify the calculated result of the
formula using the `result` parameter for
`worksheet_worksheet_write_formula_num()`:
@code
worksheet_write_formula_num(worksheet, 0, 0, "=2+2", NULL, 4);
@endcode
@section ww_formulas_non_us Non US Excel functions and syntax
Excel stores formulas in the format of the US English version, regardless
@ -504,27 +526,6 @@ The following shows how to do that using Linux `unzip` and `libxml's
<f>SUM(1, 2, 3)</f>
@section ww_formulas_results Formula Results
Libxlsxwriter doesn't calculate the result of a formula and instead stores the
value 0 as the formula result. It then sets a global flag in the XLSX file to
say that all formulas and functions should be recalculated when the file is
opened.
This is the method recommended in the Excel documentation and in general it
works fine with spreadsheet applications. However, applications that don't
have a facility to calculate formulas will only display the 0
results. Examples of such applications are Excel Viewer, PDF Converters, and
some mobile device applications.
If required, it is also possible to specify the calculated result of the
formula using the `result` parameter for
`worksheet_worksheet_write_formula_num()`:
@code
worksheet_write_formula_num(worksheet, 0, 0, "=2+2", NULL, 4);
@endcode
Next: @ref working_with_dates
*/

View file

@ -0,0 +1,453 @@
/**
@page working_with_tables Working with Worksheet Tables
@tableofcontents
Tables in Excel are a way of grouping a range of cells into a single entity
that has common formatting or that can be referenced from formulas. Tables can
have column headers, autofilters, total rows, column formulas and default
formatting.
@image html tables12.png
For a general introduction to this Excel feature see [An Overview of Excel
Tables](http://office.microsoft.com/en-us/excel-help/overview-of-excel-tables-HA010048546.aspx)
in the Microsoft Office documentation.
@section ww_tables_add_table Adding a table to a worksheet
Tables are added to a worksheet using the `worksheet_add_table()` function:
@code
worksheet_add_table(worksheet, 2, 1, 6, 5, NULL);
@endcode
Or more explicitly using the RANGE() macro:
@code
worksheet_add_table(worksheet, RANGE("B3:F7"), NULL); //Same as above.
@endcode
@image html tables1.png
The `worksheet_add_table()` `options` parameter should be a pointer to a
lxw_table_options struct with the parameters that describe the table options:
@code
worksheet_add_table(worksheet, 2, 1, 6, 5, &options);
@endcode
These options are explained in the sections below. There are no required
parameters and the `options` parameter is itself optional, in which case you
can specify NULL and get the default table parameters.
You should take care not to overlap worksheet tables as this is not allowed by
Excel and will cause an error when the file is loaded.
@note Tables aren't available in libxlsxwriter when using `constant_memory`
mode in `workbook_new_opt()`.
@subsection ww_tables_header_row Parameter: no_header_row
The `no_header_row` parameter can be used to turn off the header row in the
table. It is on by default:
@code
lxw_table_options options = {.no_header_row = LXW_TRUE};
worksheet_add_table(worksheet, RANGE("B4:F7"), &options);
@endcode
@image html tables4.png
Without this option the header row will contain default captions such as
`Column 1`, ``Column 2``, etc. These captions can be overridden using the
`columns` parameter shown below.
@subsection ww_tables_autofilter Parameter: no_autofilter
The `no_autofilter` parameter can be used to turn off the autofilter in the
header row. It is on by default:
@code
lxw_table_options options = {.no_autofilter = LXW_TRUE};
worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
@endcode
@image html tables3.png
The autofilter is only shown if the `no_header_row` parameter is off (the
default). Filter conditions within the table are not supported.
@subsection ww_tables_banded_rows Parameter: no_banded_rows
The `no_banded_rows` parameter can be used to turn off the rows of alternating
color in the table. It is on by default:
@code
lxw_table_options options = {.no_banded_rows = LXW_TRUE};
worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
@endcode
@image html tables6.png
@subsection ww_tables_banded_columns Parameter: banded_columns
The `banded_columns` parameter can be used to used to create columns of
alternating color in the table. It is off by default:
@code
lxw_table_options options = {.banded_columns = LXW_TRUE};
worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
@endcode
The banded columns formatting is shown in the image in the previous section
above.
@subsection ww_tables_first_column Parameter: first_column
The `first_column` parameter can be used to highlight the first column of the
table. The type of highlighting will depend on the `style_type` of the table.
It may be bold text or a different color. It is off by default:
@code
lxw_table_options options = {.first_column = LXW_TRUE, .last_column = LXW_TRUE};
worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
@endcode
@image html tables5.png
@subsection ww_tables_last_column Parameter: last_column
The `last_column` parameter can be used to highlight the last column of the
table. The type of highlighting will depend on the `style` of the table. It
may be bold text or a different color. It is off by default:
@code
lxw_table_options options = {.first_column = LXW_TRUE, .last_column = LXW_TRUE};
worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
@endcode
The `last_column` formatting is shown in the image in the previous section
above.
@subsection ww_tables_style Parameter: style_type and style_type_number
The `style_type` parameter can be used to set the style of the table, in
conjunction with the `style_type_number` parameter:
@code
lxw_table_options options = {
.style_type = LXW_TABLE_STYLE_TYPE_LIGHT,
.style_type_number = 11,
};
worksheet_add_table(worksheet, RANGE("B3:G8"), &options);
@endcode
@image html tables11.png
There are three types of table style in Excel: Light, Medium and Dark which
are represented using the #lxw_table_style_type enum values:
- #LXW_TABLE_STYLE_TYPE_LIGHT
- #LXW_TABLE_STYLE_TYPE_MEDIUM
- #LXW_TABLE_STYLE_TYPE_DARK
Within those ranges there are between 11 and 28 other style types which can be
set with `style_type_number` (depending on the style type). Check Excel to
find the style that you want. The dialog with the options laid out in numeric
order are shown below:
@image html tables14.png
The default table style in Excel is 'Table Style Medium 9' (highlighted with
a green border in the image above), which is set by default in libxlsxwriter
as:
@code
lxw_table_options options = {
.style_type = LXW_TABLE_STYLE_TYPE_MEDIUM,
.style_type_number = 9,
};
@endcode
You can also turn the table style off by setting it to Light 0:
@code
lxw_table_options options = {
.style_type = LXW_TABLE_STYLE_TYPE_LIGHT,
.style_type_number = 0,
};
@endcode
@image html tables13.png
@subsection ww_tables_name Parameter: name
The `name` parameter is used to set the name of the table. This parameter is
optional and by default tables are named `Table1`, `Table2`, etc. in the
worksheet order that they are added.
@code
lxw_table_options options = {.name = "Sales"};
worksheet_add_table(worksheet, RANGE("B3:G8"), &options);
@endcode
If you override the table name you must ensure that it doesn't clash with an
existing table name and that it follows Excel's requirements for table names,
see the Microsoft Office documentation on [Naming an Excel
Table](https://support.microsoft.com/en-us/office/rename-an-excel-table-fbf49a4f-82a3-43eb-8ba2-44d21233b114).
@subsection ww_tables_total_row Parameter: total_row
The `total_row` parameter can be used to turn on the total row in the last
row of a table. It is distinguished from the other rows by a different
formatting and also with dropdown `SUBTOTAL` functions:
@code
lxw_table_options options = {.total_row = LXW_TRUE};
worksheet_add_table(worksheet, RANGE("B3:G8"), &options);
@endcode
@image html tables9.png
The default total row doesn't have any captions or functions. These must by
specified via the `columns` parameter below.
@subsection ww_tables_columns Parameter: columns
The `columns` parameter can be used to set properties for columns within the
table.
@image html tables7.png
The sub-properties of `lxw_table_column` that can be set are:
- `lxw_table_column.header`
- `lxw_table_column.header_format`
- `lxw_table_column.formula`
- `lxw_table_column.total_string`
- `lxw_table_column.total_function`
- `lxw_table_column.total_value`
- `lxw_table_column.format`
The `columns` parameter should be a NULL terminated array of
`lxw_table_column` pointers. For example to override the default 'Column n'
style table headers:
@code
lxw_table_column col1 = {.header = "Product"};
lxw_table_column col2 = {.header = "Quarter 1"};
lxw_table_column col3 = {.header = "Quarter 2"};
lxw_table_column col4 = {.header = "Quarter 3"};
lxw_table_column col5 = {.header = "Quarter 4"};
lxw_table_column *columns[] = {&col1, &col2, &col3, &col4, &col5, NULL};
lxw_table_options options = {.columns = columns};
worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
@endcode
If you don't wish to specify properties for a specific column you can pass an
empty (but not NULL) struct and the defaults will be applied:
@code
lxw_table_column col1 = {.header = "Product"};
lxw_table_column col2 = {.header = "Quarter 1"};
lxw_table_column col3 = {0}; // Defaults to Column3.
lxw_table_column col4 = {.header = "Quarter 3"};
lxw_table_column col5 = {.header = "Quarter 4"};
@endcode
Column formulas can by applied using the column `formula` property:
@code
lxw_table_column col1 = {.header = "Product"};
lxw_table_column col2 = {.header = "Quarter 1"};
lxw_table_column col3 = {.header = "Quarter 2"};
lxw_table_column col4 = {.header = "Quarter 3"};
lxw_table_column col5 = {.header = "Quarter 4"};
lxw_table_column col6 = {.header = "Year",
.formula = "=SUM(Table8[@[Quarter 1]:[Quarter 4]])"};
lxw_table_column *columns[] = {&col1, &col2, &col3, &col4, &col5, &col6, NULL};
lxw_table_options options = {.columns = columns};
worksheet_add_table(worksheet, RANGE("B3:G7"), &options);
@endcode
@image html tables8.png
The Excel 2007 style `"#This Row"` and Excel 2010 style `"@"` structural
references are supported within the formula. However, other Excel 2010
additions to structural references aren't supported and formulas should
conform to Excel 2007 style formulas. See the Microsoft documentation on
[Using structured references with Excel tables]
(http://office.microsoft.com/en-us/excel-help/using-structured-references-with-excel-tables-HA010155686.aspx)
for details.
As stated above the `total_row` table parameter turns on the "Total" row in
the table but it doesn't populate it with any defaults. Total captions and
functions must be specified via the `columns` property and the `total_string`
and `total_function` sub properties:
@code
lxw_table_column col1 = {.header = "Product",
.total_string = "Totals"};
lxw_table_column col2 = {.header = "Quarter 1",
.total_function = LXW_TABLE_FUNCTION_SUM};
lxw_table_column col3 = {.header = "Quarter 2",
.total_function = LXW_TABLE_FUNCTION_SUM};
lxw_table_column col4 = {.header = "Quarter 3",
.total_function = LXW_TABLE_FUNCTION_SUM};
lxw_table_column col5 = {.header = "Quarter 4",
.total_function = LXW_TABLE_FUNCTION_SUM};
lxw_table_column col6 = {.header = "Year",
.formula = "=SUM(Table10[@[Quarter 1]:[Quarter 4]])",
.total_function = LXW_TABLE_FUNCTION_SUM};
lxw_table_column *columns[] = {&col1, &col2, &col3, &col4, &col5, &col6, NULL};
lxw_table_options options = {.total_row = LXW_TRUE, .columns = columns};
worksheet_add_table(worksheet, RANGE("B3:G8"), &options);
@endcode
The supported totals row `SUBTOTAL` functions are defined in
#lxw_table_total_functions:
- #LXW_TABLE_FUNCTION_AVERAGE
- #LXW_TABLE_FUNCTION_COUNT_NUMS
- #LXW_TABLE_FUNCTION_COUNT
- #LXW_TABLE_FUNCTION_MAX
- #LXW_TABLE_FUNCTION_MIN
- #LXW_TABLE_FUNCTION_STD_DEV
- #LXW_TABLE_FUNCTION_SUM
- #LXW_TABLE_FUNCTION_VAR
User defined functions or formulas aren't supported.
It is also possible to set a calculated value for the `total_function` using
the `total_value` sub property. This is only necessary when creating workbooks
for applications that cannot calculate the value of formulas automatically.
This is similar to setting the `result` property in
`worksheet_write_formula_num()`. See also @ref ww_formulas_results.
Formatting can also be applied to columns using the `format` and to the header
using `header_format` (although you will also need to add it to the data in
the column, see the next section):
@code
lxw_table_column col1 = {.header = "Product",
.total_string = "Totals"};
lxw_table_column col2 = {.header = "Quarter 1",
.total_function = LXW_TABLE_FUNCTION_SUM,
.format = currency_format};
lxw_table_column col3 = {.header = "Quarter 2",
.total_function = LXW_TABLE_FUNCTION_SUM,
.format = currency_format};
lxw_table_column col4 = {.header = "Quarter 3",
.total_function = LXW_TABLE_FUNCTION_SUM,
.format = currency_format};
lxw_table_column col5 = {.header = "Quarter 4",
.total_function = LXW_TABLE_FUNCTION_SUM,
.format = currency_format};
lxw_table_column col6 = {.header = "Year",
.formula = "=SUM(Table13[@[Quarter 1]:[Quarter 4]])",
.total_function = LXW_TABLE_FUNCTION_SUM,
.format = currency_format};
lxw_table_column *columns[] = {&col1, &col2, &col3, &col4, &col5, &col6, NULL};
lxw_table_options options = {.total_row = LXW_TRUE, .columns = columns};
worksheet_add_table(worksheet, RANGE("B3:G8"), &options);
@endcode
@image html tables12.png
Standard libxlsxwriter lxw_format objects are used for this formatting.
However, they should be limited to numerical formats for the columns and
simple formatting like text wrap for the headers. Overriding other table
formatting may produce inconsistent results. You will also need to apply the
same format to any data you write to the column in the table, see the next
section.
@section ww_tables_data Adding data to the table
Once you create a worksheet table you will also need to fill in the data in
the rows and columns. This is done with the standard worksheet write()
functions. For example the data in the examples above was written as follows:
@code
worksheet_write_string(worksheet, 3, 1, "Apples", NULL);
worksheet_write_string(worksheet, 4, 1, "Pears", NULL);
worksheet_write_string(worksheet, 5, 1, "Bananas", NULL);
worksheet_write_string(worksheet, 6, 1, "Oranges", NULL);
worksheet_write_number(worksheet, 3, 2, 10000, format);
worksheet_write_number(worksheet, 4, 2, 2000, format);
worksheet_write_number(worksheet, 5, 2, 6000, format);
worksheet_write_number(worksheet, 6, 2, 500, format);
worksheet_write_number(worksheet, 3, 3, 5000, format);
worksheet_write_number(worksheet, 4, 3, 3000, format);
worksheet_write_number(worksheet, 5, 3, 6000, format);
worksheet_write_number(worksheet, 6, 3, 300, format);
worksheet_write_number(worksheet, 3, 4, 8000, format);
worksheet_write_number(worksheet, 4, 4, 4000, format);
worksheet_write_number(worksheet, 5, 4, 6500, format);
worksheet_write_number(worksheet, 6, 4, 200, format);
worksheet_write_number(worksheet, 3, 5, 6000, format);
worksheet_write_number(worksheet, 4, 5, 5000, format);
worksheet_write_number(worksheet, 5, 5, 6000, format);
worksheet_write_number(worksheet, 6, 5, 700, format);
@endcode
@image html tables2.png
@section ww_tables_Example Example
All of the images shown above are taken from @ref tables.c.
Next: @ref working_with_comments
*/

View file

@ -450,4 +450,5 @@ void write_worksheet_data(lxw_worksheet *worksheet, lxw_format *format) {
worksheet_write_number(worksheet, CELL("F5"), 5000, format);
worksheet_write_number(worksheet, CELL("F6"), 6000, format);
worksheet_write_number(worksheet, CELL("F7"), 700, format);
}

View file

@ -554,16 +554,39 @@ enum lxw_table_style_type {
LXW_TABLE_STYLE_TYPE_DARK
};
/**
* @brief Standard Excel functions for totals in tables.
*
* Definitions for the standard Excel functions that are available via the
* dropdown in the total row of an Excel table.
*
*/
enum lxw_table_total_functions {
LXW_TABLE_FUNCTION_NONE = 0,
/** Use the average function as the table total. */
LXW_TABLE_FUNCTION_AVERAGE = 101,
/** Use the count numbers function as the table total. */
LXW_TABLE_FUNCTION_COUNT_NUMS = 102,
/** Use the count function as the table total. */
LXW_TABLE_FUNCTION_COUNT = 103,
/** Use the max function as the table total. */
LXW_TABLE_FUNCTION_MAX = 104,
/** Use the min function as the table total. */
LXW_TABLE_FUNCTION_MIN = 105,
/** Use the standard deviation function as the table total. */
LXW_TABLE_FUNCTION_STD_DEV = 107,
/** Use the sum function as the table total. */
LXW_TABLE_FUNCTION_SUM = 109,
/** Use the var function as the table total. */
LXW_TABLE_FUNCTION_VAR = 110
};
@ -1356,30 +1379,253 @@ typedef struct lxw_cond_format_hash_element {
RB_ENTRY (lxw_cond_format_hash_element) tree_pointers;
} lxw_cond_format_hash_element;
/**
* @brief Table columns options.
*
* Structure to set the options of a table column added with
* worksheet_add_table(). See @ref ww_tables_columns.
*/
typedef struct lxw_table_column {
/** Set the header name/caption for the column. If NULL the header defaults
* to Column 1, Column 2, etc. */
char *header;
/** Set the formula for the column. */
char *formula;
/** Set the string description for the column total. */
char *total_string;
/** Set the function for the column total. */
uint8_t total_function;
double total_value;
/** Set the format for the column header. */
lxw_format *header_format;
/** Set the format for the data rows in the column. */
lxw_format *format;
/** Set the formula value for the column total (not generally required). */
double total_value;
} lxw_table_column;
/**
* @brief Worksheet table options.
*
* Options used to define worksheet tables. See @ref working_with_tables for
* more information.
*
*/
typedef struct lxw_table_options {
/**
* The `name` parameter is used to set the name of the table. This
* parameter is optional and by default tables are named `Table1`,
* `Table2`, etc. in the worksheet order that they are added.
*
* @code
* lxw_table_options options = {.name = "Sales"};
*
* worksheet_add_table(worksheet, RANGE("B3:G8"), &options);
* @endcode
*
* If you override the table name you must ensure that it doesn't clash
* with an existing table name and that it follows Excel's requirements
* for table names, see the Microsoft Office documentation on
* [Naming an Excel Table]
* (https://support.microsoft.com/en-us/office/rename-an-excel-table-fbf49a4f-82a3-43eb-8ba2-44d21233b114).
*/
char *name;
char *total_string;
lxw_table_column **columns;
uint8_t banded_columns;
uint8_t first_column;
uint8_t last_column;
uint8_t no_autofilter;
uint8_t no_banded_rows;
/**
* The `no_header_row` parameter can be used to turn off the header row in
* the table. It is on by default:
*
* @code
* lxw_table_options options = {.no_header_row = LXW_TRUE};
*
* worksheet_add_table(worksheet, RANGE("B4:F7"), &options);
* @endcode
*
* @image html tables4.png
*
* Without this option the header row will contain default captions such
* as `Column 1`, ``Column 2``, etc. These captions can be overridden
* using the `columns` parameter shown below.
*
*/
uint8_t no_header_row;
/**
* The `no_autofilter` parameter can be used to turn off the autofilter in
* the header row. It is on by default:
*
* @code
* lxw_table_options options = {.no_autofilter = LXW_TRUE};
*
* worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
* @endcode
*
* @image html tables3.png
*
* The autofilter is only shown if the `no_header_row` parameter is off
* (the default). Filter conditions within the table are not supported.
*
*/
uint8_t no_autofilter;
/**
* The `no_banded_rows` parameter can be used to turn off the rows of alternating
* color in the table. It is on by default:
*
* @code
* lxw_table_options options = {.no_banded_rows = LXW_TRUE};
*
* worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
* @endcode
*
* @image html tables6.png
*
*/
uint8_t no_banded_rows;
/**
* The `banded_columns` parameter can be used to used to create columns of
* alternating color in the table. It is off by default:
*
* @code
* lxw_table_options options = {.banded_columns = LXW_TRUE};
*
* worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
* @endcode
*
* The banded columns formatting is shown in the image in the previous
* section above.
*/
uint8_t banded_columns;
/**
* The `first_column` parameter can be used to highlight the first column
* of the table. The type of highlighting will depend on the `style_type`
* of the table. It may be bold text or a different color. It is off by
* default:
*
* @code
* lxw_table_options options = {.first_column = LXW_TRUE, .last_column = LXW_TRUE};
*
* worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
* @endcode
*
* @image html tables5.png
*/
uint8_t first_column;
/**
* The `last_column` parameter can be used to highlight the last column of
* the table. The type of highlighting will depend on the `style` of the
* table. It may be bold text or a different color. It is off by default:
*
* @code
* lxw_table_options options = {.first_column = LXW_TRUE, .last_column = LXW_TRUE};
*
* worksheet_add_table(worksheet, RANGE("B3:F7"), &options);
* @endcode
*
* The `last_column` formatting is shown in the image in the previous
* section above.
*/
uint8_t last_column;
/**
* The `style_type` parameter can be used to set the style of the table,
* in conjunction with the `style_type_number` parameter:
*
* @code
* lxw_table_options options = {
* .style_type = LXW_TABLE_STYLE_TYPE_LIGHT,
* .style_type_number = 11,
* };
*
* worksheet_add_table(worksheet, RANGE("B3:G8"), &options);
* @endcode
*
*
* @image html tables11.png
*
* There are three types of table style in Excel: Light, Medium and Dark
* which are represented using the #lxw_table_style_type enum values:
*
* - #LXW_TABLE_STYLE_TYPE_LIGHT
*
* - #LXW_TABLE_STYLE_TYPE_MEDIUM
*
* - #LXW_TABLE_STYLE_TYPE_DARK
*
* Within those ranges there are between 11 and 28 other style types which
* can be set with `style_type_number` (depending on the style type).
* Check Excel to find the style that you want. The dialog with the
* options laid out in numeric order are shown below:
*
* @image html tables14.png
*
* The default table style in Excel is 'Table Style Medium 9' (highlighted
* with a green border in the image above), which is set by default in
* libxlsxwriter as:
*
* @code
* lxw_table_options options = {
* .style_type = LXW_TABLE_STYLE_TYPE_MEDIUM,
* .style_type_number = 9,
* };
* @endcode
*
* You can also turn the table style off by setting it to Light 0:
*
* @code
* lxw_table_options options = {
* .style_type = LXW_TABLE_STYLE_TYPE_LIGHT,
* .style_type_number = 0,
* };
* @endcode
*
* @image html tables13.png
*
*/
uint8_t style_type;
/**
* The `style_type_number` parameter is used with `style_type` to set the
* style of a worksheet table. */
uint8_t style_type_number;
/**
* The `total_row` parameter can be used to turn on the total row in the
* last row of a table. It is distinguished from the other rows by a
* different formatting and also with dropdown `SUBTOTAL` functions:
*
* @code
* lxw_table_options options = {.total_row = LXW_TRUE};
*
* worksheet_add_table(worksheet, RANGE("B3:G8"), &options);
* @endcode
*
* @image html tables9.png
*
* The default total row doesn't have any captions or functions. These
* must by specified via the `columns` parameter below.
*/
uint8_t total_row;
/**
* The `columns` parameter can be used to set properties for columns
* within the table. See @ref ww_tables_columns for a detailed
* explanation.
*/
lxw_table_column **columns;
} lxw_table_options;
typedef struct lxw_table_obj {
@ -2337,7 +2583,7 @@ lxw_error worksheet_write_dynamic_array_formula(lxw_worksheet *worksheet,
* range. This is a syntactic shortcut since the array range isn't generally
* known for a dynamic range and specifying the initial cell is sufficient for
* Excel, as shown in the example below:
*
*
* @code
* worksheet_write_dynamic_formula(worksheet, 7, 1,
* "=_xlfn._xlws.SORT(_xlfn.UNIQUE(B2:B17))",
@ -4013,7 +4259,36 @@ lxw_error worksheet_conditional_format_range(lxw_worksheet *worksheet,
lxw_col_t last_col,
lxw_conditional_format
*conditional_format);
/**
* @brief Add an Excel table to a worksheet.
*
* @param worksheet Pointer to a lxw_worksheet instance to be updated.
* @param first_row The first row of the range. (All zero indexed.)
* @param first_col The first column of the range.
* @param last_row The last row of the range.
* @param last_col The last col of the range.
* @param options A #lxw_table_options struct to define the table options.
*
* @return A #lxw_error code.
*
* The `%worksheet_add_table()` function is used to add a table to a
* worksheet. Tables in Excel are a way of grouping a range of cells into a
* single entity that has common formatting or that can be referenced from
* formulas. Tables can have column headers, autofilters, total rows, column
* formulas and default formatting.
*
* @code
* worksheet_add_table(worksheet, 2, 1, 6, 5, NULL);
* @endcode
*
* Output:
*
* @image html tables1.png
*
* See @ref working_with_tables for more detailed usage information and also
* @ref tables.c.
*
*/
lxw_error worksheet_add_table(lxw_worksheet *worksheet, lxw_row_t first_row,
lxw_col_t first_col, lxw_row_t last_row,
lxw_col_t last_col, lxw_table_options *options);

View file

@ -9128,6 +9128,13 @@ worksheet_add_table(lxw_worksheet *self, lxw_row_t first_row,
lxw_table_obj *table_obj;
lxw_table_column **columns;
if (self->optimize) {
LXW_WARN_FORMAT("worksheet_add_table(): "
"worksheet tables aren't supported in "
"'constant_memory' mode");
return LXW_ERROR_FEATURE_NOT_SUPPORTED;
}
/* Swap last row/col with first row/col as necessary */
if (first_row > last_row) {
tmp_row = last_row;