diff --git a/include/xlsxwriter/worksheet.h b/include/xlsxwriter/worksheet.h index 5e9bd1a3..2655d55b 100644 --- a/include/xlsxwriter/worksheet.h +++ b/include/xlsxwriter/worksheet.h @@ -323,11 +323,13 @@ typedef struct lxw_worksheet { uint16_t print_scale; uint16_t rel_count; uint16_t vertical_dpi; + uint16_t zoom; uint8_t filter_on; uint8_t fit_page; uint8_t hcenter; uint8_t orientation; uint8_t outline_changed; + uint8_t outline_on; uint8_t page_order; uint8_t page_setup_changed; uint8_t page_view; @@ -336,9 +338,11 @@ typedef struct lxw_worksheet { uint8_t print_headers; uint8_t print_options_changed; uint8_t screen_gridlines; + uint8_t show_zeros; uint8_t tab_color; uint8_t vba_codename; uint8_t vcenter; + uint8_t zoom_scale_normal; double margin_left; double margin_right; @@ -1793,6 +1797,29 @@ void worksheet_set_v_pagebreaks(lxw_worksheet *worksheet, lxw_col_t breaks[]); */ void worksheet_print_across(lxw_worksheet *worksheet); +/** + * @brief Set the worksheet zoom factor. + * + * @param worksheet Pointer to a lxw_worksheet instance to be updated. + * @param scale Worksheet zoom factor. + * + * Set the worksheet zoom factor in the range `10 <= zoom <= 400`: + * + * @code + * worksheet_set_zoom(worksheet1, 50); + * worksheet_set_zoom(worksheet2, 75); + * worksheet_set_zoom(worksheet3, 300); + * worksheet_set_zoom(worksheet4, 400); + * @endcode + * + * The default zoom factor is 100. It isn't possible to set the zoom to + * "Selection" because it is calculated by Excel at run-time. + * + * Note, `%worksheet_zoom()` does not affect the scale of the printed + * page. For that you should use `worksheet_set_print_scale()`. + */ +void worksheet_set_zoom(lxw_worksheet *worksheet, uint16_t scale); + /** * @brief Set the option to display or hide gridlines on the screen and * the printed page. diff --git a/src/worksheet.c b/src/worksheet.c index f6ffd85a..0dfbadc8 100644 --- a/src/worksheet.c +++ b/src/worksheet.c @@ -121,6 +121,10 @@ _new_worksheet(lxw_worksheet_init_data *init_data) worksheet->print_gridlines = 0; worksheet->screen_gridlines = 1; worksheet->print_options_changed = 0; + worksheet->zoom = 100; + worksheet->zoom_scale_normal = LXW_TRUE; + worksheet->show_zeros = LXW_TRUE; + worksheet->outline_on = LXW_TRUE; if (init_data) { worksheet->name = init_data->name; @@ -1075,16 +1079,38 @@ _worksheet_write_sheet_view(lxw_worksheet *self) _INIT_ATTRIBUTES(); + /* Hide screen gridlines if required */ if (!self->screen_gridlines) _PUSH_ATTRIBUTES_STR("showGridLines", "0"); + /* Hide zeroes in cells. */ + if (!self->show_zeros) { + _PUSH_ATTRIBUTES_STR("showZeros", "0"); + } + + /* Show that the sheet tab is selected. */ if (self->selected) _PUSH_ATTRIBUTES_STR("tabSelected", "1"); + /* Turn outlines off. Also required in the outlinePr element. */ + if (!self->outline_on) { + _PUSH_ATTRIBUTES_STR("showOutlineSymbols", "0"); + } + /* Set the page view/layout mode if required. */ if (self->page_view) _PUSH_ATTRIBUTES_STR("view", "pageLayout"); + /* Set the zoom level. */ + if (self->zoom != 100) { + if (!self->page_view) { + _PUSH_ATTRIBUTES_INT("zoomScale", self->zoom); + + if (self->zoom_scale_normal) + _PUSH_ATTRIBUTES_INT("zoomScaleNormal", self->zoom); + } + } + _PUSH_ATTRIBUTES_STR("workbookViewId", "0"); if (self->panes.type != NO_PANES || !STAILQ_EMPTY(self->selections)) { @@ -3450,3 +3476,18 @@ worksheet_set_v_pagebreaks(lxw_worksheet *self, lxw_col_t vbreaks[]) { self->vbreaks = vbreaks; } + +/* + * Set the worksheet zoom factor. + */ +void +worksheet_set_zoom(lxw_worksheet *self, uint16_t scale) +{ + /* Confine the scale to Excel"s range */ + if (scale < 10 || scale > 400) { + LXW_WARN("Zoom factor scale outside range: 10 <= zoom <= 400"); + return; + } + + self->zoom = scale; +} diff --git a/test/unit/worksheet/test_worksheet_write_sheet_views1.c b/test/unit/worksheet/test_worksheet_write_sheet_views1.c index a070d3a7..97cbb3c0 100644 --- a/test/unit/worksheet/test_worksheet_write_sheet_views1.c +++ b/test/unit/worksheet/test_worksheet_write_sheet_views1.c @@ -10,17 +10,36 @@ #include "xlsxwriter/worksheet.h" -// Test the _write_sheet_views() function. -CTEST(worksheet, write_sheet_views) { +/* 1. Test the _write_sheet_views() method. */ +CTEST(worksheet, write_sheet_views01) { char* got; char exp[] = ""; FILE* testfile = tmpfile(); lxw_worksheet *worksheet = _new_worksheet(NULL); worksheet->file = testfile; + worksheet_select(worksheet); + _worksheet_write_sheet_views(worksheet); + + RUN_XLSX_STREQ(exp, got); + + _free_worksheet(worksheet); +} + +/* 2. Test the _write_sheet_views() method. */ +CTEST(worksheet, write_sheet_views02) { + char* got; + char exp[] = ""; + FILE* testfile = tmpfile(); + + lxw_worksheet *worksheet = _new_worksheet(NULL); + worksheet->file = testfile; + + worksheet_select(worksheet); + worksheet_set_zoom(worksheet, 100); _worksheet_write_sheet_views(worksheet); RUN_XLSX_STREQ(exp, got); @@ -28,3 +47,78 @@ CTEST(worksheet, write_sheet_views) { _free_worksheet(worksheet); } + +/* 3. Test the _write_sheet_views() method. With zoom. */ +CTEST(worksheet, write_sheet_views03) { + char* got; + char exp[] = ""; + FILE* testfile = tmpfile(); + + lxw_worksheet *worksheet = _new_worksheet(NULL); + worksheet->file = testfile; + + worksheet_select(worksheet); + worksheet_set_zoom(worksheet, 200); + _worksheet_write_sheet_views(worksheet); + + RUN_XLSX_STREQ(exp, got); + + _free_worksheet(worksheet); +} + + +/* 4. Test the _write_sheet_views() method. Right to left. */ +//CTEST(worksheet, write_sheet_views04) { +// char* got; +// char exp[] = ""; +// FILE* testfile = tmpfile(); +// +// lxw_worksheet *worksheet = _new_worksheet(NULL); +// worksheet->file = testfile; +// +// worksheet_select(worksheet); +// worksheet_right_to_left(worksheet); +// _worksheet_write_sheet_views(worksheet); +// +// RUN_XLSX_STREQ(exp, got); +// +// _free_worksheet(worksheet); +//} + + +/* 5. Test the _write_sheet_views() method. Hide zeroes. */ +//CTEST(worksheet, write_sheet_views05) { +// char* got; +// char exp[] = ""; +// FILE* testfile = tmpfile(); +// +// lxw_worksheet *worksheet = _new_worksheet(NULL); +// worksheet->file = testfile; +// +// worksheet_select(worksheet); +// worksheet_hide_zero(worksheet); +// _worksheet_write_sheet_views(worksheet); +// +// RUN_XLSX_STREQ(exp, got); +// +// _free_worksheet(worksheet); +//} + + +/* 6. Test the _write_sheet_views() method. Set page view mode. */ +CTEST(worksheet, write_sheet_views06) { + char* got; + char exp[] = ""; + FILE* testfile = tmpfile(); + + lxw_worksheet *worksheet = _new_worksheet(NULL); + worksheet->file = testfile; + + worksheet_select(worksheet); + worksheet_set_page_view(worksheet); + _worksheet_write_sheet_views(worksheet); + + RUN_XLSX_STREQ(exp, got); + + _free_worksheet(worksheet); +}