xlsxwriter 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Rakefile +40 -0
- data/ext/xlsxwriter/chart.c +105 -0
- data/ext/xlsxwriter/chart.h +27 -0
- data/ext/xlsxwriter/extconf.rb +14 -0
- data/ext/xlsxwriter/format.c +67 -0
- data/ext/xlsxwriter/format.h +9 -0
- data/ext/xlsxwriter/libxlsxwriter/LICENSE.txt +89 -0
- data/ext/xlsxwriter/libxlsxwriter/Makefile +141 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter.h +23 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/app.h +79 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/chart.h +1093 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/common.h +336 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/content_types.h +74 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/core.h +51 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/custom.h +52 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/drawing.h +111 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/format.h +1214 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/hash_table.h +76 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/packager.h +80 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/relationships.h +77 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/shared_strings.h +83 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/styles.h +77 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/theme.h +47 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/third_party/ioapi.h +215 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/third_party/queue.h +694 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/third_party/tmpfileplus.h +53 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/third_party/tree.h +801 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/third_party/zip.h +375 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/utility.h +166 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/workbook.h +751 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/worksheet.h +2641 -0
- data/ext/xlsxwriter/libxlsxwriter/include/xlsxwriter/xmlwriter.h +178 -0
- data/ext/xlsxwriter/libxlsxwriter/lib/.gitignore +0 -0
- data/ext/xlsxwriter/libxlsxwriter/src/Makefile +125 -0
- data/ext/xlsxwriter/libxlsxwriter/src/app.c +439 -0
- data/ext/xlsxwriter/libxlsxwriter/src/chart.c +3420 -0
- data/ext/xlsxwriter/libxlsxwriter/src/content_types.c +341 -0
- data/ext/xlsxwriter/libxlsxwriter/src/core.c +293 -0
- data/ext/xlsxwriter/libxlsxwriter/src/custom.c +224 -0
- data/ext/xlsxwriter/libxlsxwriter/src/drawing.c +746 -0
- data/ext/xlsxwriter/libxlsxwriter/src/format.c +728 -0
- data/ext/xlsxwriter/libxlsxwriter/src/hash_table.c +223 -0
- data/ext/xlsxwriter/libxlsxwriter/src/packager.c +877 -0
- data/ext/xlsxwriter/libxlsxwriter/src/relationships.c +242 -0
- data/ext/xlsxwriter/libxlsxwriter/src/shared_strings.c +264 -0
- data/ext/xlsxwriter/libxlsxwriter/src/styles.c +1086 -0
- data/ext/xlsxwriter/libxlsxwriter/src/theme.c +348 -0
- data/ext/xlsxwriter/libxlsxwriter/src/utility.c +512 -0
- data/ext/xlsxwriter/libxlsxwriter/src/workbook.c +1895 -0
- data/ext/xlsxwriter/libxlsxwriter/src/worksheet.c +4992 -0
- data/ext/xlsxwriter/libxlsxwriter/src/xmlwriter.c +355 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/Makefile +44 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/crypt.h +131 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/ioapi.c +247 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/ioapi.h +209 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/iowin32.c +456 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/iowin32.h +28 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/miniunz.c +660 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/minizip.c +520 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/mztools.c +291 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/mztools.h +37 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/unzip.c +2125 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/unzip.h +437 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/zip.c +2007 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/minizip/zip.h +367 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/tmpfileplus/Makefile +42 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.c +342 -0
- data/ext/xlsxwriter/libxlsxwriter/third_party/tmpfileplus/tmpfileplus.h +53 -0
- data/ext/xlsxwriter/workbook.c +257 -0
- data/ext/xlsxwriter/workbook.h +42 -0
- data/ext/xlsxwriter/workbook_properties.c +103 -0
- data/ext/xlsxwriter/workbook_properties.h +10 -0
- data/ext/xlsxwriter/worksheet.c +1064 -0
- data/ext/xlsxwriter/worksheet.h +74 -0
- data/ext/xlsxwriter/xlsxwriter.c +239 -0
- data/lib/xlsxwriter.rb +6 -0
- data/lib/xlsxwriter/version.rb +3 -0
- data/lib/xlsxwriter/worksheet.rb +72 -0
- data/test/run-test.rb +11 -0
- data/test/support/xlsx_comparable.rb +109 -0
- data/test/test-array-formula.rb +33 -0
- data/test/test-autofilter.rb +70 -0
- data/test/test-chart-area.rb +25 -0
- data/test/test-data.rb +65 -0
- data/test/test-default-row.rb +25 -0
- data/test/test-defined-name.rb +46 -0
- data/test/test-escapes.rb +33 -0
- data/test/test-fit-to-pages.rb +21 -0
- data/test/test-formatting.rb +137 -0
- data/test/test-gridlines.rb +15 -0
- data/test/test-hyperlink.rb +67 -0
- data/test/test-image.rb +84 -0
- data/test/test-merge-range.rb +18 -0
- data/test/test-misc.rb +29 -0
- data/test/test-optimize.rb +32 -0
- data/test/test-page-breaks.rb +13 -0
- data/test/test-page-setup.rb +28 -0
- data/test/test-panes.rb +45 -0
- data/test/test-print-area.rb +19 -0
- data/test/test-print-options.rb +61 -0
- data/test/test-print-scale.rb +12 -0
- data/test/test-properties.rb +51 -0
- data/test/test-protect.rb +27 -0
- data/test/test-repeat.rb +23 -0
- data/test/test-row-col-format.rb +35 -0
- data/test/test-set-selection.rb +13 -0
- data/test/test-set-start-page.rb +13 -0
- data/test/test-simple.rb +62 -0
- data/test/test-types.rb +17 -0
- data/test/xlsx-func-testcase.rb +36 -0
- metadata +228 -0
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#include <ruby.h>
|
|
2
|
+
#include "xlsxwriter.h"
|
|
3
|
+
|
|
4
|
+
#ifndef __WORKSHEET__
|
|
5
|
+
#define __WORKSHEET__
|
|
6
|
+
|
|
7
|
+
struct worksheet {
|
|
8
|
+
lxw_worksheet *worksheet;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
VALUE worksheet_alloc(VALUE klass);
|
|
12
|
+
VALUE worksheet_init(int argc, VALUE *argv, VALUE self);
|
|
13
|
+
VALUE worksheet_release(VALUE self);
|
|
14
|
+
void worksheet_free(void *);
|
|
15
|
+
|
|
16
|
+
VALUE worksheet_write_string_(int argc, VALUE *argv, VALUE self);
|
|
17
|
+
VALUE worksheet_write_number_(int argc, VALUE *argv, VALUE self);
|
|
18
|
+
VALUE worksheet_write_formula_(int argc, VALUE *argv, VALUE self);
|
|
19
|
+
VALUE worksheet_write_array_formula_(int argc, VALUE *argv, VALUE self);
|
|
20
|
+
VALUE worksheet_write_datetime_(int argc, VALUE *argv, VALUE self);
|
|
21
|
+
VALUE worksheet_write_url_(int argc, VALUE *argv, VALUE self);
|
|
22
|
+
VALUE worksheet_write_boolean_(int argc, VALUE *argv, VALUE self);
|
|
23
|
+
VALUE worksheet_write_blank_(int argc, VALUE *argv, VALUE self);
|
|
24
|
+
VALUE worksheet_write_formula_num_(int argc, VALUE *argv, VALUE self);
|
|
25
|
+
VALUE worksheet_set_row_(VALUE self, VALUE row, VALUE opts);
|
|
26
|
+
VALUE worksheet_set_column_(VALUE self, VALUE col_from, VALUE col_to, VALUE opts);
|
|
27
|
+
VALUE worksheet_insert_image_(int argc, VALUE *argv, VALUE self);
|
|
28
|
+
VALUE worksheet_insert_chart_(int argc, VALUE *argv, VALUE self);
|
|
29
|
+
VALUE worksheet_merge_range_(int argc, VALUE *argv, VALUE self);
|
|
30
|
+
VALUE worksheet_autofilter_(int argc, VALUE *argv, VALUE self);
|
|
31
|
+
VALUE worksheet_activate_(VALUE self);
|
|
32
|
+
VALUE worksheet_select_(VALUE self);
|
|
33
|
+
VALUE worksheet_hide_(VALUE self);
|
|
34
|
+
VALUE worksheet_set_first_sheet_(VALUE self);
|
|
35
|
+
VALUE worksheet_freeze_panes_(int argc, VALUE *argv, VALUE self);
|
|
36
|
+
VALUE worksheet_split_panes_(VALUE self, VALUE vertical, VALUE horizontal);
|
|
37
|
+
VALUE worksheet_set_selection_(int argc, VALUE *argv, VALUE self);
|
|
38
|
+
VALUE worksheet_set_landscape_(VALUE self);
|
|
39
|
+
VALUE worksheet_set_portrait_(VALUE self);
|
|
40
|
+
VALUE worksheet_set_page_view_(VALUE self);
|
|
41
|
+
VALUE worksheet_set_paper_(VALUE self, VALUE paper_type);
|
|
42
|
+
VALUE worksheet_set_margins_(VALUE self, VALUE left, VALUE right, VALUE top, VALUE bottom);
|
|
43
|
+
VALUE worksheet_set_header_(VALUE self, VALUE val, VALUE opts);
|
|
44
|
+
VALUE worksheet_set_footer_(VALUE self, VALUE val, VALUE opts);
|
|
45
|
+
VALUE worksheet_set_h_pagebreaks_(VALUE self, VALUE val);
|
|
46
|
+
VALUE worksheet_set_v_pagebreaks_(VALUE self, VALUE val);
|
|
47
|
+
VALUE worksheet_print_across_(VALUE self);
|
|
48
|
+
VALUE worksheet_set_zoom_(VALUE self, VALUE val);
|
|
49
|
+
VALUE worksheet_gridlines_(VALUE self, VALUE value);
|
|
50
|
+
VALUE worksheet_center_horizontally_(VALUE self);
|
|
51
|
+
VALUE worksheet_center_vertically_(VALUE self);
|
|
52
|
+
VALUE worksheet_print_row_col_headers_(VALUE self);
|
|
53
|
+
VALUE worksheet_repeat_rows_(VALUE self, VALUE row_from, VALUE row_to);
|
|
54
|
+
VALUE worksheet_repeat_columns_(VALUE self, VALUE col_from, VALUE col_to);
|
|
55
|
+
VALUE worksheet_print_area_(int argc, VALUE *argv, VALUE self);
|
|
56
|
+
VALUE worksheet_fit_to_pages_(VALUE self, VALUE width, VALUE height);
|
|
57
|
+
VALUE worksheet_set_start_page_(VALUE self, VALUE start_page);
|
|
58
|
+
VALUE worksheet_set_print_scale_(VALUE self, VALUE scale);
|
|
59
|
+
VALUE worksheet_right_to_left_(VALUE self);
|
|
60
|
+
VALUE worksheet_hide_zero_(VALUE self);
|
|
61
|
+
VALUE worksheet_set_tab_color_(VALUE self, VALUE color);
|
|
62
|
+
VALUE worksheet_protect_(int argc, VALUE *argv, VALUE self);
|
|
63
|
+
VALUE worksheet_set_default_row_(VALUE self, VALUE height, VALUE hide_unused_rows);
|
|
64
|
+
|
|
65
|
+
VALUE worksheet_get_vertical_dpi_(VALUE self);
|
|
66
|
+
VALUE worksheet_set_vertical_dpi_(VALUE self, VALUE val);
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
lxw_col_t value_to_col(VALUE value);
|
|
70
|
+
int extract_cell(int argc, VALUE *argv, lxw_row_t *row, lxw_col_t *col);
|
|
71
|
+
int extract_range(int argc, VALUE *argv, lxw_row_t *row1, lxw_col_t *col1,
|
|
72
|
+
lxw_row_t *row2, lxw_col_t *col2);
|
|
73
|
+
|
|
74
|
+
#endif /// __WORKSHEET__
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
#include <ruby.h>
|
|
2
|
+
#include "xlsxwriter.h"
|
|
3
|
+
#include "chart.h"
|
|
4
|
+
#include "workbook.h"
|
|
5
|
+
#include "workbook_properties.h"
|
|
6
|
+
#include "worksheet.h"
|
|
7
|
+
|
|
8
|
+
VALUE mXlsxWriter;
|
|
9
|
+
VALUE cWorkbook;
|
|
10
|
+
VALUE cWorksheet;
|
|
11
|
+
VALUE mXlsxFormat;
|
|
12
|
+
VALUE cWorkbookProperties;
|
|
13
|
+
VALUE cChart;
|
|
14
|
+
VALUE cChartSeries;
|
|
15
|
+
VALUE cChartAxis;
|
|
16
|
+
|
|
17
|
+
void Init_xlsxwriter() {
|
|
18
|
+
mXlsxWriter = rb_define_module("XlsxWriter");
|
|
19
|
+
mXlsxFormat = rb_define_module_under(mXlsxWriter, "Format");
|
|
20
|
+
cWorkbook = rb_define_class_under(mXlsxWriter, "Workbook", rb_cObject);
|
|
21
|
+
cWorksheet = rb_define_class_under(mXlsxWriter, "Worksheet", rb_cObject);
|
|
22
|
+
cWorkbookProperties
|
|
23
|
+
= rb_define_class_under(cWorkbook, "Properties", rb_cObject);
|
|
24
|
+
cChart = rb_define_class_under(cWorkbook, "Chart", rb_cObject);
|
|
25
|
+
cChartSeries = rb_define_class_under(cChart, "Series", rb_cObject);
|
|
26
|
+
cChartAxis = rb_define_class_under(cChart, "Axis", rb_cObject);
|
|
27
|
+
|
|
28
|
+
rb_define_alloc_func(cWorkbook, workbook_alloc);
|
|
29
|
+
rb_define_singleton_method(cWorkbook, "new", workbook_new_, -1);
|
|
30
|
+
rb_define_alias(rb_singleton_class(cWorkbook), "open", "new");
|
|
31
|
+
rb_define_method(cWorkbook, "initialize", workbook_init, -1);
|
|
32
|
+
rb_define_method(cWorkbook, "close", workbook_release, 0);
|
|
33
|
+
rb_define_method(cWorkbook, "add_worksheet", workbook_add_worksheet_, -1);
|
|
34
|
+
rb_define_method(cWorkbook, "add_format", workbook_add_format_, 2);
|
|
35
|
+
rb_define_method(cWorkbook, "add_chart", workbook_add_chart_, 1);
|
|
36
|
+
rb_define_method(cWorkbook, "set_default_xf_indices", workbook_set_default_xf_indices_, 0);
|
|
37
|
+
rb_define_method(cWorkbook, "properties", workbook_properties_, 0);
|
|
38
|
+
rb_define_method(cWorkbook, "define_name", workbook_define_name_, 2);
|
|
39
|
+
rb_define_method(cWorkbook, "validate_worksheet_name", workbook_validate_worksheet_name_, 1);
|
|
40
|
+
|
|
41
|
+
rb_define_attr(cWorkbook, "font_sizes", 1, 0);
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
rb_define_alloc_func(cWorksheet, worksheet_alloc);
|
|
45
|
+
rb_define_method(cWorksheet, "initialize", worksheet_init, -1);
|
|
46
|
+
rb_define_method(cWorksheet, "free", worksheet_release, 0);
|
|
47
|
+
rb_define_method(cWorksheet, "write_string", worksheet_write_string_, -1);
|
|
48
|
+
rb_define_method(cWorksheet, "write_number", worksheet_write_number_, -1);
|
|
49
|
+
rb_define_method(cWorksheet, "write_formula", worksheet_write_formula_, -1);
|
|
50
|
+
rb_define_method(cWorksheet, "write_array_formula", worksheet_write_array_formula_, -1);
|
|
51
|
+
rb_define_method(cWorksheet, "write_datetime", worksheet_write_datetime_, -1);
|
|
52
|
+
rb_define_method(cWorksheet, "write_url", worksheet_write_url_, -1);
|
|
53
|
+
rb_define_method(cWorksheet, "write_boolean", worksheet_write_boolean_, -1);
|
|
54
|
+
rb_define_method(cWorksheet, "write_blank", worksheet_write_blank_, -1);
|
|
55
|
+
rb_define_method(cWorksheet, "write_formula_num", worksheet_write_formula_num_, -1);
|
|
56
|
+
rb_define_method(cWorksheet, "set_row", worksheet_set_row_, 2);
|
|
57
|
+
rb_define_method(cWorksheet, "set_column", worksheet_set_column_, 3);
|
|
58
|
+
rb_define_method(cWorksheet, "insert_image", worksheet_insert_image_, -1);
|
|
59
|
+
rb_define_method(cWorksheet, "insert_chart", worksheet_insert_chart_, -1);
|
|
60
|
+
rb_define_method(cWorksheet, "merge_range", worksheet_merge_range_, -1);
|
|
61
|
+
rb_define_method(cWorksheet, "autofilter", worksheet_autofilter_, -1);
|
|
62
|
+
rb_define_method(cWorksheet, "activate", worksheet_activate_, 0);
|
|
63
|
+
rb_define_method(cWorksheet, "select", worksheet_select_, 0);
|
|
64
|
+
rb_define_method(cWorksheet, "hide", worksheet_hide_, 0);
|
|
65
|
+
rb_define_method(cWorksheet, "set_first_sheet", worksheet_set_first_sheet_, 0);
|
|
66
|
+
rb_define_method(cWorksheet, "freeze_panes", worksheet_freeze_panes_, -1);
|
|
67
|
+
rb_define_method(cWorksheet, "split_panes", worksheet_split_panes_, 2);
|
|
68
|
+
rb_define_method(cWorksheet, "set_selection", worksheet_set_selection_, -1);
|
|
69
|
+
rb_define_method(cWorksheet, "set_landscape", worksheet_set_landscape_, 0);
|
|
70
|
+
rb_define_method(cWorksheet, "set_portrait", worksheet_set_portrait_, 0);
|
|
71
|
+
rb_define_method(cWorksheet, "set_page_view", worksheet_set_page_view_, 0);
|
|
72
|
+
rb_define_method(cWorksheet, "paper=", worksheet_set_paper_, 1);
|
|
73
|
+
rb_define_method(cWorksheet, "set_margins", worksheet_set_margins_, 4);
|
|
74
|
+
rb_define_method(cWorksheet, "set_header", worksheet_set_header_, 1);
|
|
75
|
+
rb_define_method(cWorksheet, "set_footer", worksheet_set_footer_, 1);
|
|
76
|
+
rb_define_method(cWorksheet, "h_pagebreaks=", worksheet_set_h_pagebreaks_, 1);
|
|
77
|
+
rb_define_method(cWorksheet, "v_pagebreaks=", worksheet_set_v_pagebreaks_, 1);
|
|
78
|
+
rb_define_method(cWorksheet, "print_across", worksheet_print_across_, 0);
|
|
79
|
+
rb_define_method(cWorksheet, "zoom=", worksheet_set_zoom_, 1);
|
|
80
|
+
rb_define_method(cWorksheet, "gridlines=", worksheet_gridlines_, 1);
|
|
81
|
+
rb_define_method(cWorksheet, "center_horizontally", worksheet_center_horizontally_, 0);
|
|
82
|
+
rb_define_method(cWorksheet, "center_vertically", worksheet_center_vertically_, 0);
|
|
83
|
+
rb_define_method(cWorksheet, "print_row_col_headers", worksheet_print_row_col_headers_, 0);
|
|
84
|
+
rb_define_method(cWorksheet, "repeat_rows", worksheet_repeat_rows_, 2);
|
|
85
|
+
rb_define_method(cWorksheet, "repeat_columns", worksheet_repeat_columns_, 2);
|
|
86
|
+
rb_define_method(cWorksheet, "print_area", worksheet_print_area_, -1);
|
|
87
|
+
rb_define_method(cWorksheet, "fit_to_pages", worksheet_fit_to_pages_, 2);
|
|
88
|
+
rb_define_method(cWorksheet, "start_page=", worksheet_set_start_page_, 1);
|
|
89
|
+
rb_define_method(cWorksheet, "print_scale=", worksheet_set_print_scale_, 1);
|
|
90
|
+
rb_define_method(cWorksheet, "right_to_left", worksheet_right_to_left_, 0);
|
|
91
|
+
rb_define_method(cWorksheet, "hide_zero", worksheet_hide_zero_, 0);
|
|
92
|
+
rb_define_method(cWorksheet, "tab_color=", worksheet_set_tab_color_, 1);
|
|
93
|
+
rb_define_method(cWorksheet, "protect", worksheet_protect_, -1);
|
|
94
|
+
rb_define_method(cWorksheet, "set_default_row", worksheet_set_default_row_, 2);
|
|
95
|
+
|
|
96
|
+
rb_define_method(cWorksheet, "vertical_dpi", worksheet_get_vertical_dpi_, 0);
|
|
97
|
+
rb_define_method(cWorksheet, "vertical_dpi=", worksheet_set_vertical_dpi_, 1);
|
|
98
|
+
|
|
99
|
+
rb_define_method(cWorkbookProperties, "initialize", workbook_properties_init_, 1);
|
|
100
|
+
rb_define_method(cWorkbookProperties, "[]=", workbook_properties_set_, 2);
|
|
101
|
+
#define DEF_PROP_HANDLER(prop) rb_define_method(cWorkbookProperties, #prop "=", workbook_properties_set_dir_, 1);
|
|
102
|
+
DEF_PROP_HANDLER(title);
|
|
103
|
+
DEF_PROP_HANDLER(subject);
|
|
104
|
+
DEF_PROP_HANDLER(author);
|
|
105
|
+
DEF_PROP_HANDLER(manager);
|
|
106
|
+
DEF_PROP_HANDLER(company);
|
|
107
|
+
DEF_PROP_HANDLER(category);
|
|
108
|
+
DEF_PROP_HANDLER(keywords);
|
|
109
|
+
DEF_PROP_HANDLER(comments);
|
|
110
|
+
DEF_PROP_HANDLER(status);
|
|
111
|
+
DEF_PROP_HANDLER(hyperlink_base);
|
|
112
|
+
#undef DEF_PROP_HANDLER
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
rb_define_alloc_func(cChart, chart_alloc);
|
|
116
|
+
rb_define_method(cChart, "initialize", chart_init, 2);
|
|
117
|
+
rb_define_method(cChart, "add_series", chart_add_series_, -1);
|
|
118
|
+
|
|
119
|
+
rb_define_method(cChart, "axis_id_1", chart_get_axis_id_1_, 0);
|
|
120
|
+
rb_define_method(cChart, "axis_id_1=", chart_set_axis_id_1_, 1);
|
|
121
|
+
rb_define_method(cChart, "axis_id_2", chart_get_axis_id_2_, 0);
|
|
122
|
+
rb_define_method(cChart, "axis_id_2=", chart_set_axis_id_2_, 1);
|
|
123
|
+
|
|
124
|
+
rb_define_alloc_func(cChartSeries, chart_series_alloc);
|
|
125
|
+
rb_define_method(cChartSeries, "initialize", chart_series_init, -1);
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
#define MAP_LXW_FMT_CONST(name) rb_define_const(mXlsxFormat, #name, INT2NUM(LXW_##name))
|
|
129
|
+
MAP_LXW_FMT_CONST(COLOR_BLACK);
|
|
130
|
+
MAP_LXW_FMT_CONST(COLOR_BLUE);
|
|
131
|
+
MAP_LXW_FMT_CONST(COLOR_BROWN);
|
|
132
|
+
MAP_LXW_FMT_CONST(COLOR_CYAN);
|
|
133
|
+
MAP_LXW_FMT_CONST(COLOR_GRAY);
|
|
134
|
+
MAP_LXW_FMT_CONST(COLOR_GREEN);
|
|
135
|
+
MAP_LXW_FMT_CONST(COLOR_LIME);
|
|
136
|
+
MAP_LXW_FMT_CONST(COLOR_MAGENTA);
|
|
137
|
+
MAP_LXW_FMT_CONST(COLOR_NAVY);
|
|
138
|
+
MAP_LXW_FMT_CONST(COLOR_ORANGE);
|
|
139
|
+
MAP_LXW_FMT_CONST(COLOR_PINK);
|
|
140
|
+
MAP_LXW_FMT_CONST(COLOR_PURPLE);
|
|
141
|
+
MAP_LXW_FMT_CONST(COLOR_RED);
|
|
142
|
+
MAP_LXW_FMT_CONST(COLOR_SILVER);
|
|
143
|
+
MAP_LXW_FMT_CONST(COLOR_WHITE);
|
|
144
|
+
MAP_LXW_FMT_CONST(COLOR_YELLOW);
|
|
145
|
+
|
|
146
|
+
MAP_LXW_FMT_CONST(UNDERLINE_SINGLE);
|
|
147
|
+
MAP_LXW_FMT_CONST(UNDERLINE_DOUBLE);
|
|
148
|
+
MAP_LXW_FMT_CONST(UNDERLINE_SINGLE_ACCOUNTING);
|
|
149
|
+
MAP_LXW_FMT_CONST(UNDERLINE_DOUBLE_ACCOUNTING);
|
|
150
|
+
|
|
151
|
+
MAP_LXW_FMT_CONST(FONT_SUPERSCRIPT);
|
|
152
|
+
MAP_LXW_FMT_CONST(FONT_SUBSCRIPT);
|
|
153
|
+
|
|
154
|
+
MAP_LXW_FMT_CONST(ALIGN_LEFT);
|
|
155
|
+
MAP_LXW_FMT_CONST(ALIGN_CENTER);
|
|
156
|
+
MAP_LXW_FMT_CONST(ALIGN_RIGHT);
|
|
157
|
+
MAP_LXW_FMT_CONST(ALIGN_FILL);
|
|
158
|
+
MAP_LXW_FMT_CONST(ALIGN_JUSTIFY);
|
|
159
|
+
MAP_LXW_FMT_CONST(ALIGN_CENTER_ACROSS);
|
|
160
|
+
MAP_LXW_FMT_CONST(ALIGN_DISTRIBUTED);
|
|
161
|
+
|
|
162
|
+
MAP_LXW_FMT_CONST(ALIGN_VERTICAL_TOP);
|
|
163
|
+
MAP_LXW_FMT_CONST(ALIGN_VERTICAL_BOTTOM);
|
|
164
|
+
MAP_LXW_FMT_CONST(ALIGN_VERTICAL_CENTER);
|
|
165
|
+
MAP_LXW_FMT_CONST(ALIGN_VERTICAL_JUSTIFY);
|
|
166
|
+
MAP_LXW_FMT_CONST(ALIGN_VERTICAL_DISTRIBUTED);
|
|
167
|
+
|
|
168
|
+
MAP_LXW_FMT_CONST(PATTERN_SOLID);
|
|
169
|
+
MAP_LXW_FMT_CONST(PATTERN_MEDIUM_GRAY);
|
|
170
|
+
MAP_LXW_FMT_CONST(PATTERN_DARK_GRAY);
|
|
171
|
+
MAP_LXW_FMT_CONST(PATTERN_LIGHT_GRAY);
|
|
172
|
+
MAP_LXW_FMT_CONST(PATTERN_DARK_HORIZONTAL);
|
|
173
|
+
MAP_LXW_FMT_CONST(PATTERN_DARK_VERTICAL);
|
|
174
|
+
MAP_LXW_FMT_CONST(PATTERN_DARK_DOWN);
|
|
175
|
+
MAP_LXW_FMT_CONST(PATTERN_DARK_UP);
|
|
176
|
+
MAP_LXW_FMT_CONST(PATTERN_DARK_GRID);
|
|
177
|
+
MAP_LXW_FMT_CONST(PATTERN_DARK_TRELLIS);
|
|
178
|
+
MAP_LXW_FMT_CONST(PATTERN_LIGHT_HORIZONTAL);
|
|
179
|
+
MAP_LXW_FMT_CONST(PATTERN_LIGHT_VERTICAL);
|
|
180
|
+
MAP_LXW_FMT_CONST(PATTERN_LIGHT_DOWN);
|
|
181
|
+
MAP_LXW_FMT_CONST(PATTERN_LIGHT_UP);
|
|
182
|
+
MAP_LXW_FMT_CONST(PATTERN_LIGHT_GRID);
|
|
183
|
+
MAP_LXW_FMT_CONST(PATTERN_LIGHT_TRELLIS);
|
|
184
|
+
MAP_LXW_FMT_CONST(PATTERN_GRAY_125);
|
|
185
|
+
MAP_LXW_FMT_CONST(PATTERN_GRAY_0625);
|
|
186
|
+
|
|
187
|
+
MAP_LXW_FMT_CONST(BORDER_THIN);
|
|
188
|
+
MAP_LXW_FMT_CONST(BORDER_MEDIUM);
|
|
189
|
+
MAP_LXW_FMT_CONST(BORDER_DASHED);
|
|
190
|
+
MAP_LXW_FMT_CONST(BORDER_DOTTED);
|
|
191
|
+
MAP_LXW_FMT_CONST(BORDER_THICK);
|
|
192
|
+
MAP_LXW_FMT_CONST(BORDER_DOUBLE);
|
|
193
|
+
MAP_LXW_FMT_CONST(BORDER_HAIR);
|
|
194
|
+
MAP_LXW_FMT_CONST(BORDER_MEDIUM_DASHED);
|
|
195
|
+
MAP_LXW_FMT_CONST(BORDER_DASH_DOT);
|
|
196
|
+
MAP_LXW_FMT_CONST(BORDER_MEDIUM_DASH_DOT);
|
|
197
|
+
MAP_LXW_FMT_CONST(BORDER_DASH_DOT_DOT);
|
|
198
|
+
MAP_LXW_FMT_CONST(BORDER_MEDIUM_DASH_DOT_DOT);
|
|
199
|
+
MAP_LXW_FMT_CONST(BORDER_SLANT_DASH_DOT);
|
|
200
|
+
|
|
201
|
+
MAP_LXW_FMT_CONST(DIAGONAL_BORDER_UP);
|
|
202
|
+
MAP_LXW_FMT_CONST(DIAGONAL_BORDER_DOWN);
|
|
203
|
+
MAP_LXW_FMT_CONST(DIAGONAL_BORDER_UP_DOWN);
|
|
204
|
+
#undef MAP_LXW_FMT_CONST
|
|
205
|
+
|
|
206
|
+
#define MAP_LXW_WH_CONST(name, val_name) rb_define_const(cWorksheet, #name, INT2NUM(LXW_##val_name))
|
|
207
|
+
MAP_LXW_WH_CONST(DEF_COL_WIDTH, DEF_COL_WIDTH);
|
|
208
|
+
MAP_LXW_WH_CONST(DEF_ROW_HEIGHT, DEF_ROW_HEIGHT);
|
|
209
|
+
|
|
210
|
+
MAP_LXW_WH_CONST(GRIDLINES_HIDE_ALL, HIDE_ALL_GRIDLINES);
|
|
211
|
+
MAP_LXW_WH_CONST(GRIDLINES_SHOW_SCREEN, SHOW_SCREEN_GRIDLINES);
|
|
212
|
+
MAP_LXW_WH_CONST(GRIDLINES_SHOW_PRINT, SHOW_PRINT_GRIDLINES);
|
|
213
|
+
MAP_LXW_WH_CONST(GRIDLINES_SHOW_ALL, SHOW_ALL_GRIDLINES);
|
|
214
|
+
#undef MAP_LXW_WH_CONST
|
|
215
|
+
|
|
216
|
+
#define MAP_CHART_CONST(name) rb_define_const(cChart, #name, INT2NUM(LXW_CHART_##name))
|
|
217
|
+
MAP_CHART_CONST(NONE);
|
|
218
|
+
MAP_CHART_CONST(AREA);
|
|
219
|
+
MAP_CHART_CONST(AREA_STACKED);
|
|
220
|
+
MAP_CHART_CONST(AREA_STACKED_PERCENT);
|
|
221
|
+
MAP_CHART_CONST(BAR);
|
|
222
|
+
MAP_CHART_CONST(BAR_STACKED);
|
|
223
|
+
MAP_CHART_CONST(BAR_STACKED_PERCENT);
|
|
224
|
+
MAP_CHART_CONST(COLUMN);
|
|
225
|
+
MAP_CHART_CONST(COLUMN_STACKED);
|
|
226
|
+
MAP_CHART_CONST(COLUMN_STACKED_PERCENT);
|
|
227
|
+
MAP_CHART_CONST(DOUGHNUT);
|
|
228
|
+
MAP_CHART_CONST(LINE);
|
|
229
|
+
MAP_CHART_CONST(PIE);
|
|
230
|
+
MAP_CHART_CONST(SCATTER);
|
|
231
|
+
MAP_CHART_CONST(SCATTER_STRAIGHT);
|
|
232
|
+
MAP_CHART_CONST(SCATTER_STRAIGHT_WITH_MARKERS);
|
|
233
|
+
MAP_CHART_CONST(SCATTER_SMOOTH);
|
|
234
|
+
MAP_CHART_CONST(SCATTER_SMOOTH_WITH_MARKERS);
|
|
235
|
+
MAP_CHART_CONST(RADAR);
|
|
236
|
+
MAP_CHART_CONST(RADAR_WITH_MARKERS);
|
|
237
|
+
MAP_CHART_CONST(RADAR_FILLED);
|
|
238
|
+
#undef MAP_CHART_CONST
|
|
239
|
+
}
|
data/lib/xlsxwriter.rb
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
class XlsxWriter::Worksheet
|
|
2
|
+
attr_reader :current_row
|
|
3
|
+
|
|
4
|
+
THIN_CHARS = '^.acfijklrstxzFIJL()-'.freeze
|
|
5
|
+
|
|
6
|
+
def add_row(row, style: nil, height: nil, types: nil)
|
|
7
|
+
row_idx = @current_row ||= 0
|
|
8
|
+
@current_row += 1
|
|
9
|
+
|
|
10
|
+
row.each_with_index do |value, idx|
|
|
11
|
+
cell_style = style.is_a?(Array) ? style[idx] : style
|
|
12
|
+
cell_type = types.is_a?(Array) ? types[idx] : types
|
|
13
|
+
|
|
14
|
+
case cell_type && cell_type.to_sym
|
|
15
|
+
when :string
|
|
16
|
+
write_string(row_idx, idx, value.to_s, cell_style)
|
|
17
|
+
update_col_auto_width(idx, value.to_s, cell_style)
|
|
18
|
+
when :number
|
|
19
|
+
write_number(row_idx, idx, value.to_f, cell_style)
|
|
20
|
+
when :formula
|
|
21
|
+
write_formula(row_idx, idx, value, cell_style)
|
|
22
|
+
when :datetime, :date, :time
|
|
23
|
+
write_datetime(row_idx, idx, value.to_time, cell_style)
|
|
24
|
+
when :url
|
|
25
|
+
write_url(row_idx, idx, value, cell_style)
|
|
26
|
+
update_col_auto_width(idx, value.to_s, cell_style)
|
|
27
|
+
when :boolean
|
|
28
|
+
write_boolean(row_idx, idx, value, cell_style)
|
|
29
|
+
when :blank
|
|
30
|
+
write_blank(row_idx, idx, cell_style)
|
|
31
|
+
when nil
|
|
32
|
+
case value
|
|
33
|
+
when Numeric
|
|
34
|
+
write_number(row_idx, idx, value, cell_style)
|
|
35
|
+
when TrueClass, FalseClass
|
|
36
|
+
write_boolean(row_idx, idx, value, cell_style)
|
|
37
|
+
when '', nil
|
|
38
|
+
write_blank(row_idx, idx, cell_style)
|
|
39
|
+
when /\A=/
|
|
40
|
+
write_formula(row_idx, idx, value, cell_style)
|
|
41
|
+
else
|
|
42
|
+
if value.is_a?(Time) ||
|
|
43
|
+
(defined?(Date) && value.is_a?(Date)) ||
|
|
44
|
+
(defined?(DateTime) && value.is_a?(DateTime))
|
|
45
|
+
write_datetime(row_idx, idx, value.to_time, cell_style)
|
|
46
|
+
else # assume string
|
|
47
|
+
write_string(row_idx, idx, value.to_s, cell_style)
|
|
48
|
+
update_col_auto_width(idx, value.to_s, cell_style)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
else
|
|
52
|
+
raise ArgumentError, "Unknown cell type #{cell_type}."
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
set_row(row_idx, height: height) if height
|
|
56
|
+
|
|
57
|
+
nil
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def update_col_auto_width(idx, val, format)
|
|
62
|
+
font_scale = (@workbook.font_sizes[format] || 11) / 10.0
|
|
63
|
+
width = (val.count(THIN_CHARS) + 3) * font_scale
|
|
64
|
+
@col_auto_widths[idx] = [@col_auto_widths[idx], width].compact.max
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def apply_auto_widths
|
|
68
|
+
@col_auto_widths.each_with_index do |width, idx|
|
|
69
|
+
set_column(idx, idx, width: width) if width
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
data/test/run-test.rb
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
base_dir = File.expand_path(File.join(File.dirname(__FILE__), ".."))
|
|
4
|
+
lib_dir = File.join(base_dir, "lib")
|
|
5
|
+
test_dir = File.join(base_dir, "test")
|
|
6
|
+
|
|
7
|
+
$LOAD_PATH.unshift(lib_dir)
|
|
8
|
+
|
|
9
|
+
require 'test/unit'
|
|
10
|
+
|
|
11
|
+
exit Test::Unit::AutoRunner.run(true, test_dir)
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'zip'
|
|
3
|
+
|
|
4
|
+
module XlsxComparable
|
|
5
|
+
def assert_xlsx_equal(got_path, exp_path, ignore_files=[], ignore_elements={})
|
|
6
|
+
Zip::File.open(exp_path) do |exp_zip|
|
|
7
|
+
Zip::File.open(got_path) do |got_zip|
|
|
8
|
+
exp_files = exp_zip.glob('**/*').select { |e| !ignore_files.include?(e.name) }
|
|
9
|
+
got_files = got_zip.glob('**/*').select { |e| !ignore_files.include?(e.name) }
|
|
10
|
+
assert_equal(got_files.map(&:name).sort, exp_files.map(&:name).sort)
|
|
11
|
+
|
|
12
|
+
exp_files.each do |exp_entry|
|
|
13
|
+
next unless exp_entry.file?
|
|
14
|
+
exp_xml_str = exp_zip.read(exp_entry.name)
|
|
15
|
+
got_xml_str = got_zip.read(exp_entry.name)
|
|
16
|
+
|
|
17
|
+
if %w(.png .jpeg .bmp .bin).include?(File.extname(exp_entry.name))
|
|
18
|
+
exp_xml_str.force_encoding('BINARY')
|
|
19
|
+
assert_equal(got_xml_str, exp_xml_str)
|
|
20
|
+
next
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
case exp_entry.name
|
|
24
|
+
when 'docProps/core.xml'
|
|
25
|
+
exp_xml_str.gsub!(/ ?John/, '')
|
|
26
|
+
exp_xml_str.gsub!(/\d{4}-\d\d-\d\dT\d\d\:\d\d:\d\dZ/, '')
|
|
27
|
+
got_xml_str.gsub!(/\d{4}-\d\d-\d\dT\d\d\:\d\d:\d\dZ/, '')
|
|
28
|
+
when 'xl/workbook.xml'
|
|
29
|
+
exp_xml_str.gsub!(/<workbookView[^>]*>/, '<workbookView/>')
|
|
30
|
+
exp_xml_str.gsub!(/<calcPr[^>]*>/, '<calcPr/>')
|
|
31
|
+
got_xml_str.gsub!(/<workbookView[^>]*>/, '<workbookView/>')
|
|
32
|
+
got_xml_str.gsub!(/<calcPr[^>]*>/, '<calcPr/>')
|
|
33
|
+
when /xl\/worksheets\/sheet\d+.xml/
|
|
34
|
+
exp_xml_str.gsub!(/horizontalDpi="200" /, '')
|
|
35
|
+
exp_xml_str.gsub!(/verticalDpi="200" /, '')
|
|
36
|
+
exp_xml_str.gsub!(/(<pageSetup[^>]*) r:id="rId1"/, '\1')
|
|
37
|
+
when /xl\/charts\/chart\d+.xml/
|
|
38
|
+
exp_xml_str.gsub!(/<c:pageMargins[^>]*>/, '<c:pageMargins/>')
|
|
39
|
+
got_xml_str.gsub!(/<c:pageMargins[^>]*>/, '<c:pageMargins/>')
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
if exp_entry.name =~ /.vml\z/
|
|
43
|
+
got_xml = _xml_to_list(got_xml_str)
|
|
44
|
+
exp_xml = _vml_to_list(exp_xml_str)
|
|
45
|
+
else
|
|
46
|
+
got_xml = _xml_to_list(got_xml_str)
|
|
47
|
+
exp_xml = _xml_to_list(exp_xml_str)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
if ignore_elements.key?(exp_entry.name)
|
|
51
|
+
patterns = ignore_elements[exp_entry.name]
|
|
52
|
+
exp_xml.select! { |tag| patterns.none? { |pattern| tag.include? pattern } }
|
|
53
|
+
got_xml.select! { |tag| patterns.none? { |pattern| tag.include? pattern } }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
if exp_entry.name == '[Content_Types].xml' || exp_entry.name =~ /.rels\z/
|
|
57
|
+
got_xml = _sort_rel_file_data(got_xml)
|
|
58
|
+
exp_xml = _sort_rel_file_data(exp_xml)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
assert_equal got_xml, exp_xml
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
def _xml_to_list(xml_str)
|
|
70
|
+
elements = xml_str.strip.split(/>\s*</).each do |el|
|
|
71
|
+
el.gsub!("\r", '')
|
|
72
|
+
el.insert 0, '<' unless el[0] == '<'
|
|
73
|
+
el << '>' unless el[-1] == '>'
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def _vml_to_list(vml_str)
|
|
78
|
+
vml_str.gsub!("\r", '')
|
|
79
|
+
|
|
80
|
+
vml = vml_str.split("\n")
|
|
81
|
+
vml_str = ''.tap do |vml_str|
|
|
82
|
+
vml.each do |line|
|
|
83
|
+
line.strip!
|
|
84
|
+
next if line == ''
|
|
85
|
+
line.gsub!(?', ?")
|
|
86
|
+
line << ' ' if line =~ '"$'
|
|
87
|
+
line << "\n" if line =~ '>$'
|
|
88
|
+
line.gsub!('><', ">\n<")
|
|
89
|
+
if line == "<x:Anchor>\n"
|
|
90
|
+
line.strip!
|
|
91
|
+
end
|
|
92
|
+
wml_str << line
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
vml_str.rstrip.split("\n")
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def _sort_rel_file_data(xml_elements)
|
|
99
|
+
first = xml_elements.shift
|
|
100
|
+
last = xml_elements.pop
|
|
101
|
+
|
|
102
|
+
xml_elements.sort!
|
|
103
|
+
|
|
104
|
+
xml_elements.unshift(first)
|
|
105
|
+
xml_elements.push(last)
|
|
106
|
+
|
|
107
|
+
xml_elements
|
|
108
|
+
end
|
|
109
|
+
end
|