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);
+}