write_xlsx 1.09.5 → 1.10.0
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 +4 -4
- data/.rubocop.yml +1 -0
- data/Changes +5 -0
- data/LICENSE.txt +1 -1
- data/examples/autofilter.rb +38 -9
- data/examples/dynamic_arrays.rb +247 -0
- data/examples/lambda.rb +43 -0
- data/examples/watermark.png +0 -0
- data/examples/watermark.rb +26 -0
- data/lib/write_xlsx/chart.rb +1 -0
- data/lib/write_xlsx/chartsheet.rb +1 -0
- data/lib/write_xlsx/col_name.rb +1 -0
- data/lib/write_xlsx/colors.rb +1 -0
- data/lib/write_xlsx/compatibility.rb +1 -0
- data/lib/write_xlsx/drawing.rb +20 -10
- data/lib/write_xlsx/format.rb +5 -0
- data/lib/write_xlsx/formats.rb +1 -0
- data/lib/write_xlsx/gradient.rb +2 -0
- data/lib/write_xlsx/package/app.rb +1 -0
- data/lib/write_xlsx/package/button.rb +6 -2
- data/lib/write_xlsx/package/comments.rb +3 -1
- data/lib/write_xlsx/package/conditional_format.rb +1 -0
- data/lib/write_xlsx/package/content_types.rb +1 -0
- data/lib/write_xlsx/package/core.rb +1 -0
- data/lib/write_xlsx/package/custom.rb +1 -0
- data/lib/write_xlsx/package/metadata.rb +1 -0
- data/lib/write_xlsx/package/packager.rb +1 -0
- data/lib/write_xlsx/package/relationships.rb +1 -0
- data/lib/write_xlsx/package/shared_strings.rb +1 -1
- data/lib/write_xlsx/package/styles.rb +1 -0
- data/lib/write_xlsx/package/table.rb +1 -0
- data/lib/write_xlsx/package/theme.rb +1 -0
- data/lib/write_xlsx/package/vml.rb +1 -0
- data/lib/write_xlsx/package/xml_writer_simple.rb +21 -2
- data/lib/write_xlsx/shape.rb +1 -0
- data/lib/write_xlsx/sheets.rb +1 -0
- data/lib/write_xlsx/sparkline.rb +1 -0
- data/lib/write_xlsx/utility.rb +2 -3
- data/lib/write_xlsx/version.rb +3 -1
- data/lib/write_xlsx/worksheet/cell_data.rb +52 -62
- data/lib/write_xlsx/worksheet/data_validation.rb +1 -0
- data/lib/write_xlsx/worksheet/hyperlink.rb +3 -2
- data/lib/write_xlsx/worksheet/page_setup.rb +1 -0
- data/lib/write_xlsx/worksheet.rb +260 -47
- data/lib/write_xlsx/zip_file_utils.rb +1 -0
- data/lib/write_xlsx.rb +1 -0
- data/write_xlsx.gemspec +1 -0
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6a6aa71ba6c2a27f86f844a1313cd1983f0b5e54e94fb944b3e2fbf31b089437
|
4
|
+
data.tar.gz: 901aadf4eb4bd06ad95377b5d9de33ccc13850299e223453c0e544addcb26a1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94101fe3a84563a842fe9989ca162d29aee8dbb1944feb8bd8dbd3c5ee459b3956fb46ccb251ee28e099efd852f9142d3040b5f896b67440e4a5c7b54895d4a9
|
7
|
+
data.tar.gz: 8cbd76084fd2276cf02eaff6dc58de57b60b8de991677020aa7634b637f2ec7a0f28b4fb9379483e025572cb5f0cc0070682cfc2eb353b97df118f700e843ae9
|
data/.rubocop.yml
CHANGED
data/Changes
CHANGED
data/LICENSE.txt
CHANGED
data/examples/autofilter.rb
CHANGED
@@ -22,6 +22,7 @@ worksheet3 = workbook.add_worksheet
|
|
22
22
|
worksheet4 = workbook.add_worksheet
|
23
23
|
worksheet5 = workbook.add_worksheet
|
24
24
|
worksheet6 = workbook.add_worksheet
|
25
|
+
worksheet7 = workbook.add_worksheet
|
25
26
|
|
26
27
|
bold = workbook.add_format(:bold => 1)
|
27
28
|
|
@@ -127,14 +128,12 @@ end
|
|
127
128
|
###############################################################################
|
128
129
|
#
|
129
130
|
#
|
130
|
-
# Example 5. Autofilter with filter
|
131
|
+
# Example 5. Autofilter with filter list condition in one of the columns.
|
131
132
|
#
|
132
133
|
|
133
|
-
# Create a blank cell in our test data.
|
134
|
-
data[5][0] = ''
|
135
|
-
|
136
134
|
worksheet5.autofilter('A1:D51')
|
137
|
-
|
135
|
+
|
136
|
+
worksheet5.filter_column_list('A', %w[East North South])
|
138
137
|
|
139
138
|
#
|
140
139
|
# Hide the rows that don't match the filter criteria.
|
@@ -144,7 +143,7 @@ row = 1
|
|
144
143
|
data.each do |row_data|
|
145
144
|
region = row_data[0]
|
146
145
|
|
147
|
-
worksheet5.set_row(row, nil, nil, 1) unless
|
146
|
+
worksheet5.set_row(row, nil, nil, 1) unless %w[East North South].include?(region)
|
148
147
|
|
149
148
|
worksheet5.write(row, 0, row_data)
|
150
149
|
row += 1
|
@@ -153,11 +152,14 @@ end
|
|
153
152
|
###############################################################################
|
154
153
|
#
|
155
154
|
#
|
156
|
-
# Example 6. Autofilter with filter for
|
155
|
+
# Example 6. Autofilter with filter for blanks.
|
157
156
|
#
|
158
157
|
|
158
|
+
# Create a blank cell in our test data.
|
159
|
+
data[5][0] = ''
|
160
|
+
|
159
161
|
worksheet6.autofilter('A1:D51')
|
160
|
-
worksheet6.filter_column('A', 'x
|
162
|
+
worksheet6.filter_column('A', 'x == Blanks')
|
161
163
|
|
162
164
|
#
|
163
165
|
# Hide the rows that don't match the filter criteria.
|
@@ -167,7 +169,7 @@ row = 1
|
|
167
169
|
data.each do |row_data|
|
168
170
|
region = row_data[0]
|
169
171
|
|
170
|
-
worksheet6.set_row(row, nil, nil, 1) unless region
|
172
|
+
worksheet6.set_row(row, nil, nil, 1) unless region == ''
|
171
173
|
|
172
174
|
worksheet6.write(row, 0, row_data)
|
173
175
|
row += 1
|
@@ -175,6 +177,33 @@ end
|
|
175
177
|
|
176
178
|
workbook.close
|
177
179
|
|
180
|
+
###############################################################################
|
181
|
+
#
|
182
|
+
#
|
183
|
+
# Example 7. Autofilter with filter for non-blanks.
|
184
|
+
#
|
185
|
+
|
186
|
+
worksheet7.autofilter('A1:D51')
|
187
|
+
worksheet7.filter_column('A', 'x == NonBlanks')
|
188
|
+
|
189
|
+
#
|
190
|
+
# Hide the rows that don't match the filter criteria.
|
191
|
+
#
|
192
|
+
row = 1
|
193
|
+
|
194
|
+
data.each do |row_data|
|
195
|
+
region = row_data[0]
|
196
|
+
|
197
|
+
worksheet7.set_row(row, nil, nil, 1) unless region != ''
|
198
|
+
|
199
|
+
worksheet7.write(row, 0, row_data)
|
200
|
+
row += 1
|
201
|
+
end
|
202
|
+
|
203
|
+
workbook.close
|
204
|
+
|
205
|
+
|
206
|
+
|
178
207
|
__END__
|
179
208
|
Region Item Volume Month
|
180
209
|
East Apple 9000 July
|
@@ -0,0 +1,247 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
#######################################################################
|
5
|
+
#
|
6
|
+
# An example of how to use the write_xlsx rubygem to write functions
|
7
|
+
# that create dynamic arrays. These functions are new to Excel 365. The
|
8
|
+
# examples mirror the examples in the Excel documentation on these functions.
|
9
|
+
#
|
10
|
+
# Copyright 2000-2021, John McNamara, jmcnamara@cpan.org
|
11
|
+
# convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
|
12
|
+
#
|
13
|
+
|
14
|
+
require 'write_xlsx'
|
15
|
+
|
16
|
+
# Used from test_dynamic_arrays
|
17
|
+
# Utility function to write the data some of the functions work on.
|
18
|
+
def write_worksheet_data(worksheet, header)
|
19
|
+
worksheet.write('A1', 'Region', header)
|
20
|
+
worksheet.write('B1', 'Sales Rep', header)
|
21
|
+
worksheet.write('C1', 'Product', header)
|
22
|
+
worksheet.write('D1', 'Units', header)
|
23
|
+
|
24
|
+
data = [
|
25
|
+
['East', 'Tom', 'Apple', 6380],
|
26
|
+
['West', 'Fred', 'Grape', 5619],
|
27
|
+
['North', 'Amy', 'Pear', 4565],
|
28
|
+
['South', 'Sal', 'Banana', 5323],
|
29
|
+
['East', 'Fritz', 'Apple', 4394],
|
30
|
+
['West', 'Sravan', 'Grape', 7195],
|
31
|
+
['North', 'Xi', 'Pear', 5231],
|
32
|
+
['South', 'Hector', 'Banana', 2427],
|
33
|
+
['East', 'Tom', 'Banana', 4213],
|
34
|
+
['West', 'Fred', 'Pear', 3239],
|
35
|
+
['North', 'Amy', 'Grape', 6520],
|
36
|
+
['South', 'Sal', 'Apple', 1310],
|
37
|
+
['East', 'Fritz', 'Banana', 6274],
|
38
|
+
['West', 'Sravan', 'Pear', 4894],
|
39
|
+
['North', 'Xi', 'Grape', 7580],
|
40
|
+
['South', 'Hector', 'Apple', 9814]
|
41
|
+
]
|
42
|
+
|
43
|
+
row_num = 1
|
44
|
+
data.each do |row_data|
|
45
|
+
worksheet.write_row(row_num, 0, row_data)
|
46
|
+
row_num += 1
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Create a new workbook called simple.xls and add a worksheet
|
51
|
+
workbook = WriteXLSX.new('dynamic_arrays.xlsx')
|
52
|
+
worksheet1 = workbook.add_worksheet('Filter')
|
53
|
+
worksheet2 = workbook.add_worksheet('Unique')
|
54
|
+
worksheet3 = workbook.add_worksheet('Sort')
|
55
|
+
worksheet4 = workbook.add_worksheet('Sortby')
|
56
|
+
worksheet5 = workbook.add_worksheet('Xlookup')
|
57
|
+
worksheet6 = workbook.add_worksheet('Xmatch')
|
58
|
+
worksheet7 = workbook.add_worksheet('Randarray')
|
59
|
+
worksheet8 = workbook.add_worksheet('Sequence')
|
60
|
+
worksheet9 = workbook.add_worksheet('Spill ranges')
|
61
|
+
worksheet10 = workbook.add_worksheet('Older functions')
|
62
|
+
header1 = workbook.add_format(:fg_color => '#74AC4C', :color => '#FFFFFF')
|
63
|
+
header2 = workbook.add_format(:fg_color => '#528FD3', :color => '#FFFFFF')
|
64
|
+
|
65
|
+
#
|
66
|
+
# Example of using the FILTER() function.
|
67
|
+
#
|
68
|
+
worksheet1.write('F2', '=FILTER(A1:D17,C1:C17=K2)')
|
69
|
+
|
70
|
+
# Write the data the function will work on.
|
71
|
+
worksheet1.write('K1', 'Product', header2)
|
72
|
+
worksheet1.write('K2', 'Apple')
|
73
|
+
worksheet1.write('F1', 'Region', header2)
|
74
|
+
worksheet1.write('G1', 'Sales Rep', header2)
|
75
|
+
worksheet1.write('H1', 'Product', header2)
|
76
|
+
worksheet1.write('I1', 'Units', header2)
|
77
|
+
|
78
|
+
write_worksheet_data(worksheet1, header1)
|
79
|
+
worksheet1.set_column_pixels('E:E', 20)
|
80
|
+
worksheet1.set_column_pixels('J:J', 20)
|
81
|
+
|
82
|
+
#
|
83
|
+
# Example of using the UNIQUE() function.
|
84
|
+
#
|
85
|
+
worksheet2.write('F2', '=UNIQUE(B2:B17)')
|
86
|
+
|
87
|
+
# A more complex example combining SORT and UNIQUE.
|
88
|
+
worksheet2.write('H2', '=SORT(UNIQUE(B2:B17))')
|
89
|
+
|
90
|
+
# Write the data the function will work on.
|
91
|
+
worksheet2.write('F1', 'Sales Rep', header2)
|
92
|
+
worksheet2.write('H1', 'Sales Rep', header2)
|
93
|
+
|
94
|
+
write_worksheet_data(worksheet2, header1)
|
95
|
+
worksheet2.set_column_pixels('E:E', 20)
|
96
|
+
worksheet2.set_column_pixels('G:G', 20)
|
97
|
+
|
98
|
+
#
|
99
|
+
# Example of using the SORT() function.
|
100
|
+
#
|
101
|
+
worksheet3.write('F2', '=SORT(B2:B17)')
|
102
|
+
|
103
|
+
# A more complex example combining SORT and FILTER.
|
104
|
+
worksheet3.write('H2', '=SORT(FILTER(C2:D17,D2:D17>5000,""),2,1)')
|
105
|
+
|
106
|
+
# Write the data the function will work on.
|
107
|
+
worksheet3.write('F1', 'Sales Rep', header2)
|
108
|
+
worksheet3.write('H1', 'Product', header2)
|
109
|
+
worksheet3.write('I1', 'Units', header2)
|
110
|
+
|
111
|
+
write_worksheet_data(worksheet3, header1)
|
112
|
+
worksheet3.set_column_pixels('E:E', 20)
|
113
|
+
worksheet3.set_column_pixels('G:G', 20)
|
114
|
+
|
115
|
+
#
|
116
|
+
# Example of using the SORTBY() function.
|
117
|
+
#
|
118
|
+
worksheet4.write('D2', '=SORTBY(A2:B9,B2:B9)')
|
119
|
+
|
120
|
+
# Write the data the function will work on.
|
121
|
+
worksheet4.write('A1', 'Name', header1)
|
122
|
+
worksheet4.write('B1', 'Age', header1)
|
123
|
+
|
124
|
+
worksheet4.write('A2', 'Tom')
|
125
|
+
worksheet4.write('A3', 'Fred')
|
126
|
+
worksheet4.write('A4', 'Amy')
|
127
|
+
worksheet4.write('A5', 'Sal')
|
128
|
+
worksheet4.write('A6', 'Fritz')
|
129
|
+
worksheet4.write('A7', 'Srivan')
|
130
|
+
worksheet4.write('A8', 'Xi')
|
131
|
+
worksheet4.write('A9', 'Hector')
|
132
|
+
|
133
|
+
worksheet4.write('B2', 52)
|
134
|
+
worksheet4.write('B3', 65)
|
135
|
+
worksheet4.write('B4', 22)
|
136
|
+
worksheet4.write('B5', 73)
|
137
|
+
worksheet4.write('B6', 19)
|
138
|
+
worksheet4.write('B7', 39)
|
139
|
+
worksheet4.write('B8', 19)
|
140
|
+
worksheet4.write('B9', 66)
|
141
|
+
|
142
|
+
worksheet4.write('D1', 'Name', header2)
|
143
|
+
worksheet4.write('E1', 'Age', header2)
|
144
|
+
|
145
|
+
worksheet4.set_column_pixels('C:C', 20)
|
146
|
+
|
147
|
+
#
|
148
|
+
# Example of using the XLOOKUP() function.
|
149
|
+
#
|
150
|
+
worksheet5.write('F1', '=XLOOKUP(E1,A2:A9,C2:C9)')
|
151
|
+
|
152
|
+
# Write the data the function will work on.
|
153
|
+
worksheet5.write('A1', 'Country', header1)
|
154
|
+
worksheet5.write('B1', 'Abr', header1)
|
155
|
+
worksheet5.write('C1', 'Prefix', header1)
|
156
|
+
|
157
|
+
worksheet5.write('A2', 'China')
|
158
|
+
worksheet5.write('A3', 'India')
|
159
|
+
worksheet5.write('A4', 'United States')
|
160
|
+
worksheet5.write('A5', 'Indonesia')
|
161
|
+
worksheet5.write('A6', 'Brazil')
|
162
|
+
worksheet5.write('A7', 'Pakistan')
|
163
|
+
worksheet5.write('A8', 'Nigeria')
|
164
|
+
worksheet5.write('A9', 'Bangladesh')
|
165
|
+
|
166
|
+
worksheet5.write('B2', 'CN')
|
167
|
+
worksheet5.write('B3', 'IN')
|
168
|
+
worksheet5.write('B4', 'US')
|
169
|
+
worksheet5.write('B5', 'ID')
|
170
|
+
worksheet5.write('B6', 'BR')
|
171
|
+
worksheet5.write('B7', 'PK')
|
172
|
+
worksheet5.write('B8', 'NG')
|
173
|
+
worksheet5.write('B9', 'BD')
|
174
|
+
|
175
|
+
worksheet5.write('C2', 86)
|
176
|
+
worksheet5.write('C3', 91)
|
177
|
+
worksheet5.write('C4', 1)
|
178
|
+
worksheet5.write('C5', 62)
|
179
|
+
worksheet5.write('C6', 55)
|
180
|
+
worksheet5.write('C7', 92)
|
181
|
+
worksheet5.write('C8', 234)
|
182
|
+
worksheet5.write('C9', 880)
|
183
|
+
|
184
|
+
worksheet5.write('E1', 'Brazil', header2)
|
185
|
+
|
186
|
+
worksheet5.set_column_pixels('A:A', 100)
|
187
|
+
worksheet5.set_column_pixels('D:D', 20)
|
188
|
+
|
189
|
+
#
|
190
|
+
# Example of using the XMATCH() function.
|
191
|
+
#
|
192
|
+
worksheet6.write('D2', '=XMATCH(C2,A2:A6)')
|
193
|
+
|
194
|
+
# Write the data the function will work on.
|
195
|
+
worksheet6.write('A1', 'Product', header1)
|
196
|
+
|
197
|
+
worksheet6.write('A2', 'Apple')
|
198
|
+
worksheet6.write('A3', 'Grape')
|
199
|
+
worksheet6.write('A4', 'Pear')
|
200
|
+
worksheet6.write('A5', 'Banana')
|
201
|
+
worksheet6.write('A6', 'Cherry')
|
202
|
+
|
203
|
+
worksheet6.write('C1', 'Product', header2)
|
204
|
+
worksheet6.write('D1', 'Position', header2)
|
205
|
+
worksheet6.write('C2', 'Grape')
|
206
|
+
|
207
|
+
worksheet6.set_column_pixels('B:B', 20)
|
208
|
+
|
209
|
+
#
|
210
|
+
# Example of using the RANDARRAY() function.
|
211
|
+
#
|
212
|
+
worksheet7.write('A1', '=RANDARRAY(5,3,1,100, TRUE)')
|
213
|
+
|
214
|
+
#
|
215
|
+
# Example of using the SEQUENCE() function.
|
216
|
+
#
|
217
|
+
worksheet8.write('A1', '=SEQUENCE(4,5)')
|
218
|
+
|
219
|
+
#
|
220
|
+
# Example of using the Spill range operator.
|
221
|
+
#
|
222
|
+
worksheet9.write('H2', '=ANCHORARRAY(F2)')
|
223
|
+
|
224
|
+
worksheet9.write('J2', '=COUNTA(ANCHORARRAY(F2))')
|
225
|
+
|
226
|
+
# Write the data the to work on.
|
227
|
+
worksheet9.write('F2', '=UNIQUE(B2:B17)')
|
228
|
+
worksheet9.write('F1', 'Unique', header2)
|
229
|
+
worksheet9.write('H1', 'Spill', header2)
|
230
|
+
worksheet9.write('J1', 'Spill', header2)
|
231
|
+
|
232
|
+
write_worksheet_data(worksheet9, header1)
|
233
|
+
worksheet9.set_column_pixels('E:E', 20)
|
234
|
+
worksheet9.set_column_pixels('G:G', 20)
|
235
|
+
worksheet9.set_column_pixels('I:I', 20)
|
236
|
+
#
|
237
|
+
# Example of using dynamic ranges with older Excel functions.
|
238
|
+
#
|
239
|
+
worksheet10.write_dynamic_array_formula('B1:B3', '=LEN(A1:A3)')
|
240
|
+
|
241
|
+
# Write the data the to work on.
|
242
|
+
worksheet10.write('A1', 'Foo')
|
243
|
+
worksheet10.write('A2', 'Food')
|
244
|
+
worksheet10.write('A3', 'Frood')
|
245
|
+
|
246
|
+
# Close the workbook.
|
247
|
+
workbook.close
|
data/examples/lambda.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# -*- coding: utf-8 -*-
|
3
|
+
|
4
|
+
#######################################################################
|
5
|
+
#
|
6
|
+
# An example of using the new Excel LAMBDA() function with the
|
7
|
+
# WriteXLSX rubygem. Note, this function is only currently available
|
8
|
+
# if you are subscribed to the Microsoft Office Beta program.
|
9
|
+
#
|
10
|
+
# Copyright 2000-2021, John McNamara, jmcnamara@cpan.org
|
11
|
+
# convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
|
12
|
+
#
|
13
|
+
|
14
|
+
require 'write_xlsx'
|
15
|
+
|
16
|
+
workbook = WriteXLSX.new('lambda.xlsx')
|
17
|
+
worksheet = workbook.add_worksheet
|
18
|
+
|
19
|
+
worksheet.write(
|
20
|
+
'A1',
|
21
|
+
'Note: Lambda functions currently only work with the Beta Channel versions of Excel 365'
|
22
|
+
)
|
23
|
+
|
24
|
+
# Write a Lambda function to convert Fahrenheit to Celsius to a cell.
|
25
|
+
#
|
26
|
+
# Note that the lambda function parameters must be prefixed with
|
27
|
+
# "_xlpm.". These prefixes won't show up in Excel.
|
28
|
+
worksheet.write('A2', '=LAMBDA(_xlpm.temp, (5/9) * (_xlpm.temp-32))(32)')
|
29
|
+
|
30
|
+
# Create the same formula (without an argument) as a defined name and use that
|
31
|
+
# to calculate a value.
|
32
|
+
#
|
33
|
+
# Note that the formula name is prefixed with "_xlfn." (this is normally
|
34
|
+
# converted automatically by write_formula but isn't for defined names)
|
35
|
+
# and note that the lambda function parameters are prefixed with
|
36
|
+
# "_xlpm.". These prefixes won't show up in Excel.
|
37
|
+
workbook.define_name(
|
38
|
+
'ToCelsius',
|
39
|
+
'=_xlfn.LAMBDA(_xlpm.temp, (5/9) * (_xlpm.temp-32))'
|
40
|
+
)
|
41
|
+
worksheet.write_dynamic_array_formula('A3', '=ToCelsius(212)')
|
42
|
+
|
43
|
+
workbook.close
|
Binary file
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#######################################################################
|
4
|
+
#
|
5
|
+
# An example of adding a worksheet watermark image using the WriteXLSX
|
6
|
+
# rubygem. This is based on the method of putting an image in the worksheet
|
7
|
+
# header as suggested in the Microsoft documentation:
|
8
|
+
# https://support.microsoft.com/en-us/office/add-a-watermark-in-excel-a372182a-d733-484e-825c-18ddf3edf009
|
9
|
+
#
|
10
|
+
# Copyright 2000-2023, John McNamara, jmcnamara@cpan.org
|
11
|
+
# convert to ruby by Hideo NAKAMURA, nakamura.hideo@gmail.com
|
12
|
+
#
|
13
|
+
|
14
|
+
require 'write_xlsx'
|
15
|
+
|
16
|
+
workbook = WriteXLSX.new('watermark.xlsx')
|
17
|
+
worksheet = workbook.add_worksheet
|
18
|
+
|
19
|
+
# Set a worksheet header with the watermark image.
|
20
|
+
dirname = File.dirname(File.expand_path(__FILE__))
|
21
|
+
worksheet.set_header(
|
22
|
+
'&C&C&[Picture]', nil,
|
23
|
+
{ :image_center => File.join(dirname, 'watermark.png') }
|
24
|
+
)
|
25
|
+
|
26
|
+
workbook.close
|
data/lib/write_xlsx/chart.rb
CHANGED
data/lib/write_xlsx/col_name.rb
CHANGED
data/lib/write_xlsx/colors.rb
CHANGED
data/lib/write_xlsx/drawing.rb
CHANGED
@@ -1,24 +1,26 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'write_xlsx/package/xml_writer_simple'
|
4
5
|
require 'write_xlsx/utility'
|
5
6
|
|
6
7
|
module Writexlsx
|
7
8
|
class Drawing
|
8
|
-
attr_accessor :type, :dimensions, :width, :height, :
|
9
|
+
attr_accessor :type, :dimensions, :width, :height, :shape, :anchor, :rel_index, :url_rel_index, :name, :description
|
9
10
|
attr_reader :tip, :decorative
|
10
11
|
|
11
|
-
def initialize(type, dimensions, width, height,
|
12
|
+
def initialize(type, dimensions, width, height, shape, anchor, rel_index = nil, url_rel_index = nil, tip = nil, name = nil, description = nil, decorative = nil)
|
12
13
|
@type = type
|
13
14
|
@dimensions = dimensions
|
14
15
|
@width = width
|
15
16
|
@height = height
|
16
|
-
@description = description
|
17
17
|
@shape = shape
|
18
18
|
@anchor = anchor
|
19
19
|
@rel_index = rel_index
|
20
20
|
@url_rel_index = url_rel_index
|
21
21
|
@tip = tip
|
22
|
+
@name = name
|
23
|
+
@description = description
|
22
24
|
@decorative = decorative
|
23
25
|
end
|
24
26
|
end
|
@@ -96,12 +98,13 @@ module Writexlsx
|
|
96
98
|
type = drawing.type
|
97
99
|
width = drawing.width
|
98
100
|
height = drawing.height
|
99
|
-
description = drawing.description
|
100
101
|
shape = drawing.shape
|
101
102
|
anchor = drawing.anchor
|
102
103
|
rel_index = drawing.rel_index
|
103
104
|
url_rel_index = drawing.url_rel_index
|
104
105
|
tip = drawing.tip
|
106
|
+
name = drawing.name
|
107
|
+
description = drawing.description
|
105
108
|
decorative = drawing.decorative
|
106
109
|
|
107
110
|
col_from, row_from, col_from_offset, row_from_offset,
|
@@ -129,7 +132,7 @@ module Writexlsx
|
|
129
132
|
# Graphic frame.
|
130
133
|
|
131
134
|
# Write the xdr:graphicFrame element for charts.
|
132
|
-
write_graphic_frame(index, rel_index, description)
|
135
|
+
write_graphic_frame(index, rel_index, name, description, decorative)
|
133
136
|
elsif type == 2
|
134
137
|
# Write the xdr:pic element.
|
135
138
|
write_pic(
|
@@ -263,14 +266,17 @@ module Writexlsx
|
|
263
266
|
#
|
264
267
|
# Write the <xdr:graphicFrame> element.
|
265
268
|
#
|
266
|
-
def write_graphic_frame(
|
267
|
-
|
269
|
+
def write_graphic_frame(
|
270
|
+
index, rel_index, name = nil,
|
271
|
+
description = nil, decorative = nil, macro = nil
|
272
|
+
)
|
273
|
+
macro ||= ''
|
268
274
|
|
269
275
|
attributes = [['macro', macro]]
|
270
276
|
|
271
277
|
@writer.tag_elements('xdr:graphicFrame', attributes) do
|
272
278
|
# Write the xdr:nvGraphicFramePr element.
|
273
|
-
write_nv_graphic_frame_pr(index, name)
|
279
|
+
write_nv_graphic_frame_pr(index, name, description, decorative)
|
274
280
|
# Write the xdr:xfrm element.
|
275
281
|
write_xfrm
|
276
282
|
# Write the a:graphic element.
|
@@ -281,12 +287,16 @@ module Writexlsx
|
|
281
287
|
#
|
282
288
|
# Write the <xdr:nvGraphicFramePr> element.
|
283
289
|
#
|
284
|
-
def write_nv_graphic_frame_pr(
|
290
|
+
def write_nv_graphic_frame_pr(
|
291
|
+
index, name = nil, description = nil, decorative = nil
|
292
|
+
)
|
293
|
+
|
285
294
|
name = "Chart #{index}" unless ptrue?(name)
|
286
295
|
|
287
296
|
@writer.tag_elements('xdr:nvGraphicFramePr') do
|
288
297
|
# Write the xdr:cNvPr element.
|
289
|
-
write_c_nv_pr(index + 1, name
|
298
|
+
write_c_nv_pr(index + 1, name, description,
|
299
|
+
nil, nil, decorative)
|
290
300
|
# Write the xdr:cNvGraphicFramePr element.
|
291
301
|
write_c_nv_graphic_frame_pr
|
292
302
|
end
|
data/lib/write_xlsx/format.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'write_xlsx/utility'
|
4
5
|
|
@@ -658,6 +659,10 @@ module Writexlsx
|
|
658
659
|
attributes
|
659
660
|
end
|
660
661
|
|
662
|
+
def force_text_format?
|
663
|
+
@num_format == 49 # Text format ('@')
|
664
|
+
end
|
665
|
+
|
661
666
|
private
|
662
667
|
|
663
668
|
def write_font_shapes(writer)
|
data/lib/write_xlsx/formats.rb
CHANGED
data/lib/write_xlsx/gradient.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'write_xlsx/utility'
|
4
5
|
|
@@ -7,10 +8,13 @@ module Writexlsx
|
|
7
8
|
class Button
|
8
9
|
include Writexlsx::Utility
|
9
10
|
|
10
|
-
attr_accessor :font, :macro, :vertices
|
11
|
+
attr_accessor :font, :macro, :vertices, :description
|
11
12
|
|
12
13
|
def v_shape_attributes(id, z_index)
|
13
|
-
attributes = v_shape_attributes_base(id
|
14
|
+
attributes = v_shape_attributes_base(id)
|
15
|
+
attributes << ['alt', description] if description
|
16
|
+
|
17
|
+
attributes << ['style', (v_shape_style_base(z_index, vertices) + style_addition).join]
|
14
18
|
attributes << ['o:button', 't']
|
15
19
|
attributes << ['fillcolor', color]
|
16
20
|
attributes << ['strokecolor', 'windowText [64]']
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require 'write_xlsx/format'
|
4
5
|
require 'write_xlsx/package/xml_writer_simple'
|
@@ -112,7 +113,8 @@ module Writexlsx
|
|
112
113
|
end
|
113
114
|
|
114
115
|
def v_shape_attributes(id, z_index)
|
115
|
-
attr = v_shape_attributes_base(id
|
116
|
+
attr = v_shape_attributes_base(id)
|
117
|
+
attr << ['style', (v_shape_style_base(z_index, vertices) + style_addition).join]
|
116
118
|
attr << ['fillcolor', color]
|
117
119
|
attr << ['o:insetmode', 'auto']
|
118
120
|
attr
|