Skip to content

Commit

Permalink
Added worksheet_set_zoom() method.
Browse files Browse the repository at this point in the history
Closes #17.
  • Loading branch information
jmcnamara committed Dec 10, 2015
1 parent 446a688 commit 45b084d
Show file tree
Hide file tree
Showing 3 changed files with 164 additions and 2 deletions.
27 changes: 27 additions & 0 deletions include/xlsxwriter/worksheet.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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.
Expand Down
41 changes: 41 additions & 0 deletions src/worksheet.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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;
}
98 changes: 96 additions & 2 deletions test/unit/worksheet/test_worksheet_write_sheet_views1.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,115 @@

#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[] = "<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews>";
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[] = "<sheetViews><sheetView tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews>";
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);

_free_worksheet(worksheet);
}


/* 3. Test the _write_sheet_views() method. With zoom. */
CTEST(worksheet, write_sheet_views03) {
char* got;
char exp[] = "<sheetViews><sheetView tabSelected=\"1\" zoomScale=\"200\" zoomScaleNormal=\"200\" workbookViewId=\"0\"/></sheetViews>";
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[] = "<sheetViews><sheetView rightToLeft=\"1\" tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews>";
// 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[] = "<sheetViews><sheetView showZeros=\"0\" tabSelected=\"1\" workbookViewId=\"0\"/></sheetViews>";
// 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[] = "<sheetViews><sheetView tabSelected=\"1\" view=\"pageLayout\" workbookViewId=\"0\"/></sheetViews>";
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);
}

0 comments on commit 45b084d

Please sign in to comment.