xlsxrb 0.1.13 → 0.1.15
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/CHANGELOG.md +104 -0
- data/README.md +17 -14
- data/lib/xlsxrb/colors.rb +118 -0
- data/lib/xlsxrb/elements/cell.rb +205 -16
- data/lib/xlsxrb/elements/column.rb +6 -4
- data/lib/xlsxrb/elements/coordinate_access.rb +32 -0
- data/lib/xlsxrb/elements/image.rb +128 -0
- data/lib/xlsxrb/elements/row.rb +206 -9
- data/lib/xlsxrb/elements/styles.rb +157 -0
- data/lib/xlsxrb/elements/types.rb +95 -1
- data/lib/xlsxrb/elements/workbook.rb +121 -4
- data/lib/xlsxrb/elements/worksheet.rb +519 -29
- data/lib/xlsxrb/elements.rb +2 -0
- data/lib/xlsxrb/number_formatter.rb +429 -0
- data/lib/xlsxrb/ooxml/cfb.rb +1 -1
- data/lib/xlsxrb/ooxml/reader/listeners/core_listeners.rb +7 -5
- data/lib/xlsxrb/ooxml/reader/listeners/drawing_listeners.rb +11 -4
- data/lib/xlsxrb/ooxml/reader/listeners/feature_listeners.rb +7 -1
- data/lib/xlsxrb/ooxml/reader.rb +14 -17
- data/lib/xlsxrb/ooxml/shared_strings_parser.rb +7 -1
- data/lib/xlsxrb/ooxml/styles_parser.rb +39 -9
- data/lib/xlsxrb/ooxml/utils.rb +34 -18
- data/lib/xlsxrb/ooxml/workbook_parser.rb +74 -16
- data/lib/xlsxrb/ooxml/workbook_writer.rb +82 -23
- data/lib/xlsxrb/ooxml/worksheet_parser.rb +319 -79
- data/lib/xlsxrb/ooxml/worksheet_writer.rb +263 -66
- data/lib/xlsxrb/ooxml/writer/features_xml.rb +5 -3
- data/lib/xlsxrb/ooxml/writer.rb +14 -0
- data/lib/xlsxrb/ooxml/xml_builder.rb +14 -2
- data/lib/xlsxrb/ooxml/zip_reader.rb +144 -28
- data/lib/xlsxrb/stream_row.rb +243 -16
- data/lib/xlsxrb/stream_sheet.rb +647 -16
- data/lib/xlsxrb/stream_writer.rb +375 -34
- data/lib/xlsxrb/style_builder.rb +308 -22
- data/lib/xlsxrb/utils.rb +211 -0
- data/lib/xlsxrb/version.rb +1 -1
- data/lib/xlsxrb/workbook_builder.rb +72 -11
- data/lib/xlsxrb/worksheet_builder.rb +738 -24
- data/lib/xlsxrb.rb +1073 -83
- data/sig/generated/xlsxrb/colors.rbs +40 -0
- data/sig/generated/xlsxrb/elements/cell.rbs +113 -8
- data/sig/generated/xlsxrb/elements/column.rbs +3 -2
- data/sig/generated/xlsxrb/elements/coordinate_access.rbs +18 -0
- data/sig/generated/xlsxrb/elements/image.rbs +82 -0
- data/sig/generated/xlsxrb/elements/row.rbs +83 -4
- data/sig/generated/xlsxrb/elements/styles.rbs +79 -0
- data/sig/generated/xlsxrb/elements/types.rbs +43 -0
- data/sig/generated/xlsxrb/elements/workbook.rbs +79 -2
- data/sig/generated/xlsxrb/elements/worksheet.rbs +282 -18
- data/sig/generated/xlsxrb/number_formatter.rbs +132 -0
- data/sig/generated/xlsxrb/ooxml/reader.rbs +6 -0
- data/sig/generated/xlsxrb/ooxml/shared_strings_parser.rbs +2 -0
- data/sig/generated/xlsxrb/ooxml/styles_parser.rbs +5 -2
- data/sig/generated/xlsxrb/ooxml/utils.rbs +17 -8
- data/sig/generated/xlsxrb/ooxml/workbook_parser.rbs +9 -3
- data/sig/generated/xlsxrb/ooxml/workbook_writer.rbs +1 -1
- data/sig/generated/xlsxrb/ooxml/worksheet_parser.rbs +28 -6
- data/sig/generated/xlsxrb/ooxml/worksheet_writer.rbs +13 -3
- data/sig/generated/xlsxrb/ooxml/writer.rbs +2 -0
- data/sig/generated/xlsxrb/ooxml/xml_builder.rbs +3 -1
- data/sig/generated/xlsxrb/ooxml/zip_reader.rbs +13 -0
- data/sig/generated/xlsxrb/stream_row.rbs +100 -6
- data/sig/generated/xlsxrb/stream_sheet.rbs +358 -14
- data/sig/generated/xlsxrb/stream_writer.rbs +220 -30
- data/sig/generated/xlsxrb/style_builder.rbs +55 -18
- data/sig/generated/xlsxrb/utils.rbs +151 -0
- data/sig/generated/xlsxrb/workbook_builder.rbs +26 -0
- data/sig/generated/xlsxrb/worksheet_builder.rbs +356 -18
- data/sig/generated/xlsxrb.rbs +223 -27
- metadata +11 -1
data/sig/generated/xlsxrb.rbs
CHANGED
|
@@ -29,6 +29,8 @@ module Xlsxrb
|
|
|
29
29
|
class ParseError < Error
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
+
OMITTED_TARGET: untyped
|
|
33
|
+
|
|
32
34
|
# Raised when cell, row, or workbook parameters fail specification validation.
|
|
33
35
|
class ValidationError < Error
|
|
34
36
|
end
|
|
@@ -51,19 +53,25 @@ module Xlsxrb
|
|
|
51
53
|
|
|
52
54
|
# Helper to construct {Elements::RichText} objects with formatted text runs.
|
|
53
55
|
#
|
|
54
|
-
# @example Create multi-run rich text
|
|
56
|
+
# @example Create multi-run rich text with hashes
|
|
55
57
|
# rt = Xlsxrb.rich_text({ text: "Total: ", font: { bold: true } }, { text: "$100" })
|
|
56
58
|
#
|
|
59
|
+
# @example Create rich text with text/font pairs
|
|
60
|
+
# rt = Xlsxrb.rich_text("Normal text, ", ["bold text, ", { bold: true }], ["red text", { color: "FF0000" }])
|
|
61
|
+
#
|
|
62
|
+
# @example Create rich text with format objects implementing to_font_hash
|
|
63
|
+
# rt = Xlsxrb.rich_text("Normal text, ", bold_format, "bold text")
|
|
64
|
+
#
|
|
57
65
|
# @example Create simple styled text
|
|
58
66
|
# rt = Xlsxrb.rich_text(text: "Important Notice", bold: true, color: "FF0000")
|
|
59
67
|
#
|
|
60
|
-
# @param runs [Array<Hash, String>] Optional array of rich text run
|
|
68
|
+
# @param runs [Array<Hash, String, Array, Elements::RichTextRun, Object>] Optional array of rich text run items.
|
|
61
69
|
# @param text [String, nil] Plain text string (convenience parameter).
|
|
62
70
|
# @param font_props [Hash] Inline font styling options (e.g. bold: true, color: "FF0000").
|
|
63
71
|
# @return [Elements::RichText] The compiled rich text element.
|
|
64
72
|
# @api public
|
|
65
|
-
# : (*(Hash[Symbol, untyped] | String) runs, ?text: String?, **untyped font_props) -> Elements::RichText
|
|
66
|
-
def self.rich_text: (*Hash[Symbol, untyped] | String runs, ?text: String?, **untyped font_props) -> Elements::RichText
|
|
73
|
+
# : (*(Hash[Symbol, untyped] | Elements::RichTextRun | String | Array[untyped] | untyped) runs, ?text: String?, **untyped font_props) -> Elements::RichText
|
|
74
|
+
def self.rich_text: (*Hash[Symbol, untyped] | Elements::RichTextRun | String | Array[untyped] | untyped runs, ?text: String?, **untyped font_props) -> Elements::RichText
|
|
67
75
|
|
|
68
76
|
# Creates an {Elements::Formula} object for use in cell values.
|
|
69
77
|
#
|
|
@@ -75,10 +83,160 @@ module Xlsxrb
|
|
|
75
83
|
#
|
|
76
84
|
# @param expression [String] The formula expression without leading '=' (e.g. "SUM(A1:A10)").
|
|
77
85
|
# @param cached_value [Object, nil] Optional precomputed value for readers that do not evaluate formulas.
|
|
86
|
+
# @param type [Symbol, String, nil] Formula type (:shared, :array, etc.).
|
|
87
|
+
# @param ref [String, nil] Target cell or range reference (e.g. "A1:C1").
|
|
88
|
+
# @return [Elements::Formula]
|
|
89
|
+
# @api public
|
|
90
|
+
# : (String expression, ?cached_value: (String | Numeric | bool | nil), ?type: (Symbol | String)?, ?ref: String?) -> Elements::Formula
|
|
91
|
+
def self.formula: (String expression, ?cached_value: String | Numeric | bool | nil, ?type: (Symbol | String)?, ?ref: String?) -> Elements::Formula
|
|
92
|
+
|
|
93
|
+
# Creates an array or dynamic array {Elements::Formula} object.
|
|
94
|
+
#
|
|
95
|
+
# @example Create a multi-cell array formula
|
|
96
|
+
# formula = Xlsxrb.array_formula("SUM(B1:B10*C1:C10)", "A1:C1", cached_value: 0)
|
|
97
|
+
#
|
|
98
|
+
# @example Create a dynamic array formula
|
|
99
|
+
# formula = Xlsxrb.array_formula("SORT(UNIQUE(A1:A10))", "D1")
|
|
100
|
+
#
|
|
101
|
+
# @param expression [String] The formula expression without leading '='.
|
|
102
|
+
# @param ref [String, nil] Target cell or range reference (e.g. "A1:C1" or "D1").
|
|
103
|
+
# @param cached_value [Object, nil] Optional precomputed value.
|
|
78
104
|
# @return [Elements::Formula]
|
|
79
105
|
# @api public
|
|
80
|
-
# : (String expression, ?cached_value: (String | Numeric | bool | nil)) -> Elements::Formula
|
|
81
|
-
def self.
|
|
106
|
+
# : (String expression, ?String? ref, ?cached_value: (String | Numeric | bool | nil)) -> Elements::Formula
|
|
107
|
+
def self.array_formula: (String expression, ?String? ref, ?cached_value: String | Numeric | bool | nil) -> Elements::Formula
|
|
108
|
+
|
|
109
|
+
# Creates an {Elements::Hyperlink} object for use in cell hyperlinks.
|
|
110
|
+
#
|
|
111
|
+
# @example Create an external hyperlink with a ScreenTip tooltip
|
|
112
|
+
# link = Xlsxrb.hyperlink("https://example.com", tooltip: "Visit Example")
|
|
113
|
+
#
|
|
114
|
+
# @example Create an internal worksheet link
|
|
115
|
+
# link = Xlsxrb.hyperlink(location: "Sheet2!A1", tooltip: "Go to Sheet 2")
|
|
116
|
+
#
|
|
117
|
+
# @param url [String, nil] External hyperlink URL.
|
|
118
|
+
# @param display [String, nil] Optional display label.
|
|
119
|
+
# @param tooltip [String, nil] Optional hover ScreenTip text.
|
|
120
|
+
# @param location [String, nil] Optional internal sheet coordinate.
|
|
121
|
+
# @return [Elements::Hyperlink]
|
|
122
|
+
# @api public
|
|
123
|
+
# : (?String? url, ?display: String?, ?tooltip: String?, ?location: String?) -> Elements::Hyperlink
|
|
124
|
+
def self.hyperlink: (?String? url, ?display: String?, ?tooltip: String?, ?location: String?) -> Elements::Hyperlink
|
|
125
|
+
|
|
126
|
+
# Formats a cell value according to an Excel format code string.
|
|
127
|
+
#
|
|
128
|
+
# @param value [Object, nil] Value to format.
|
|
129
|
+
# @param format_code [String, nil] Excel format code string.
|
|
130
|
+
# @param date1904 [Boolean] Whether the 1904 date system is active.
|
|
131
|
+
# @return [String] Formatted string representation.
|
|
132
|
+
# @api public
|
|
133
|
+
# : (untyped value, ?String? format_code, ?date1904: bool) -> String
|
|
134
|
+
def self.format: (untyped value, ?String? format_code, ?date1904: bool) -> String
|
|
135
|
+
|
|
136
|
+
# Converts a Date or Time to an Excel numeric serial number (1900 or 1904 system).
|
|
137
|
+
#
|
|
138
|
+
# @example
|
|
139
|
+
# Xlsxrb.date_to_serial(Date.new(2026, 1, 1)) #=> 46023
|
|
140
|
+
#
|
|
141
|
+
# @param date_or_time [Date, Time] Date or Time instance.
|
|
142
|
+
# @param date1904 [Boolean] Whether to use the 1904 date system.
|
|
143
|
+
# @return [Integer, Float] Serial number.
|
|
144
|
+
# @api public
|
|
145
|
+
# : (Date | Time date_or_time, ?date1904: bool) -> (Integer | Float)
|
|
146
|
+
def self.date_to_serial: (Date | Time date_or_time, ?date1904: bool) -> (Integer | Float)
|
|
147
|
+
|
|
148
|
+
# Converts an Excel serial number to a Date.
|
|
149
|
+
#
|
|
150
|
+
# @example
|
|
151
|
+
# Xlsxrb.serial_to_date(46023) #=> #<Date: 2026-01-01>
|
|
152
|
+
#
|
|
153
|
+
# @param serial [Numeric] Excel serial number.
|
|
154
|
+
# @param date1904 [Boolean] Whether to use the 1904 date system.
|
|
155
|
+
# @return [Date]
|
|
156
|
+
# @api public
|
|
157
|
+
# : (Numeric serial, ?date1904: bool) -> Date
|
|
158
|
+
def self.serial_to_date: (Numeric serial, ?date1904: bool) -> Date
|
|
159
|
+
|
|
160
|
+
# Converts a Time or Date to a fractional Excel serial number.
|
|
161
|
+
#
|
|
162
|
+
# @example
|
|
163
|
+
# Xlsxrb.datetime_to_serial(Time.utc(2026, 1, 1, 12, 0, 0)) #=> 46023.5
|
|
164
|
+
#
|
|
165
|
+
# @param time [Time, Date] Time or Date instance.
|
|
166
|
+
# @param date1904 [Boolean] Whether to use the 1904 date system.
|
|
167
|
+
# @return [Float] Fractional serial number.
|
|
168
|
+
# @api public
|
|
169
|
+
# : (Time | Date time, ?date1904: bool) -> Float
|
|
170
|
+
def self.datetime_to_serial: (Time | Date time, ?date1904: bool) -> Float
|
|
171
|
+
|
|
172
|
+
# Converts an Excel serial number to a Time (UTC).
|
|
173
|
+
#
|
|
174
|
+
# @example
|
|
175
|
+
# Xlsxrb.serial_to_time(46023.5) #=> 2026-01-01 12:00:00 UTC
|
|
176
|
+
#
|
|
177
|
+
# @param serial [Numeric] Excel serial number.
|
|
178
|
+
# @param date1904 [Boolean] Whether to use the 1904 date system.
|
|
179
|
+
# @return [Time]
|
|
180
|
+
# @api public
|
|
181
|
+
# : (Numeric serial, ?date1904: bool) -> Time
|
|
182
|
+
def self.serial_to_time: (Numeric serial, ?date1904: bool) -> Time
|
|
183
|
+
|
|
184
|
+
alias self.serial_to_datetime self.serial_to_time
|
|
185
|
+
|
|
186
|
+
# Converts a cell range reference string (e.g. "A1:C10", "A1") to 0-based [[top_row, left_col], [bottom_row, right_col]].
|
|
187
|
+
#
|
|
188
|
+
# @example
|
|
189
|
+
# Xlsxrb.parse_range("A1:C10") #=> [[0, 0], [9, 2]]
|
|
190
|
+
#
|
|
191
|
+
# @param range_ref [String, nil]
|
|
192
|
+
# @return [Array([Integer, Integer], [Integer, Integer]), nil]
|
|
193
|
+
# @api public
|
|
194
|
+
# : (String? range_ref) -> [[Integer, Integer], [Integer, Integer]]?
|
|
195
|
+
def self.parse_range: (String? range_ref) -> [ [ Integer, Integer ], [ Integer, Integer ] ]?
|
|
196
|
+
|
|
197
|
+
# Converts 0-based bounding coordinates to an A1-style range reference string.
|
|
198
|
+
#
|
|
199
|
+
# @example
|
|
200
|
+
# Xlsxrb.range_to_ref(0, 0, 9, 2) #=> "A1:C10"
|
|
201
|
+
#
|
|
202
|
+
# @param top_row [Integer]
|
|
203
|
+
# @param left_col [Integer]
|
|
204
|
+
# @param bottom_row [Integer]
|
|
205
|
+
# @param right_col [Integer]
|
|
206
|
+
# @return [String]
|
|
207
|
+
# @api public
|
|
208
|
+
# : (Integer top_row, Integer left_col, Integer bottom_row, Integer right_col) -> String
|
|
209
|
+
def self.range_to_ref: (Integer top_row, Integer left_col, Integer bottom_row, Integer right_col) -> String
|
|
210
|
+
|
|
211
|
+
# Resolves an ECMA-376 indexed color palette index (0..63) to an RRGGBB hex string (or AARRGGBB if alpha: true).
|
|
212
|
+
#
|
|
213
|
+
# @example
|
|
214
|
+
# Xlsxrb.palette_color(12) #=> "0000FF"
|
|
215
|
+
# Xlsxrb.palette_color(12, alpha: true) #=> "FF0000FF"
|
|
216
|
+
#
|
|
217
|
+
# @param index [Object, nil] Palette index (0..63).
|
|
218
|
+
# @param alpha [Boolean] Whether to prefix "FF" alpha channel.
|
|
219
|
+
# @return [String, nil]
|
|
220
|
+
# @api public
|
|
221
|
+
# : (untyped index, ?alpha: bool) -> String?
|
|
222
|
+
def self.palette_color: (untyped index, ?alpha: bool) -> String?
|
|
223
|
+
|
|
224
|
+
# Converts any supported color representation (palette index 0..63, CSS name, #RGB, #RRGGBB, #AARRGGBB, integer RGB)
|
|
225
|
+
# to a normalized hex string.
|
|
226
|
+
#
|
|
227
|
+
# @example
|
|
228
|
+
# Xlsxrb.to_hex_color(12) #=> "0000FF"
|
|
229
|
+
# Xlsxrb.to_hex_color(:navy) #=> "000080"
|
|
230
|
+
# Xlsxrb.to_hex_color("#FF0000") #=> "FF0000"
|
|
231
|
+
#
|
|
232
|
+
# @param color [Integer, String, Symbol, nil]
|
|
233
|
+
# @param alpha [Boolean] Whether to include the alpha channel (default false -> "RRGGBB").
|
|
234
|
+
# @return [String, nil]
|
|
235
|
+
# @api public
|
|
236
|
+
# : (Integer | String | Symbol | nil color, ?alpha: bool) -> String?
|
|
237
|
+
def self.to_hex_color: (Integer | String | Symbol | nil color, ?alpha: bool) -> String?
|
|
238
|
+
|
|
239
|
+
alias self.color_to_hex self.to_hex_color
|
|
82
240
|
|
|
83
241
|
# Reads an XLSX file (streaming and lazy-loaded by default) from a file path, IO stream, or binary String.
|
|
84
242
|
#
|
|
@@ -86,18 +244,24 @@ module Xlsxrb
|
|
|
86
244
|
# yields each {StreamSheet} sequentially. Call {#load} on the returned Workbook or Sheet
|
|
87
245
|
# to convert to an in-memory representation for coordinate random access (`sheet["A1"]`).
|
|
88
246
|
#
|
|
89
|
-
# @overload read(source, password: nil, &block)
|
|
247
|
+
# @overload read(source, password: nil, trim_empty_rows: false, pad_empty_rows: false, pad_empty_cells: false, &block)
|
|
90
248
|
# Yields each {StreamSheet} sequentially in streaming mode.
|
|
91
249
|
# @param source [String, IO, StringIO] File path, binary content string, or readable IO stream.
|
|
92
250
|
# @param password [String, nil] Optional password to decrypt password-protected XLSX files.
|
|
251
|
+
# @param trim_empty_rows [Boolean] Whether to omit trailing empty rows during sheet iteration.
|
|
252
|
+
# @param pad_empty_rows [Boolean] Whether to yield empty rows for skipped row numbers.
|
|
253
|
+
# @param pad_empty_cells [Boolean] Whether to pad missing cells within rows.
|
|
93
254
|
# @yield [sheet]
|
|
94
255
|
# @yieldparam sheet [StreamSheet] The streaming worksheet object.
|
|
95
256
|
# @return [void]
|
|
96
257
|
#
|
|
97
|
-
# @overload read(source, password: nil)
|
|
258
|
+
# @overload read(source, password: nil, trim_empty_rows: false, pad_empty_rows: false, pad_empty_cells: false)
|
|
98
259
|
# Returns a lazy {Elements::Workbook} object.
|
|
99
260
|
# @param source [String, IO, StringIO] File path, binary content string, or readable IO stream.
|
|
100
261
|
# @param password [String, nil] Optional password to decrypt password-protected XLSX files.
|
|
262
|
+
# @param trim_empty_rows [Boolean] Whether to omit trailing empty rows during sheet iteration.
|
|
263
|
+
# @param pad_empty_rows [Boolean] Whether to yield empty rows for skipped row numbers.
|
|
264
|
+
# @param pad_empty_cells [Boolean] Whether to pad missing cells within rows.
|
|
101
265
|
# @return [Elements::Workbook]
|
|
102
266
|
#
|
|
103
267
|
# @example Streaming read across sheets and rows (O(1) constant memory)
|
|
@@ -118,22 +282,25 @@ module Xlsxrb
|
|
|
118
282
|
# @raise [InvalidPasswordError] If the supplied password is incorrect.
|
|
119
283
|
# @raise [ParseError] If the spreadsheet XML structure is invalid.
|
|
120
284
|
# @api public
|
|
121
|
-
# : (untyped source, ?password: String?) { (StreamSheet) -> void } -> void
|
|
122
|
-
# : (untyped source, ?password: String?) -> Elements::Workbook
|
|
123
|
-
def self.read: (untyped source, ?password: String?) { (StreamSheet) -> void } -> void
|
|
124
|
-
| (untyped source, ?password: String?) -> Elements::Workbook
|
|
285
|
+
# : (untyped source, ?password: String?, ?trim_empty_rows: bool, ?pad_empty_rows: bool, ?pad_empty_cells: bool) { (StreamSheet) -> void } -> void
|
|
286
|
+
# : (untyped source, ?password: String?, ?trim_empty_rows: bool, ?pad_empty_rows: bool, ?pad_empty_cells: bool) -> Elements::Workbook
|
|
287
|
+
def self.read: (untyped source, ?password: String?, ?trim_empty_rows: bool, ?pad_empty_rows: bool, ?pad_empty_cells: bool) { (StreamSheet) -> void } -> void
|
|
288
|
+
| (untyped source, ?password: String?, ?trim_empty_rows: bool, ?pad_empty_rows: bool, ?pad_empty_cells: bool) -> Elements::Workbook
|
|
289
|
+
|
|
290
|
+
alias self.stream self.read
|
|
125
291
|
|
|
126
292
|
# Writes an XLSX file or IO stream (streaming or in-memory), or returns a binary string.
|
|
127
293
|
#
|
|
128
|
-
# @overload write(target, password: nil, encryption_mode: :standard, strict_excel_mode: true, &block)
|
|
294
|
+
# @overload write(?target, password: nil, encryption_mode: :standard, strict_excel_mode: true, &block)
|
|
129
295
|
# Streaming write: yields a {StreamWriter} context for high-speed, zero-allocation XLSX generation.
|
|
130
|
-
#
|
|
296
|
+
# If target is omitted, returns the generated XLSX as an in-memory binary String.
|
|
297
|
+
# @param target [String, IO, StringIO, nil] Optional destination file path or writable IO object.
|
|
131
298
|
# @param password [String, nil] Optional password to encrypt the generated XLSX file.
|
|
132
299
|
# @param encryption_mode [Symbol] Encryption algorithm (:standard or :agile).
|
|
133
300
|
# @param strict_excel_mode [Boolean] Whether to enforce Microsoft Excel specification limits.
|
|
134
301
|
# @yield [stream_writer]
|
|
135
302
|
# @yieldparam stream_writer [Xlsxrb::StreamWriter]
|
|
136
|
-
# @return [void]
|
|
303
|
+
# @return [String, void] Binary data if target is omitted, or void if written to target.
|
|
137
304
|
#
|
|
138
305
|
# @overload write(workbook, password: nil, encryption_mode: :standard)
|
|
139
306
|
# In-memory write: exports the workbook to an in-memory binary String.
|
|
@@ -155,6 +322,11 @@ module Xlsxrb
|
|
|
155
322
|
# writer.sheet("Sheet1") { |s| s.row(["Hello", "World"]) }
|
|
156
323
|
# end
|
|
157
324
|
#
|
|
325
|
+
# @example Streaming write to in-memory binary string (target omitted)
|
|
326
|
+
# binary_data = Xlsxrb.write do |writer|
|
|
327
|
+
# writer.sheet("Sheet1") { |s| s.row(["Hello", "World"]) }
|
|
328
|
+
# end
|
|
329
|
+
#
|
|
158
330
|
# @example Password-protected streaming write
|
|
159
331
|
# Xlsxrb.write("protected.xlsx", password: "SecretPassword123") do |writer|
|
|
160
332
|
# writer.sheet("Confidential") { |s| s.row(["Private Data", 100]) }
|
|
@@ -166,10 +338,10 @@ module Xlsxrb
|
|
|
166
338
|
# @api public
|
|
167
339
|
# : (Elements::Workbook workbook, ?password: String?, ?encryption_mode: Symbol) -> String
|
|
168
340
|
# : (untyped target, Elements::Workbook | untyped workbook, ?password: String?, ?encryption_mode: Symbol) -> void
|
|
169
|
-
# : (untyped target_or_workbook, ?Elements::Workbook | untyped workbook_or_nil, ?password: String?, ?encryption_mode: Symbol, ?strict_excel_mode: bool) ?{ (StreamWriter) -> void } -> untyped
|
|
341
|
+
# : (?untyped target_or_workbook, ?Elements::Workbook | untyped workbook_or_nil, ?password: String?, ?encryption_mode: Symbol, ?strict_excel_mode: bool) ?{ (StreamWriter) -> void } -> untyped
|
|
170
342
|
def self.write: (Elements::Workbook workbook, ?password: String?, ?encryption_mode: Symbol) -> String
|
|
171
343
|
| (untyped target, Elements::Workbook | untyped workbook, ?password: String?, ?encryption_mode: Symbol) -> void
|
|
172
|
-
| (untyped target_or_workbook, ?Elements::Workbook | untyped workbook_or_nil, ?password: String?, ?encryption_mode: Symbol, ?strict_excel_mode: bool) ?{ (StreamWriter) -> void } -> untyped
|
|
344
|
+
| (?untyped target_or_workbook, ?Elements::Workbook | untyped workbook_or_nil, ?password: String?, ?encryption_mode: Symbol, ?strict_excel_mode: bool) ?{ (StreamWriter) -> void } -> untyped
|
|
173
345
|
|
|
174
346
|
# Modifies an existing XLSX file in-memory using an immutable transformation block.
|
|
175
347
|
#
|
|
@@ -213,14 +385,32 @@ module Xlsxrb
|
|
|
213
385
|
# : (?strict_excel_mode: bool) ?{ (WorkbookBuilder) -> void } -> Elements::Workbook
|
|
214
386
|
def self.build: (?strict_excel_mode: bool) ?{ (WorkbookBuilder) -> void } -> Elements::Workbook
|
|
215
387
|
|
|
216
|
-
# : (String name, String? sheet_xml, Array[String] shared_strings, untyped
|
|
217
|
-
private def self.build_worksheet: (String name, String? sheet_xml, Array[String] shared_strings, untyped
|
|
388
|
+
# : (String name, String? sheet_xml, Array[String] shared_strings, untyped styles, ?state: Symbol, ?zip_reader: Ooxml::ZipReader?, ?entry_name: String?, ?hyperlinks: Hash[String, untyped]?, ?comments: Array[Hash[Symbol, untyped]]?, ?images: Array[Elements::Image]?, ?date1904: bool, ?dimension: String?, ?trim_empty_rows: bool, ?pad_empty_rows: bool, ?pad_empty_cells: bool, ?merged_cells: Array[String]?, ?auto_filter: String?, ?tables: Array[Hash[Symbol, untyped]]?, ?shapes: Array[Hash[Symbol, untyped]]?, ?freeze_pane: Hash[Symbol, untyped]?, ?page_setup: Hash[Symbol, untyped]?, ?page_margins: Hash[Symbol, untyped]?, ?header_footer: Hash[Symbol, untyped]?, ?print_options: Hash[Symbol, untyped]?, ?sheet_protection: Hash[Symbol, untyped]?, ?sheet_view: Hash[Symbol, untyped]?, ?sheet_properties: Hash[Symbol, untyped]?, ?sheet_format: Hash[Symbol, untyped]?, ?row_breaks: Array[untyped]?, ?col_breaks: Array[untyped]?, ?protected_ranges: Array[Hash[Symbol, untyped]]?, ?cell_watches: Array[String]?) -> Elements::Worksheet
|
|
389
|
+
private def self.build_worksheet: (String name, String? sheet_xml, Array[String] shared_strings, untyped styles, ?state: Symbol, ?zip_reader: Ooxml::ZipReader?, ?entry_name: String?, ?hyperlinks: Hash[String, untyped]?, ?comments: Array[Hash[Symbol, untyped]]?, ?images: Array[Elements::Image]?, ?date1904: bool, ?dimension: String?, ?trim_empty_rows: bool, ?pad_empty_rows: bool, ?pad_empty_cells: bool, ?merged_cells: Array[String]?, ?auto_filter: String?, ?tables: Array[Hash[Symbol, untyped]]?, ?shapes: Array[Hash[Symbol, untyped]]?, ?freeze_pane: Hash[Symbol, untyped]?, ?page_setup: Hash[Symbol, untyped]?, ?page_margins: Hash[Symbol, untyped]?, ?header_footer: Hash[Symbol, untyped]?, ?print_options: Hash[Symbol, untyped]?, ?sheet_protection: Hash[Symbol, untyped]?, ?sheet_view: Hash[Symbol, untyped]?, ?sheet_properties: Hash[Symbol, untyped]?, ?sheet_format: Hash[Symbol, untyped]?, ?row_breaks: Array[untyped]?, ?col_breaks: Array[untyped]?, ?protected_ranges: Array[Hash[Symbol, untyped]]?, ?cell_watches: Array[String]?) -> Elements::Worksheet
|
|
218
390
|
|
|
219
|
-
# : (
|
|
220
|
-
private def self.
|
|
391
|
+
# : (String? sheet_xml, ?zip_reader: Ooxml::ZipReader?, ?entry_name: String?, ?rels_xml: String?) -> Hash[String, Hash[Symbol, untyped]]
|
|
392
|
+
private def self.resolve_hyperlinks: (String? sheet_xml, ?zip_reader: Ooxml::ZipReader?, ?entry_name: String?, ?rels_xml: String?) -> Hash[String, Hash[Symbol, untyped]]
|
|
221
393
|
|
|
222
|
-
# : (
|
|
223
|
-
private def self.
|
|
394
|
+
# : (String base_dir, String target) -> String
|
|
395
|
+
private def self.resolve_relative_path: (String base_dir, String target) -> String
|
|
396
|
+
|
|
397
|
+
# : (?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> Array[Hash[Symbol, untyped]]
|
|
398
|
+
private def self.resolve_comments: (?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> Array[Hash[Symbol, untyped]]
|
|
399
|
+
|
|
400
|
+
# : (?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> Array[Elements::Image]
|
|
401
|
+
private def self.resolve_images: (?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> Array[Elements::Image]
|
|
402
|
+
|
|
403
|
+
# : (?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> Array[Hash[Symbol, untyped]]
|
|
404
|
+
private def self.resolve_tables: (?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> Array[Hash[Symbol, untyped]]
|
|
405
|
+
|
|
406
|
+
# : (?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> Array[Hash[Symbol, untyped]]
|
|
407
|
+
private def self.resolve_shapes: (?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> Array[Hash[Symbol, untyped]]
|
|
408
|
+
|
|
409
|
+
# : (untyped raw_row, ?Hash[String, Hash[Symbol, untyped]] hyperlinks, ?(Array[Hash[Symbol, untyped]] | Hash[String, Hash[Symbol, untyped]]) comments, ?Hash[untyped, untyped]? styles, ?date1904: bool) -> (Elements::Row | untyped)
|
|
410
|
+
private def self.build_row_from_raw: (untyped raw_row, ?Hash[String, Hash[Symbol, untyped]] hyperlinks, ?Array[Hash[Symbol, untyped]] | Hash[String, Hash[Symbol, untyped]] comments, ?Hash[untyped, untyped]? styles, ?date1904: bool) -> (Elements::Row | untyped)
|
|
411
|
+
|
|
412
|
+
# : (Elements::Cell cell, Array[String] sst, Hash[String, Integer] sst_index, ?date1904: bool) -> Hash[Symbol, untyped]
|
|
413
|
+
private def self.build_raw_cell: (Elements::Cell cell, Array[String] sst, Hash[String, Integer] sst_index, ?date1904: bool) -> Hash[Symbol, untyped]
|
|
224
414
|
|
|
225
415
|
# : (Elements::Row row) -> Hash[Symbol, untyped]
|
|
226
416
|
private def self.build_row_attrs: (Elements::Row row) -> Hash[Symbol, untyped]
|
|
@@ -240,8 +430,14 @@ module Xlsxrb
|
|
|
240
430
|
# : (String sheet_xml, Array[Elements::Row] rows) -> String
|
|
241
431
|
private def self.update_dimension: (String sheet_xml, Array[Elements::Row] rows) -> String
|
|
242
432
|
|
|
243
|
-
# : (
|
|
244
|
-
private def self.
|
|
433
|
+
# : (String sheet_xml, String? orig_rels_xml, Hash[String, untyped] new_hyperlinks) -> [String, String?]
|
|
434
|
+
private def self.update_sheet_hyperlinks: (String sheet_xml, String? orig_rels_xml, Hash[String, untyped] new_hyperlinks) -> [ String, String? ]
|
|
435
|
+
|
|
436
|
+
# : (String sheet_xml, String _rels_path, String? orig_rels_xml, Array[Hash[Symbol, untyped]] new_comments, Ooxml::ZipReader zip_reader, Integer sheet_idx, String entry_name, Hash[String, String] replaced_entries) -> [String, String?]
|
|
437
|
+
private def self.update_sheet_comments: (String sheet_xml, String _rels_path, String? orig_rels_xml, Array[Hash[Symbol, untyped]] new_comments, Ooxml::ZipReader zip_reader, Integer sheet_idx, String entry_name, Hash[String, String] replaced_entries) -> [ String, String? ]
|
|
438
|
+
|
|
439
|
+
# : (Array[Elements::Row] rows, Array[untyped] shared_strings, Hash[untyped, Integer] sst_index, ?use_sst: bool, ?date1904: bool) -> String
|
|
440
|
+
private def self.serialize_sheet_data_xml: (Array[Elements::Row] rows, Array[untyped] shared_strings, Hash[untyped, Integer] sst_index, ?use_sst: bool, ?date1904: bool) -> String
|
|
245
441
|
|
|
246
442
|
# Builds a raw cell hash from a value for streaming writes.
|
|
247
443
|
#
|
|
@@ -252,6 +448,6 @@ module Xlsxrb
|
|
|
252
448
|
# @param sst_index [Hash{String => Integer}] Shared strings index mapping.
|
|
253
449
|
# @return [Hash{Symbol => Object}] Raw cell hash.
|
|
254
450
|
# @api public
|
|
255
|
-
# : (Integer row_index, Integer col_index, untyped value, Array[String] sst, Hash[String, Integer] sst_index) -> Hash[Symbol, untyped]
|
|
256
|
-
def self.build_raw_cell_from_value: (Integer row_index, Integer col_index, untyped value, Array[String] sst, Hash[String, Integer] sst_index) -> Hash[Symbol, untyped]
|
|
451
|
+
# : (Integer row_index, Integer col_index, untyped value, Array[String] sst, Hash[String, Integer] sst_index, ?date1904: bool) -> Hash[Symbol, untyped]
|
|
452
|
+
def self.build_raw_cell_from_value: (Integer row_index, Integer col_index, untyped value, Array[String] sst, Hash[String, Integer] sst_index, ?date1904: bool) -> Hash[Symbol, untyped]
|
|
257
453
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: xlsxrb
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.15
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- niku
|
|
@@ -53,15 +53,19 @@ files:
|
|
|
53
53
|
- lib/ruby_lsp/xlsxrb/completion_listener.rb
|
|
54
54
|
- lib/xlsxrb.rb
|
|
55
55
|
- lib/xlsxrb/chart_builder.rb
|
|
56
|
+
- lib/xlsxrb/colors.rb
|
|
56
57
|
- lib/xlsxrb/dsl_helpers.rb
|
|
57
58
|
- lib/xlsxrb/elements.rb
|
|
58
59
|
- lib/xlsxrb/elements/cell.rb
|
|
59
60
|
- lib/xlsxrb/elements/column.rb
|
|
60
61
|
- lib/xlsxrb/elements/coordinate_access.rb
|
|
62
|
+
- lib/xlsxrb/elements/image.rb
|
|
61
63
|
- lib/xlsxrb/elements/row.rb
|
|
64
|
+
- lib/xlsxrb/elements/styles.rb
|
|
62
65
|
- lib/xlsxrb/elements/types.rb
|
|
63
66
|
- lib/xlsxrb/elements/workbook.rb
|
|
64
67
|
- lib/xlsxrb/elements/worksheet.rb
|
|
68
|
+
- lib/xlsxrb/number_formatter.rb
|
|
65
69
|
- lib/xlsxrb/ooxml.rb
|
|
66
70
|
- lib/xlsxrb/ooxml/cfb.rb
|
|
67
71
|
- lib/xlsxrb/ooxml/crypto.rb
|
|
@@ -93,20 +97,25 @@ files:
|
|
|
93
97
|
- lib/xlsxrb/stream_sheet.rb
|
|
94
98
|
- lib/xlsxrb/stream_writer.rb
|
|
95
99
|
- lib/xlsxrb/style_builder.rb
|
|
100
|
+
- lib/xlsxrb/utils.rb
|
|
96
101
|
- lib/xlsxrb/version.rb
|
|
97
102
|
- lib/xlsxrb/workbook_builder.rb
|
|
98
103
|
- lib/xlsxrb/worksheet_builder.rb
|
|
99
104
|
- sig/generated/xlsxrb.rbs
|
|
100
105
|
- sig/generated/xlsxrb/chart_builder.rbs
|
|
106
|
+
- sig/generated/xlsxrb/colors.rbs
|
|
101
107
|
- sig/generated/xlsxrb/dsl_helpers.rbs
|
|
102
108
|
- sig/generated/xlsxrb/elements.rbs
|
|
103
109
|
- sig/generated/xlsxrb/elements/cell.rbs
|
|
104
110
|
- sig/generated/xlsxrb/elements/column.rbs
|
|
105
111
|
- sig/generated/xlsxrb/elements/coordinate_access.rbs
|
|
112
|
+
- sig/generated/xlsxrb/elements/image.rbs
|
|
106
113
|
- sig/generated/xlsxrb/elements/row.rbs
|
|
114
|
+
- sig/generated/xlsxrb/elements/styles.rbs
|
|
107
115
|
- sig/generated/xlsxrb/elements/types.rbs
|
|
108
116
|
- sig/generated/xlsxrb/elements/workbook.rbs
|
|
109
117
|
- sig/generated/xlsxrb/elements/worksheet.rbs
|
|
118
|
+
- sig/generated/xlsxrb/number_formatter.rbs
|
|
110
119
|
- sig/generated/xlsxrb/ooxml.rbs
|
|
111
120
|
- sig/generated/xlsxrb/ooxml/cfb.rbs
|
|
112
121
|
- sig/generated/xlsxrb/ooxml/crypto.rbs
|
|
@@ -138,6 +147,7 @@ files:
|
|
|
138
147
|
- sig/generated/xlsxrb/stream_sheet.rbs
|
|
139
148
|
- sig/generated/xlsxrb/stream_writer.rbs
|
|
140
149
|
- sig/generated/xlsxrb/style_builder.rbs
|
|
150
|
+
- sig/generated/xlsxrb/utils.rbs
|
|
141
151
|
- sig/generated/xlsxrb/version.rbs
|
|
142
152
|
- sig/generated/xlsxrb/workbook_builder.rbs
|
|
143
153
|
- sig/generated/xlsxrb/worksheet_builder.rbs
|