From e32b6643160f6e001b764a907e178bb7685dfe29 Mon Sep 17 00:00:00 2001 From: John McNamara Date: Wed, 4 May 2016 00:50:17 +0100 Subject: [PATCH] Initial working category axis. --- .indent.pro | 1 + include/xlsxwriter/chart.h | 3 +- src/chart.c | 43 +++++++++++++++++- test/functional/src/test_chart_bar01.c | 30 +++++++------ test/functional/src/test_chart_bar05.c | 47 ++++++++++++++++++++ test/functional/src/test_chart_bar51.c | 44 ++++++++++++++++++ test/functional/test_chart_bar.py | 6 +++ test/functional/xlsx_files/chart_bar01.xlsx | Bin 7013 -> 9278 bytes test/functional/xlsx_files/chart_bar05.xlsx | Bin 0 -> 9269 bytes test/functional/xlsx_files/chart_bar51.xlsx | Bin 0 -> 7013 bytes 10 files changed, 158 insertions(+), 16 deletions(-) create mode 100644 test/functional/src/test_chart_bar05.c create mode 100644 test/functional/src/test_chart_bar51.c create mode 100644 test/functional/xlsx_files/chart_bar05.xlsx create mode 100644 test/functional/xlsx_files/chart_bar51.xlsx diff --git a/.indent.pro b/.indent.pro index 620f81c0..bf7317de 100644 --- a/.indent.pro +++ b/.indent.pro @@ -82,6 +82,7 @@ -T lxw_row_col_options -T lxw_row_t -T lxw_selection +-T lxw_series_data_point -T lxw_series_range -T lxw_sst -T lxw_styles diff --git a/include/xlsxwriter/chart.h b/include/xlsxwriter/chart.h index cbfe3ea4..4ef3107f 100644 --- a/include/xlsxwriter/chart.h +++ b/include/xlsxwriter/chart.h @@ -35,7 +35,6 @@ typedef struct lxw_series_range { uint16_t first_col; uint16_t last_col; - uint8_t has_data_cache; uint16_t num_data_points; struct lxw_series_data_points *data_cache; @@ -72,6 +71,8 @@ typedef struct lxw_chart { uint32_t axis_id_3; uint32_t axis_id_4; + uint8_t cat_has_num_fmt; + struct lxw_chart_series_list *series_list; STAILQ_ENTRY (lxw_chart) list_pointers; diff --git a/src/chart.c b/src/chart.c index 9b4752c8..557d525e 100644 --- a/src/chart.c +++ b/src/chart.c @@ -391,6 +391,27 @@ _chart_write_num_ref(lxw_chart *self, lxw_series_range *range) lxw_xml_end_tag(self->file, "c:numRef"); } +/* + * Write the element. + */ +STATIC void +_chart_write_cat(lxw_chart *self, lxw_chart_series *series) +{ + /* Ignore elements for charts without category values. */ + if (!series->categories->formula) + return; + + /* TODO */ + self->cat_has_num_fmt = LXW_TRUE; + + lxw_xml_start_tag(self->file, "c:cat", NULL); + + /* Write the c:numRef element. */ + _chart_write_num_ref(self, series->categories); + + lxw_xml_end_tag(self->file, "c:cat"); +} + /* * Write the element. */ @@ -421,6 +442,9 @@ _chart_write_ser(lxw_chart *self, lxw_chart_series *series) /* Write the c:order element. */ _chart_write_order(self, index); + /* Write the c:cat element. */ + _chart_write_cat(self, series); + /* Write the c:val element. */ _chart_write_val(self, series); @@ -765,6 +789,10 @@ _chart_write_cat_axis(lxw_chart *self) /* Write the c:axPos element. */ _chart_write_axis_pos(self, "l"); + /* Write the c:numFmt element. */ + if (self->cat_has_num_fmt) + _chart_write_num_fmt(self); + /* Write the c:tickLblPos element. */ _chart_write_tick_lbl_pos(self); @@ -1013,8 +1041,19 @@ chart_add_series(lxw_chart *self, char *categories, char *values) series->values = calloc(1, sizeof(lxw_series_range)); GOTO_LABEL_ON_MEM_ERROR(series->values, mem_error); - series->categories->formula = lxw_strdup(categories); - series->values->formula = lxw_strdup(values); + if (categories) { + if (categories[0] == '=') + series->categories->formula = lxw_strdup(categories + 1); + else + series->categories->formula = lxw_strdup(categories); + } + + if (values) { + if (values[0] == '=') + series->values->formula = lxw_strdup(values + 1); + else + series->values->formula = lxw_strdup(values); + } lxw_chart_init_data_cache(series->categories); lxw_chart_init_data_cache(series->values); diff --git a/test/functional/src/test_chart_bar01.c b/test/functional/src/test_chart_bar01.c index 67bef43c..f8ab9a09 100644 --- a/test/functional/src/test_chart_bar01.c +++ b/test/functional/src/test_chart_bar01.c @@ -11,12 +11,13 @@ int main() { - lxw_workbook *workbook = new_workbook("test_chart_bar01.xlsx"); - lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); - lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_BAR); - lxw_chart_series *series1; - lxw_chart_series *series2; - int row, col; + lxw_workbook *workbook = new_workbook("test_chart_bar01.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_BAR); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 64052224; + chart->axis_id_2 = 64055552; uint8_t data[5][3] = { {1, 2, 3}, @@ -26,19 +27,22 @@ int main() { {5, 10, 15} }; + int row, col; for (row = 0; row < 5; row++) for (col = 0; col < 3; col++) worksheet_write_number(worksheet, row, col, data[row][col] , NULL); - series1 = chart_add_series(chart, NULL, "Sheet1!$A$1:$A$5"); - series2 = chart_add_series(chart, NULL, "Sheet1!$B$1:$B$5"); - - - /* Add the cached data for testing. */ - lxw_chart_add_data_cache(series1->values, data[0], 5, 3, 0); - lxw_chart_add_data_cache(series2->values, data[0], 5, 3, 1); + lxw_chart_series *series1 = chart_add_series(chart, "=Sheet1!$A$1:$A$5", "=Sheet1!$B$1:$B$5"); + lxw_chart_series *series2 = chart_add_series(chart, "=Sheet1!$A$1:$A$5", "=Sheet1!$C$1:$C$5"); worksheet_insert_chart(worksheet, CELL("E9"), chart); + /* Add cache data for testing. */ + lxw_chart_add_data_cache(series1->categories, data[0], 5, 3, 0); + lxw_chart_add_data_cache(series2->categories, data[0], 5, 3, 0); + lxw_chart_add_data_cache(series1->values, data[0], 5, 3, 1); + lxw_chart_add_data_cache(series2->values, data[0], 5, 3, 2); + + return workbook_close(workbook); } diff --git a/test/functional/src/test_chart_bar05.c b/test/functional/src/test_chart_bar05.c new file mode 100644 index 00000000..cd927240 --- /dev/null +++ b/test/functional/src/test_chart_bar05.c @@ -0,0 +1,47 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2015, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_bar05.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_BAR); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 64264064; + chart->axis_id_2 = 64447232; + + uint8_t data[5][3] = { + {1, 2, 3}, + {2, 4, 6}, + {3, 6, 9}, + {4, 8, 12}, + {5, 10, 15} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col] , NULL); + + lxw_chart_series *series1 = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + lxw_chart_series *series2 = chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + lxw_chart_series *series3 = chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + /* Add cache data for testing. */ + lxw_chart_add_data_cache(series1->values, data[0], 5, 3, 0); + lxw_chart_add_data_cache(series2->values, data[0], 5, 3, 1); + lxw_chart_add_data_cache(series3->values, data[0], 5, 3, 2); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_bar51.c b/test/functional/src/test_chart_bar51.c new file mode 100644 index 00000000..41f3ea66 --- /dev/null +++ b/test/functional/src/test_chart_bar51.c @@ -0,0 +1,44 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2015, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_bar51.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_BAR); + lxw_chart_series *series1; + lxw_chart_series *series2; + int row, col; + + uint8_t data[5][3] = { + {1, 2, 3}, + {2, 4, 6}, + {3, 6, 9}, + {4, 8, 12}, + {5, 10, 15} + }; + + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col] , NULL); + + series1 = chart_add_series(chart, NULL, "Sheet1!$A$1:$A$5"); + series2 = chart_add_series(chart, NULL, "Sheet1!$B$1:$B$5"); + + + /* Add the cached data for testing. */ + lxw_chart_add_data_cache(series1->values, data[0], 5, 3, 0); + lxw_chart_add_data_cache(series2->values, data[0], 5, 3, 1); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/test_chart_bar.py b/test/functional/test_chart_bar.py index fdc770af..e828c342 100644 --- a/test/functional/test_chart_bar.py +++ b/test/functional/test_chart_bar.py @@ -16,5 +16,11 @@ class TestCompareXLSXFiles(base_test_class.XLSXBaseTest): def test_chart_bar01(self): self.run_exe_test('test_chart_bar01') + def test_chart_bar05(self): + self.run_exe_test('test_chart_bar05') + + def test_chart_bar51(self): + self.run_exe_test('test_chart_bar51') + diff --git a/test/functional/xlsx_files/chart_bar01.xlsx b/test/functional/xlsx_files/chart_bar01.xlsx index 96ea8a027745b45bcd18582ad43fc2cb0e571db2..4ce2ba38c8dbb0718239fd4b0e53260be79e85cc 100644 GIT binary patch literal 9278 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 diff --git a/test/functional/xlsx_files/chart_bar05.xlsx b/test/functional/xlsx_files/chart_bar05.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6c65e4f67c7dbb06a6eb072916b51147693d854c GIT binary patch literal 9269 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 literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_bar51.xlsx b/test/functional/xlsx_files/chart_bar51.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..96ea8a027745b45bcd18582ad43fc2cb0e571db2 GIT binary patch literal 7013 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 literal 0 HcmV?d00001