xlsxrb 0.1.13 → 0.1.14

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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +57 -0
  3. data/README.md +2 -0
  4. data/lib/xlsxrb/colors.rb +118 -0
  5. data/lib/xlsxrb/elements/cell.rb +205 -16
  6. data/lib/xlsxrb/elements/column.rb +6 -4
  7. data/lib/xlsxrb/elements/coordinate_access.rb +32 -0
  8. data/lib/xlsxrb/elements/image.rb +128 -0
  9. data/lib/xlsxrb/elements/row.rb +206 -9
  10. data/lib/xlsxrb/elements/styles.rb +157 -0
  11. data/lib/xlsxrb/elements/types.rb +95 -1
  12. data/lib/xlsxrb/elements/workbook.rb +85 -4
  13. data/lib/xlsxrb/elements/worksheet.rb +424 -29
  14. data/lib/xlsxrb/elements.rb +2 -0
  15. data/lib/xlsxrb/number_formatter.rb +429 -0
  16. data/lib/xlsxrb/ooxml/cfb.rb +1 -1
  17. data/lib/xlsxrb/ooxml/reader/listeners/core_listeners.rb +7 -5
  18. data/lib/xlsxrb/ooxml/reader/listeners/drawing_listeners.rb +11 -4
  19. data/lib/xlsxrb/ooxml/reader.rb +12 -14
  20. data/lib/xlsxrb/ooxml/shared_strings_parser.rb +7 -1
  21. data/lib/xlsxrb/ooxml/styles_parser.rb +39 -9
  22. data/lib/xlsxrb/ooxml/utils.rb +34 -18
  23. data/lib/xlsxrb/ooxml/workbook_parser.rb +53 -15
  24. data/lib/xlsxrb/ooxml/workbook_writer.rb +65 -14
  25. data/lib/xlsxrb/ooxml/worksheet_parser.rb +319 -79
  26. data/lib/xlsxrb/ooxml/worksheet_writer.rb +206 -61
  27. data/lib/xlsxrb/ooxml/writer/features_xml.rb +4 -2
  28. data/lib/xlsxrb/ooxml/writer.rb +14 -0
  29. data/lib/xlsxrb/ooxml/zip_reader.rb +109 -25
  30. data/lib/xlsxrb/stream_row.rb +243 -16
  31. data/lib/xlsxrb/stream_sheet.rb +414 -15
  32. data/lib/xlsxrb/stream_writer.rb +213 -17
  33. data/lib/xlsxrb/style_builder.rb +308 -22
  34. data/lib/xlsxrb/utils.rb +158 -0
  35. data/lib/xlsxrb/version.rb +1 -1
  36. data/lib/xlsxrb/workbook_builder.rb +73 -3
  37. data/lib/xlsxrb/worksheet_builder.rb +227 -16
  38. data/lib/xlsxrb.rb +578 -79
  39. data/sig/generated/xlsxrb/colors.rbs +40 -0
  40. data/sig/generated/xlsxrb/elements/cell.rbs +113 -8
  41. data/sig/generated/xlsxrb/elements/column.rbs +3 -2
  42. data/sig/generated/xlsxrb/elements/coordinate_access.rbs +18 -0
  43. data/sig/generated/xlsxrb/elements/image.rbs +82 -0
  44. data/sig/generated/xlsxrb/elements/row.rbs +83 -4
  45. data/sig/generated/xlsxrb/elements/styles.rbs +79 -0
  46. data/sig/generated/xlsxrb/elements/types.rbs +43 -0
  47. data/sig/generated/xlsxrb/elements/workbook.rbs +51 -2
  48. data/sig/generated/xlsxrb/elements/worksheet.rbs +231 -18
  49. data/sig/generated/xlsxrb/number_formatter.rbs +132 -0
  50. data/sig/generated/xlsxrb/ooxml/reader.rbs +6 -0
  51. data/sig/generated/xlsxrb/ooxml/shared_strings_parser.rbs +2 -0
  52. data/sig/generated/xlsxrb/ooxml/styles_parser.rbs +5 -2
  53. data/sig/generated/xlsxrb/ooxml/utils.rbs +17 -8
  54. data/sig/generated/xlsxrb/ooxml/workbook_parser.rbs +9 -3
  55. data/sig/generated/xlsxrb/ooxml/worksheet_parser.rbs +28 -6
  56. data/sig/generated/xlsxrb/ooxml/worksheet_writer.rbs +3 -1
  57. data/sig/generated/xlsxrb/ooxml/writer.rbs +2 -0
  58. data/sig/generated/xlsxrb/ooxml/zip_reader.rbs +10 -0
  59. data/sig/generated/xlsxrb/stream_row.rbs +100 -6
  60. data/sig/generated/xlsxrb/stream_sheet.rbs +247 -13
  61. data/sig/generated/xlsxrb/stream_writer.rbs +120 -14
  62. data/sig/generated/xlsxrb/style_builder.rbs +55 -18
  63. data/sig/generated/xlsxrb/utils.rbs +119 -0
  64. data/sig/generated/xlsxrb/workbook_builder.rbs +26 -0
  65. data/sig/generated/xlsxrb/worksheet_builder.rbs +107 -11
  66. data/sig/generated/xlsxrb.rbs +186 -27
  67. metadata +11 -1
@@ -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 hashes or string.
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,135 @@ 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.formula: (String expression, ?cached_value: String | Numeric | bool | nil) -> Elements::Formula
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
+ # Resolves an ECMA-376 indexed color palette index (0..63) to an RRGGBB hex string (or AARRGGBB if alpha: true).
187
+ #
188
+ # @example
189
+ # Xlsxrb.palette_color(12) #=> "0000FF"
190
+ # Xlsxrb.palette_color(12, alpha: true) #=> "FF0000FF"
191
+ #
192
+ # @param index [Object, nil] Palette index (0..63).
193
+ # @param alpha [Boolean] Whether to prefix "FF" alpha channel.
194
+ # @return [String, nil]
195
+ # @api public
196
+ # : (untyped index, ?alpha: bool) -> String?
197
+ def self.palette_color: (untyped index, ?alpha: bool) -> String?
198
+
199
+ # Converts any supported color representation (palette index 0..63, CSS name, #RGB, #RRGGBB, #AARRGGBB, integer RGB)
200
+ # to a normalized hex string.
201
+ #
202
+ # @example
203
+ # Xlsxrb.to_hex_color(12) #=> "0000FF"
204
+ # Xlsxrb.to_hex_color(:navy) #=> "000080"
205
+ # Xlsxrb.to_hex_color("#FF0000") #=> "FF0000"
206
+ #
207
+ # @param color [Integer, String, Symbol, nil]
208
+ # @param alpha [Boolean] Whether to include the alpha channel (default false -> "RRGGBB").
209
+ # @return [String, nil]
210
+ # @api public
211
+ # : (Integer | String | Symbol | nil color, ?alpha: bool) -> String?
212
+ def self.to_hex_color: (Integer | String | Symbol | nil color, ?alpha: bool) -> String?
213
+
214
+ alias self.color_to_hex self.to_hex_color
82
215
 
83
216
  # Reads an XLSX file (streaming and lazy-loaded by default) from a file path, IO stream, or binary String.
84
217
  #
@@ -86,18 +219,24 @@ module Xlsxrb
86
219
  # yields each {StreamSheet} sequentially. Call {#load} on the returned Workbook or Sheet
87
220
  # to convert to an in-memory representation for coordinate random access (`sheet["A1"]`).
88
221
  #
89
- # @overload read(source, password: nil, &block)
222
+ # @overload read(source, password: nil, trim_empty_rows: false, pad_empty_rows: false, pad_empty_cells: false, &block)
90
223
  # Yields each {StreamSheet} sequentially in streaming mode.
91
224
  # @param source [String, IO, StringIO] File path, binary content string, or readable IO stream.
92
225
  # @param password [String, nil] Optional password to decrypt password-protected XLSX files.
226
+ # @param trim_empty_rows [Boolean] Whether to omit trailing empty rows during sheet iteration.
227
+ # @param pad_empty_rows [Boolean] Whether to yield empty rows for skipped row numbers.
228
+ # @param pad_empty_cells [Boolean] Whether to pad missing cells within rows.
93
229
  # @yield [sheet]
94
230
  # @yieldparam sheet [StreamSheet] The streaming worksheet object.
95
231
  # @return [void]
96
232
  #
97
- # @overload read(source, password: nil)
233
+ # @overload read(source, password: nil, trim_empty_rows: false, pad_empty_rows: false, pad_empty_cells: false)
98
234
  # Returns a lazy {Elements::Workbook} object.
99
235
  # @param source [String, IO, StringIO] File path, binary content string, or readable IO stream.
100
236
  # @param password [String, nil] Optional password to decrypt password-protected XLSX files.
237
+ # @param trim_empty_rows [Boolean] Whether to omit trailing empty rows during sheet iteration.
238
+ # @param pad_empty_rows [Boolean] Whether to yield empty rows for skipped row numbers.
239
+ # @param pad_empty_cells [Boolean] Whether to pad missing cells within rows.
101
240
  # @return [Elements::Workbook]
102
241
  #
103
242
  # @example Streaming read across sheets and rows (O(1) constant memory)
@@ -118,22 +257,25 @@ module Xlsxrb
118
257
  # @raise [InvalidPasswordError] If the supplied password is incorrect.
119
258
  # @raise [ParseError] If the spreadsheet XML structure is invalid.
120
259
  # @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
260
+ # : (untyped source, ?password: String?, ?trim_empty_rows: bool, ?pad_empty_rows: bool, ?pad_empty_cells: bool) { (StreamSheet) -> void } -> void
261
+ # : (untyped source, ?password: String?, ?trim_empty_rows: bool, ?pad_empty_rows: bool, ?pad_empty_cells: bool) -> Elements::Workbook
262
+ def self.read: (untyped source, ?password: String?, ?trim_empty_rows: bool, ?pad_empty_rows: bool, ?pad_empty_cells: bool) { (StreamSheet) -> void } -> void
263
+ | (untyped source, ?password: String?, ?trim_empty_rows: bool, ?pad_empty_rows: bool, ?pad_empty_cells: bool) -> Elements::Workbook
264
+
265
+ alias self.stream self.read
125
266
 
126
267
  # Writes an XLSX file or IO stream (streaming or in-memory), or returns a binary string.
127
268
  #
128
- # @overload write(target, password: nil, encryption_mode: :standard, strict_excel_mode: true, &block)
269
+ # @overload write(?target, password: nil, encryption_mode: :standard, strict_excel_mode: true, &block)
129
270
  # Streaming write: yields a {StreamWriter} context for high-speed, zero-allocation XLSX generation.
130
- # @param target [String, IO, StringIO] Destination file path or writable IO object.
271
+ # If target is omitted, returns the generated XLSX as an in-memory binary String.
272
+ # @param target [String, IO, StringIO, nil] Optional destination file path or writable IO object.
131
273
  # @param password [String, nil] Optional password to encrypt the generated XLSX file.
132
274
  # @param encryption_mode [Symbol] Encryption algorithm (:standard or :agile).
133
275
  # @param strict_excel_mode [Boolean] Whether to enforce Microsoft Excel specification limits.
134
276
  # @yield [stream_writer]
135
277
  # @yieldparam stream_writer [Xlsxrb::StreamWriter]
136
- # @return [void]
278
+ # @return [String, void] Binary data if target is omitted, or void if written to target.
137
279
  #
138
280
  # @overload write(workbook, password: nil, encryption_mode: :standard)
139
281
  # In-memory write: exports the workbook to an in-memory binary String.
@@ -155,6 +297,11 @@ module Xlsxrb
155
297
  # writer.sheet("Sheet1") { |s| s.row(["Hello", "World"]) }
156
298
  # end
157
299
  #
300
+ # @example Streaming write to in-memory binary string (target omitted)
301
+ # binary_data = Xlsxrb.write do |writer|
302
+ # writer.sheet("Sheet1") { |s| s.row(["Hello", "World"]) }
303
+ # end
304
+ #
158
305
  # @example Password-protected streaming write
159
306
  # Xlsxrb.write("protected.xlsx", password: "SecretPassword123") do |writer|
160
307
  # writer.sheet("Confidential") { |s| s.row(["Private Data", 100]) }
@@ -166,10 +313,10 @@ module Xlsxrb
166
313
  # @api public
167
314
  # : (Elements::Workbook workbook, ?password: String?, ?encryption_mode: Symbol) -> String
168
315
  # : (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
316
+ # : (?untyped target_or_workbook, ?Elements::Workbook | untyped workbook_or_nil, ?password: String?, ?encryption_mode: Symbol, ?strict_excel_mode: bool) ?{ (StreamWriter) -> void } -> untyped
170
317
  def self.write: (Elements::Workbook workbook, ?password: String?, ?encryption_mode: Symbol) -> String
171
318
  | (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
319
+ | (?untyped target_or_workbook, ?Elements::Workbook | untyped workbook_or_nil, ?password: String?, ?encryption_mode: Symbol, ?strict_excel_mode: bool) ?{ (StreamWriter) -> void } -> untyped
173
320
 
174
321
  # Modifies an existing XLSX file in-memory using an immutable transformation block.
175
322
  #
@@ -213,14 +360,26 @@ module Xlsxrb
213
360
  # : (?strict_excel_mode: bool) ?{ (WorkbookBuilder) -> void } -> Elements::Workbook
214
361
  def self.build: (?strict_excel_mode: bool) ?{ (WorkbookBuilder) -> void } -> Elements::Workbook
215
362
 
216
- # : (String name, String? sheet_xml, Array[String] shared_strings, untyped _styles) -> Elements::Worksheet
217
- private def self.build_worksheet: (String name, String? sheet_xml, Array[String] shared_strings, untyped _styles) -> Elements::Worksheet
363
+ # : (String name, String? sheet_xml, Array[String] shared_strings, untyped styles, ?state: Symbol, ?zip_reader: Ooxml::ZipReader?, ?entry_name: String?, ?hyperlinks: Hash[String, Hash[Symbol, 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) -> Elements::Worksheet
364
+ 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, Hash[Symbol, 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) -> Elements::Worksheet
365
+
366
+ # : (String? sheet_xml, ?zip_reader: Ooxml::ZipReader?, ?entry_name: String?, ?rels_xml: String?) -> Hash[String, Hash[Symbol, untyped]]
367
+ private def self.resolve_hyperlinks: (String? sheet_xml, ?zip_reader: Ooxml::ZipReader?, ?entry_name: String?, ?rels_xml: String?) -> Hash[String, Hash[Symbol, untyped]]
368
+
369
+ # : (String base_dir, String target) -> String
370
+ private def self.resolve_relative_path: (String base_dir, String target) -> String
371
+
372
+ # : (?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> Array[Hash[Symbol, untyped]]
373
+ private def self.resolve_comments: (?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> Array[Hash[Symbol, untyped]]
374
+
375
+ # : (?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> Array[Elements::Image]
376
+ private def self.resolve_images: (?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> Array[Elements::Image]
218
377
 
219
- # : (untyped raw_row) -> (Elements::Row | untyped)
220
- private def self.build_row_from_raw: (untyped raw_row) -> (Elements::Row | untyped)
378
+ # : (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)
379
+ 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)
221
380
 
222
- # : (Elements::Cell cell, Array[String] sst, Hash[String, Integer] sst_index) -> Hash[Symbol, untyped]
223
- private def self.build_raw_cell: (Elements::Cell cell, Array[String] sst, Hash[String, Integer] sst_index) -> Hash[Symbol, untyped]
381
+ # : (Elements::Cell cell, Array[String] sst, Hash[String, Integer] sst_index, ?date1904: bool) -> Hash[Symbol, untyped]
382
+ private def self.build_raw_cell: (Elements::Cell cell, Array[String] sst, Hash[String, Integer] sst_index, ?date1904: bool) -> Hash[Symbol, untyped]
224
383
 
225
384
  # : (Elements::Row row) -> Hash[Symbol, untyped]
226
385
  private def self.build_row_attrs: (Elements::Row row) -> Hash[Symbol, untyped]
@@ -240,8 +399,8 @@ module Xlsxrb
240
399
  # : (String sheet_xml, Array[Elements::Row] rows) -> String
241
400
  private def self.update_dimension: (String sheet_xml, Array[Elements::Row] rows) -> String
242
401
 
243
- # : (Array[Elements::Row] rows, Array[untyped] shared_strings, Hash[untyped, Integer] sst_index, ?use_sst: bool) -> String
244
- private def self.serialize_sheet_data_xml: (Array[Elements::Row] rows, Array[untyped] shared_strings, Hash[untyped, Integer] sst_index, ?use_sst: bool) -> String
402
+ # : (Array[Elements::Row] rows, Array[untyped] shared_strings, Hash[untyped, Integer] sst_index, ?use_sst: bool, ?date1904: bool) -> String
403
+ 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
404
 
246
405
  # Builds a raw cell hash from a value for streaming writes.
247
406
  #
@@ -252,6 +411,6 @@ module Xlsxrb
252
411
  # @param sst_index [Hash{String => Integer}] Shared strings index mapping.
253
412
  # @return [Hash{Symbol => Object}] Raw cell hash.
254
413
  # @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]
414
+ # : (Integer row_index, Integer col_index, untyped value, Array[String] sst, Hash[String, Integer] sst_index, ?date1904: bool) -> Hash[Symbol, untyped]
415
+ 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
416
  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.13
4
+ version: 0.1.14
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