From 0bc6eeb66a363b4df73a057d5a963c1d55180a78 Mon Sep 17 00:00:00 2001 From: John McNamara Date: Thu, 9 Apr 2015 02:16:02 +0100 Subject: [PATCH] Added support for headers and footers. --- dev/release/fix_example_docs.pl | 1 + docs/images/headers_footers.png | Bin 0 -> 82339 bytes docs/src/examples.dox | 9 +- examples/headers_footers.c | 101 +++++++ include/xlsxwriter/worksheet.h | 257 ++++++++++++++++++ src/worksheet.c | 107 ++++++++ .../test_worksheet_write_header_footer.c | 108 ++++++++ .../test_worksheet_write_page_margin.c | 23 ++ 8 files changed, 605 insertions(+), 1 deletion(-) create mode 100644 docs/images/headers_footers.png create mode 100644 examples/headers_footers.c create mode 100644 test/unit/worksheet/test_worksheet_write_header_footer.c diff --git a/dev/release/fix_example_docs.pl b/dev/release/fix_example_docs.pl index c64ad06c..09d3d369 100644 --- a/dev/release/fix_example_docs.pl +++ b/dev/release/fix_example_docs.pl @@ -25,6 +25,7 @@ my @examples = ( [ 'utf8.c', 'A example of some UTF-8 text' ], [ 'constant_memory.c', 'Write a large file with constant memory usage' ], [ 'merge1.c', 'Create a merged range of cells' ], + [ 'headers_footers.c', 'Example of adding worksheet headers/footers' ], [ 'defined_name.c', 'Example of how to create defined names' ], ); diff --git a/docs/images/headers_footers.png b/docs/images/headers_footers.png new file mode 100644 index 0000000000000000000000000000000000000000..d6ad0490f0db03a2dac45e54a1c6520e78b61b31 GIT binary patch literal 82339 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 F{|7)ShlT(E literal 0 HcmV?d00001 diff --git a/docs/src/examples.dox b/docs/src/examples.dox index 7200c4b1..74df0eb2 100644 --- a/docs/src/examples.dox +++ b/docs/src/examples.dox @@ -104,10 +104,17 @@ Next example: @ref merge1.c @example merge1.c Example of merging cells in a worksheet. -Next example: @ref defined_name.c +Next example: @ref headers_footers.c @image html merge1.png +@example headers_footers.c +Example of adding worksheet headers and footers to worksheets. + +Next example: @ref defined_name.c +@image html headers_footers.png + + @example defined_name.c Example of how to create defined names (named ranges) using libxlsxwriter. diff --git a/examples/headers_footers.c b/examples/headers_footers.c new file mode 100644 index 00000000..187e4556 --- /dev/null +++ b/examples/headers_footers.c @@ -0,0 +1,101 @@ +/* + * This program shows several examples of how to set up headers and + * footers with libxlsxwriter. + * + * The control characters used in the header/footer strings are: + * + * Control Category Description + * ======= ======== =========== + * &L Justification Left + * &C Center + * &R Right + * &P Information Page number + * &N Total number of pages + * &D Date + * &T Time + * &F File name + * &A Worksheet name + * &fontsize Font Font size + * &"font,style" Font name and style + * &U Single underline + * &E Double underline + * &S Strikethrough + * &X Superscript + * &Y Subscript + * &[Picture] Images Image placeholder + * &G Same as &[Picture] + * && Miscellaneous Literal ampersand & + * + * Copyright 2014-2015, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + + +int main() { + + lxw_workbook *workbook = new_workbook("headers_footers.xlsx"); + + char preview[] = "Select Print Preview to see the header and footer"; + + /* A simple example to start */ + lxw_worksheet *worksheet1 = workbook_add_worksheet(workbook, "Simple"); + char header1[] = "&CHere is some centred text."; + char footer1[] = "&LHere is some left aligned text."; + + worksheet_set_header(worksheet1, header1); + worksheet_set_footer(worksheet1, footer1); + + worksheet_set_column(worksheet1, 0, 0, 50, NULL, NULL); + worksheet_write_string(worksheet1, 0, 0, preview, NULL); + + + /* This is an example of some of the header/footer variables. */ + lxw_worksheet *worksheet2 = workbook_add_worksheet(workbook, "Variables"); + char header2[] = "&LPage &P of &N" "&CFilename: &F" "&RSheetname: &A"; + char footer2[] = "&LCurrent date: &D" "&RCurrent time: &T"; + + worksheet_set_header(worksheet2, header2); + worksheet_set_footer(worksheet2, footer2); + + worksheet_set_column(worksheet2, 0, 0, 50, NULL, NULL); + worksheet_write_string(worksheet2, 0, 0, preview, NULL); + + + /* This example shows how to use more than one font. */ + lxw_worksheet *worksheet3 = workbook_add_worksheet(workbook, "Mixed fonts"); + char header3[] = "&C&\"Courier New,Bold\"Hello &\"Arial,Italic\"World"; + char footer3[] = "&C&\"Symbol\"e&\"Arial\" = mc&X2"; + + worksheet_set_header(worksheet3, header3); + worksheet_set_footer(worksheet3, footer3); + + worksheet_set_column(worksheet3, 0, 0, 50, NULL, NULL); + worksheet_write_string(worksheet3, 0, 0, preview, NULL); + + + /*Example of line wrapping. */ + lxw_worksheet *worksheet4 = workbook_add_worksheet(workbook, "Word wrap"); + char header4[] = "&CHeading 1\nHeading 2"; + + worksheet_set_header(worksheet4, header4); + + worksheet_set_column(worksheet4, 0, 0, 50, NULL, NULL); + worksheet_write_string(worksheet4, 0, 0, preview, NULL); + + + /* Example of inserting a literal ampersand & */ + lxw_worksheet *worksheet5 = workbook_add_worksheet(workbook, "Ampersand"); + char header5[] = "&CCuriouser && Curiouser - Attorneys at Law"; + + worksheet_set_header(worksheet5, header5); + + worksheet_set_column(worksheet5, 0, 0, 50, NULL, NULL); + worksheet_write_string(worksheet5, 0, 0, preview, NULL); + + + workbook_close(workbook); + + return 0; +} diff --git a/include/xlsxwriter/worksheet.h b/include/xlsxwriter/worksheet.h index 54094ecc..d1953476 100644 --- a/include/xlsxwriter/worksheet.h +++ b/include/xlsxwriter/worksheet.h @@ -54,6 +54,7 @@ #include "utility.h" #define LXW_COL_META_MAX 128 +#define LXW_HEADER_FOOTER_MAX 255 /** Default column width in Excel */ #define LXW_DEF_COL_WIDTH 8.43 @@ -134,6 +135,18 @@ typedef struct lxw_merged_range { STAILQ_ENTRY (lxw_merged_range) list_pointers; } lxw_merged_range; +/** + * @brief Header and footer options. + * + * Optional parameters used in the worksheet_set_header_opt() and + * worksheet_set_footer_opt() functions. + * + */ +typedef struct lxw_header_footer_options { + /** Header or footer margin in inches. Excel default is 0.3. */ + double margin; +} lxw_header_footer_options; + /** * @brief Struct to represent an Excel worksheet. * @@ -195,6 +208,10 @@ typedef struct lxw_worksheet { double margin_header; double margin_footer; + uint8_t header_footer_changed; + char header[LXW_HEADER_FOOTER_MAX]; + char footer[LXW_HEADER_FOOTER_MAX]; + uint16_t merged_range_count; STAILQ_ENTRY (lxw_worksheet) list_pointers; @@ -938,6 +955,242 @@ void worksheet_set_paper(lxw_worksheet *worksheet, uint8_t paper_type); void worksheet_set_margins(lxw_worksheet *worksheet, double left, double right, double top, double bottom); +/** + * @brief Set the printed page header caption. + * + * @param worksheet Pointer to a lxw_worksheet instance to be updated. + * @param string The header string. + * + * @return 0 for success, non-zero on error. + * + * Headers and footers are generated using a string which is a combination of + * plain text and control characters. + * + * The available control character are: + * + * + * | Control | Category | Description | + * | --------------- | ------------- | --------------------- | + * | `&L` | Justification | Left | + * | `&C` | | Center | + * | `&R` | | Right | + * | `&P` | Information | Page number | + * | `&N` | | Total number of pages | + * | `&D` | | Date | + * | `&T` | | Time | + * | `&F` | | File name | + * | `&A` | | Worksheet name | + * | `&Z` | | Workbook path | + * | `&fontsize` | Font | Font size | + * | `&"font,style"` | | Font name and style | + * | `&U` | | Single underline | + * | `&E` | | Double underline | + * | `&S` | | Strikethrough | + * | `&X` | | Superscript | + * | `&Y` | | Subscript | + * + * + * Text in headers and footers can be justified (aligned) to the left, center + * and right by prefixing the text with the control characters `&L`, `&C` and + * `&R`. + * + * For example (with ASCII art representation of the results): + * + * @code + * worksheet_set_header(worksheet, "&LHello"); + * + * --------------------------------------------------------------- + * | | + * | Hello | + * | | + * + * + * worksheet_set_header(worksheet, "&CHello"); + * + * --------------------------------------------------------------- + * | | + * | Hello | + * | | + * + * + * worksheet_set_header(worksheet, "&RHello"); + * + * --------------------------------------------------------------- + * | | + * | Hello | + * | | + * + * + * @endcode + * + * For simple text, if you do not specify any justification the text will be + * centred. However, you must prefix the text with `&C` if you specify a font + * name or any other formatting: + * + * @code + * worksheet_set_header(worksheet, "Hello"); + * + * --------------------------------------------------------------- + * | | + * | Hello | + * | | + * + * @endcode + * + * You can have text in each of the justification regions: + * + * @code + * worksheet_set_header(worksheet, "&LCiao&CBello&RCielo"); + * + * --------------------------------------------------------------- + * | | + * | Ciao Bello Cielo | + * | | + * + * @endcode + * + * The information control characters act as variables that Excel will update + * as the workbook or worksheet changes. Times and dates are in the users + * default format: + * + * @code + * worksheet_set_header(worksheet, "&CPage &P of &N"); + * + * --------------------------------------------------------------- + * | | + * | Page 1 of 6 | + * | | + * + * worksheet_set_header(worksheet, "&CUpdated at &T"); + * + * --------------------------------------------------------------- + * | | + * | Updated at 12:30 PM | + * | | + * + * @endcode + * + * You can specify the font size of a section of the text by prefixing it with + * the control character `&n` where `n` is the font size: + * + * @code + * worksheet_set_header(worksheet1, "&C&30Hello Big"); + * worksheet_set_header(worksheet2, "&C&10Hello Small"); + * + * @endcode + * + * You can specify the font of a section of the text by prefixing it with the + * control sequence `&"font,style"` where `fontname` is a font name such as + * Windows font descriptions: "Regular", "Italic", "Bold" or "Bold Italic": + * "Courier New" or "Times New Roman" and `style` is one of the standard + * + * @code + * worksheet_set_header(worksheet1, "&C&\"Courier New,Italic\"Hello"); + * worksheet_set_header(worksheet2, "&C&\"Courier New,Bold Italic\"Hello"); + * worksheet_set_header(worksheet3, "&C&\"Times New Roman,Regular\"Hello"); + * + * @endcode + * + * It is possible to combine all of these features together to create + * sophisticated headers and footers. As an aid to setting up complicated + * headers and footers you can record a page set-up as a macro in Excel and + * look at the format strings that VBA produces. Remember however that VBA + * uses two double quotes `""` to indicate a single double quote. For the last + * example above the equivalent VBA code looks like this: + * + * @code + * .LeftHeader = "" + * .CenterHeader = "&""Times New Roman,Regular""Hello" + * .RightHeader = "" + * + * @endcode + * + * Alternatively you can inspect the header and footer strings in an Excel + * file by unzipping it and grepping the XML sub-files. The following shows + * how to do that using libxml's xmllint to format the XML for clarity: + * + * @code + * + * $ unzip myfile.xlsm -d myfile + * $ xmllint --format `find myfile -name "*.xml" | xargs` \ + * | egrep "Header|Footer" + * + * + * &L&P + * + * + * @endcode + * + * Note that in this case you need to unescape the Html. In the above example + * the header string would be `&L&P`. + * + * To include a single literal ampersand `&` in a header or footer you should + * use a double ampersand `&&`: + * + * @code + * worksheet_set_header(worksheet, "&CCuriouser && Curiouser - Attorneys at Law"); + * @endcode + * + * Note, the header or footer string must be less than 255 characters. Strings + * longer than this will not be written. + * + */ +uint8_t worksheet_set_header(lxw_worksheet *worksheet, char *string); + +/** + * @brief Set the printed page footer caption. + * + * @param worksheet Pointer to a lxw_worksheet instance to be updated. + * @param string The footer string. + * + * @return 0 for success, non-zero on error. + * + * The syntax of this function is the same as worksheet_set_header(). + * + */ +uint8_t worksheet_set_footer(lxw_worksheet *worksheet, char *string); + +/** + * @brief Set the printed page header caption with additional options. + * + * @param worksheet Pointer to a lxw_worksheet instance to be updated. + * @param string The header string. + * @param options Header options. + * + * @return 0 for success, non-zero on error. + * + * The syntax of this function is the same as worksheet_set_header() with an + * additional parameter to specify options for the header. + * + * Currently, the only available option is the header margin: + * + * @code + * + * lxw_header_footer_options header_options = { 0.2 }; + * + * worksheet_set_header_opt(worksheet, "Some text", &header_options); + * + * @endcode + * + */ +uint8_t worksheet_set_header_opt(lxw_worksheet *worksheet, char *string, + lxw_header_footer_options * options); + +/** + * @brief Set the printed page footer caption with additional options. + * + * @param worksheet Pointer to a lxw_worksheet instance to be updated. + * @param string The footer string. + * @param options Footer options. + * + * @return 0 for success, non-zero on error. + * + * The syntax of this function is the same as worksheet_set_header_opt(). + * + */ +uint8_t worksheet_set_footer_opt(lxw_worksheet *worksheet, char *string, + lxw_header_footer_options * options); + /** * @brief Set the order in which pages are printed. * @@ -991,6 +1244,10 @@ STATIC void _write_merge_cell(lxw_worksheet *worksheet, lxw_merged_range * merged_range); STATIC void _write_merge_cells(lxw_worksheet *worksheet); +STATIC void _worksheet_write_odd_header(lxw_worksheet *worksheet); +STATIC void _worksheet_write_odd_footer(lxw_worksheet *worksheet); +STATIC void _worksheet_write_header_footer(lxw_worksheet *worksheet); + #endif /* TESTING */ /* *INDENT-OFF* */ diff --git a/src/worksheet.c b/src/worksheet.c index 69df42a8..9f5078d5 100644 --- a/src/worksheet.c +++ b/src/worksheet.c @@ -1235,6 +1235,44 @@ _write_merge_cells(lxw_worksheet *self) } } +/* + * Write the element. + */ +STATIC void +_worksheet_write_odd_header(lxw_worksheet *self) +{ + _xml_data_element(self->file, "oddHeader", self->header, NULL); +} + +/* + * Write the element. + */ +STATIC void +_worksheet_write_odd_footer(lxw_worksheet *self) +{ + _xml_data_element(self->file, "oddFooter", self->footer, NULL); +} + +/* + * Write the element. + */ +STATIC void +_worksheet_write_header_footer(lxw_worksheet *self) +{ + if (!self->header_footer_changed) + return; + + _xml_start_tag(self->file, "headerFooter", NULL); + + if (self->header[0] != '\0') + _worksheet_write_odd_header(self); + + if (self->footer[0] != '\0') + _worksheet_write_odd_footer(self); + + _xml_end_tag(self->file, "headerFooter"); +} + /* * Check that row and col are within the allowed Excel range and store max * and min values for use in other methods/elements. @@ -1316,6 +1354,9 @@ _worksheet_assemble_xml_file(lxw_worksheet *self) /* Write the worksheet page setup. */ _worksheet_write_page_setup(self); + /* Write the headerFooter element. */ + _worksheet_write_header_footer(self); + /* Close the worksheet tag. */ _xml_end_tag(self->file, "worksheet"); } @@ -1830,3 +1871,69 @@ worksheet_set_margins(lxw_worksheet *self, double left, double right, if (bottom >= 0) self->margin_bottom = bottom; } + +/* + * Set the page header caption and options. + */ +uint8_t +worksheet_set_header_opt(lxw_worksheet *self, char *string, + lxw_header_footer_options * options) +{ + if (options) { + if (options->margin > 0) + self->margin_header = options->margin; + } + + if (!string) + return 1; + + if (strlen(string) >= LXW_HEADER_FOOTER_MAX) + return 1; + + strcpy(self->header, string); + self->header_footer_changed = 1; + + return 0; +} + +/* + * Set the page footer caption and options. + */ +uint8_t +worksheet_set_footer_opt(lxw_worksheet *self, char *string, + lxw_header_footer_options * options) +{ + if (options) { + if (options->margin > 0) + self->margin_footer = options->margin; + } + + if (!string) + return 1; + + if (strlen(string) >= LXW_HEADER_FOOTER_MAX) + return 1; + + strcpy(self->footer, string); + self->header_footer_changed = 1; + + return 0; +} + +/* + * Set the page header caption. + */ +uint8_t +worksheet_set_header(lxw_worksheet *self, char *string) +{ + return worksheet_set_header_opt(self, string, NULL); +} + +/* + * Set the page footer caption. + */ +uint8_t +worksheet_set_footer(lxw_worksheet *self, char *string) +{ + return worksheet_set_footer_opt(self, string, NULL); +} diff --git a/test/unit/worksheet/test_worksheet_write_header_footer.c b/test/unit/worksheet/test_worksheet_write_header_footer.c new file mode 100644 index 00000000..2c4c2173 --- /dev/null +++ b/test/unit/worksheet/test_worksheet_write_header_footer.c @@ -0,0 +1,108 @@ +/* + * Tests for the lib_xlsx_writer library. + * + * Copyright 2014, John McNamara, jmcnamara@cpan.org + * + */ + +#include "../ctest.h" +#include "../helper.h" + +#include "xlsxwriter/worksheet.h" + +// Test the header and footer functions. +CTEST(worksheet, write_odd_header) { + + char* got; + char exp[] = "Page &P of &N"; + FILE* testfile = tmpfile(); + + lxw_worksheet *worksheet = _new_worksheet(NULL); + worksheet->file = testfile; + + worksheet_set_header(worksheet, "Page &P of &N"); + + _worksheet_write_odd_header(worksheet); + + RUN_XLSX_STREQ(exp, got); + + _free_worksheet(worksheet); +} + +// Test the header and footer functions. +CTEST(worksheet, write_odd_footer) { + + char* got; + char exp[] = "&F"; + FILE* testfile = tmpfile(); + + lxw_worksheet *worksheet = _new_worksheet(NULL); + worksheet->file = testfile; + + worksheet_set_footer(worksheet, "&F"); + + _worksheet_write_odd_footer(worksheet); + + RUN_XLSX_STREQ(exp, got); + + _free_worksheet(worksheet); +} + + +// Test the header and footer functions. +CTEST(worksheet, _worksheet_write_header_footer1) { + + char* got; + char exp[] = "Page &P of &N"; + FILE* testfile = tmpfile(); + + lxw_worksheet *worksheet = _new_worksheet(NULL); + worksheet->file = testfile; + + worksheet_set_header(worksheet, "Page &P of &N"); + + _worksheet_write_header_footer(worksheet); + + RUN_XLSX_STREQ(exp, got); + + _free_worksheet(worksheet); +} + +// Test the header and footer functions. +CTEST(worksheet, _worksheet_write_header_footer2) { + + char* got; + char exp[] = "&F"; + FILE* testfile = tmpfile(); + + lxw_worksheet *worksheet = _new_worksheet(NULL); + worksheet->file = testfile; + + worksheet_set_footer(worksheet, "&F"); + + _worksheet_write_header_footer(worksheet); + + RUN_XLSX_STREQ(exp, got); + + _free_worksheet(worksheet); +} + +// Test the header and footer functions. +CTEST(worksheet, _worksheet_write_header_footer3) { + + char* got; + char exp[] = "Page &P of &N&F"; + FILE* testfile = tmpfile(); + + lxw_worksheet *worksheet = _new_worksheet(NULL); + worksheet->file = testfile; + + worksheet_set_header(worksheet, "Page &P of &N"); + worksheet_set_footer(worksheet, "&F"); + + _worksheet_write_header_footer(worksheet); + + RUN_XLSX_STREQ(exp, got); + + _free_worksheet(worksheet); +} diff --git a/test/unit/worksheet/test_worksheet_write_page_margin.c b/test/unit/worksheet/test_worksheet_write_page_margin.c index 25728b02..4e374621 100644 --- a/test/unit/worksheet/test_worksheet_write_page_margin.c +++ b/test/unit/worksheet/test_worksheet_write_page_margin.c @@ -116,3 +116,26 @@ CTEST(worksheet, write_page_margin06) { _free_worksheet(worksheet); } + +/* Test the _write_page_margins() method. */ +CTEST(worksheet, write_page_margin07) { + char* got; + char exp[] = ""; + FILE* testfile = tmpfile(); + lxw_header_footer_options header_options = {0.2}; + lxw_header_footer_options footer_options = {0.4}; + + lxw_worksheet *worksheet = _new_worksheet(NULL); + worksheet->file = testfile; + + worksheet_set_header_opt(worksheet, "", &header_options); + worksheet_set_footer_opt(worksheet, "", &footer_options); + + _worksheet_write_page_margins(worksheet); + + RUN_XLSX_STREQ(exp, got); + + _free_worksheet(worksheet); +} +