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
@@ -62,6 +62,8 @@ module Xlsxrb
62
62
  private
63
63
 
64
64
  def fetch_chunk: (untyped chunk_size) -> untyped
65
+
66
+ def check_bom_encoding!: () -> untyped
65
67
  end
66
68
 
67
69
  # Opens a ZIP from a file path or IO and yields the reader.
@@ -128,6 +130,14 @@ module Xlsxrb
128
130
  def decompress: (untyped raw, untyped method) -> untyped
129
131
 
130
132
  def safe_inflate: (untyped raw, untyped wbits) -> untyped
133
+
134
+ def normalize_entry_name: (untyped name) -> untyped
135
+
136
+ def lookup_entry: (untyped name) -> untyped
137
+
138
+ def ci_catalog: () -> untyped
139
+
140
+ def normalize_text_encoding: (untyped data) -> untyped
131
141
  end
132
142
  end
133
143
  end
@@ -23,8 +23,14 @@ module Xlsxrb
23
23
 
24
24
  attr_reader custom_height: untyped
25
25
 
26
+ attr_reader collapsed: untyped
27
+
26
28
  attr_reader outline_level: untyped
27
29
 
30
+ attr_reader style_index: untyped
31
+
32
+ attr_reader pad_empty_cells: untyped
33
+
28
34
  # @param index [Integer] 0-based row index.
29
35
  # @param xml_bytes [String] Raw ASCII-8BIT XML bytes.
30
36
  # @param from [Integer] Byte offset where cells start.
@@ -34,12 +40,58 @@ module Xlsxrb
34
40
  # @param height [Float, Integer, nil] Row height in points.
35
41
  # @param hidden [Boolean] Whether the row is hidden.
36
42
  # @param custom_height [Boolean] Whether custom height is set.
43
+ # @param collapsed [Boolean] Whether the row is collapsed.
37
44
  # @param outline_level [Integer, nil] Grouping/outline level.
38
- # : (index: Integer, xml_bytes: String, from: Integer, to: Integer, shared_strings: Array[String], ?prefix: String, ?height: Float | Integer | nil, ?hidden: bool, ?custom_height: bool, ?outline_level: Integer | nil) -> void
39
- def initialize: (index: Integer, xml_bytes: String, from: Integer, to: Integer, shared_strings: Array[String], ?prefix: String, ?height: Float | Integer | nil, ?hidden: bool, ?custom_height: bool, ?outline_level: Integer | nil) -> void
45
+ # @param style_index [Integer, nil] Style index.
46
+ # @param date1904 [Boolean] Whether the 1904 date system is active.
47
+ # @param pad_empty_cells [Boolean] Whether missing cells in this row are padded.
48
+ # : (index: Integer, xml_bytes: String, from: Integer, to: Integer, shared_strings: Array[String], ?prefix: String, ?height: Float | Integer | nil, ?hidden: bool, ?custom_height: bool, ?collapsed: bool, ?outline_level: Integer | nil, ?style_index: Integer | nil, ?styles: Hash[untyped, untyped]?, ?date1904: bool, ?pad_empty_cells: bool) -> void
49
+ def initialize: (index: Integer, xml_bytes: String, from: Integer, to: Integer, shared_strings: Array[String], ?prefix: String, ?height: Float | Integer | nil, ?hidden: bool, ?custom_height: bool, ?collapsed: bool, ?outline_level: Integer | nil, ?style_index: Integer | nil, ?styles: Hash[untyped, untyped]?, ?date1904: bool, ?pad_empty_cells: bool) -> void
40
50
 
41
51
  # rubocop:disable Style/OptionalBooleanParameter
42
- def self.fast_create: (untyped index, untyped xml_bytes, untyped from, untyped to, untyped shared_strings, ?untyped prefix, ?untyped height, ?untyped hidden, ?untyped custom_height, ?untyped outline_level) -> untyped
52
+ def self.fast_create: (untyped index, untyped xml_bytes, untyped from, untyped to, untyped shared_strings, ?untyped prefix, ?untyped height, ?untyped hidden, ?untyped custom_height, ?untyped outline_level, ?untyped style_index, ?untyped styles, ?untyped date1904, ?untyped collapsed, ?untyped pad_empty_cells) -> untyped
53
+
54
+ # Returns whether the row is hidden.
55
+ #
56
+ # @return [Boolean]
57
+ # @api public
58
+ # : () -> bool
59
+ def hidden?: () -> bool
60
+
61
+ # Returns whether the row is collapsed.
62
+ #
63
+ # @return [Boolean]
64
+ # @api public
65
+ # : () -> bool
66
+ def collapsed?: () -> bool
67
+
68
+ # Returns whether custom height is set.
69
+ #
70
+ # @return [Boolean]
71
+ # @api public
72
+ # : () -> bool
73
+ def custom_height?: () -> bool
74
+
75
+ # Returns a frozen Hash of row attributes.
76
+ #
77
+ # @return [Hash{Symbol => Object}]
78
+ # @api public
79
+ # : () -> Hash[Symbol, untyped]
80
+ def attributes: () -> Hash[Symbol, untyped]
81
+
82
+ # Returns whether the row uses the 1904 date system.
83
+ #
84
+ # @return [Boolean]
85
+ # @api public
86
+ # : () -> bool
87
+ def date1904?: () -> bool
88
+
89
+ # Returns whether missing cells in this row are padded.
90
+ #
91
+ # @return [Boolean]
92
+ # @api public
93
+ # : () -> bool
94
+ def pad_empty_cells?: () -> bool
43
95
 
44
96
  # Iterate over cells in this streaming row one by one.
45
97
  #
@@ -86,6 +138,14 @@ module Xlsxrb
86
138
  # : (Integer col_index) -> Elements::Cell?
87
139
  def cell_at: (Integer col_index) -> Elements::Cell?
88
140
 
141
+ # Convert row cells to a coordinate-keyed Hash (e.g. {"A1" => "value", "B1" => 123}).
142
+ #
143
+ # @param type_cast [Boolean] Whether to coerce date/time serial numbers into Date/Time instances.
144
+ # @return [Hash{String => Object}]
145
+ # @api public
146
+ # : (?type_cast: bool) -> Hash[String, untyped]
147
+ def to_h: (?type_cast: bool) -> Hash[String, untyped]
148
+
89
149
  # Convert row cells to an Array of raw values (sparse columns get nil).
90
150
  #
91
151
  # @return [Array<Object>]
@@ -93,12 +153,34 @@ module Xlsxrb
93
153
  # : () -> Array[untyped]
94
154
  def to_a: () -> Array[untyped]
95
155
 
96
- # Returns cell values as an Array.
156
+ # Returns cell values as an Array (sparse columns get nil).
97
157
  #
158
+ # @param type_cast [Boolean] Whether to coerce date/time serial numbers into Date/Time instances.
98
159
  # @return [Array<Object>]
99
160
  # @api public
100
- # : () -> Array[untyped]
101
- def values: () -> Array[untyped]
161
+ # : (?type_cast: bool) -> Array[untyped]
162
+ def values: (?type_cast: bool) -> Array[untyped]
163
+
164
+ # Convert row cells to an Array of raw string values (sparse columns get nil).
165
+ #
166
+ # @return [Array<String, nil>]
167
+ # @api public
168
+ # : () -> Array[String?]
169
+ def raw_values: () -> Array[String?]
170
+
171
+ # Convert row cells to an Array of formatted string representations (sparse columns get nil).
172
+ #
173
+ # @return [Array<String, nil>]
174
+ # @api public
175
+ # : () -> Array[String?]
176
+ def formatted_values: () -> Array[String?]
177
+
178
+ # Convert row cells to an Array of formula expressions without leading '=' (sparse columns get nil).
179
+ #
180
+ # @return [Array<String, nil>]
181
+ # @api public
182
+ # : () -> Array[String?]
183
+ def formulas: () -> Array[String?]
102
184
 
103
185
  # Returns whether the row is valid according to OOXML specifications.
104
186
  #
@@ -107,6 +189,13 @@ module Xlsxrb
107
189
  # : () -> bool
108
190
  def valid?: () -> bool
109
191
 
192
+ # Returns whether the row contains no cell values (or all cell values are nil or empty strings).
193
+ #
194
+ # @return [Boolean]
195
+ # @api public
196
+ # : () -> bool
197
+ def empty?: () -> bool
198
+
110
199
  # Unmapped metadata for compatibility with Elements::Row.
111
200
  #
112
201
  # @return [Hash]
@@ -127,5 +216,10 @@ module Xlsxrb
127
216
  # @api public
128
217
  # : () -> String
129
218
  def inspect: () -> String
219
+
220
+ private
221
+
222
+ # : (bool) -> Array[untyped]
223
+ def values_from_cells: (bool) -> Array[untyped]
130
224
  end
131
225
  end
@@ -29,6 +29,16 @@ module Xlsxrb
29
29
  # : String
30
30
  attr_reader name: untyped
31
31
 
32
+ # @return [Symbol] The sheet visibility state (:visible, :hidden, or :very_hidden).
33
+ # @api public
34
+ # : Symbol
35
+ attr_reader state: untyped
36
+
37
+ # @return [Hash, nil] The parsed styles definition hash.
38
+ # @api public
39
+ # : Hash[untyped, untyped]?
40
+ attr_reader styles: untyped
41
+
32
42
  # Initializes a streaming worksheet context.
33
43
  #
34
44
  # @param name [String] The sheet name.
@@ -37,24 +47,126 @@ module Xlsxrb
37
47
  # @param styles [Hash, nil] Optional parsed styles hash.
38
48
  # @param zip_reader [Ooxml::ZipReader, nil] Optional ZipReader context.
39
49
  # @param entry_name [String, nil] Archive entry name for this sheet.
40
- # : (String name, untyped sheet_source, Array[String] shared_strings, ?Hash[untyped, untyped]? styles, ?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> void
41
- def initialize: (String name, untyped sheet_source, Array[String] shared_strings, ?Hash[untyped, untyped]? styles, ?zip_reader: Ooxml::ZipReader?, ?entry_name: String?) -> void
50
+ # @param date1904 [Boolean] Whether the 1904 date system is active.
51
+ # @param dimension [String, nil] Sheet dimension reference string (e.g. "A1:Z50000").
52
+ # @param trim_empty_rows [Boolean] Whether to omit trailing empty rows during iteration.
53
+ # @param pad_empty_rows [Boolean] Whether to yield empty rows for skipped row numbers.
54
+ # @param pad_empty_cells [Boolean] Whether to pad missing cells within rows.
55
+ # @param images [Array<Elements::Image>, nil] Optional preloaded images array.
56
+ # : (String name, untyped sheet_source, Array[String] shared_strings, ?Hash[untyped, untyped]? styles, ?zip_reader: Ooxml::ZipReader?, ?entry_name: String?, ?state: Symbol, ?date1904: bool, ?dimension: String?, ?trim_empty_rows: bool, ?pad_empty_rows: bool, ?pad_empty_cells: bool, ?images: Array[Elements::Image]?) -> void
57
+ def initialize: (String name, untyped sheet_source, Array[String] shared_strings, ?Hash[untyped, untyped]? styles, ?zip_reader: Ooxml::ZipReader?, ?entry_name: String?, ?state: Symbol, ?date1904: bool, ?dimension: String?, ?trim_empty_rows: bool, ?pad_empty_rows: bool, ?pad_empty_cells: bool, ?images: Array[Elements::Image]?) -> void
58
+
59
+ # Returns whether trailing empty rows are omitted during iteration.
60
+ #
61
+ # @return [Boolean]
62
+ # @api public
63
+ # : () -> bool
64
+ def trim_empty_rows?: () -> bool
65
+
66
+ alias trim_empty_rows trim_empty_rows?
67
+
68
+ # Returns whether skipped rows are padded during iteration.
69
+ #
70
+ # @return [Boolean]
71
+ # @api public
72
+ # : () -> bool
73
+ def pad_empty_rows?: () -> bool
74
+
75
+ alias pad_empty_rows pad_empty_rows?
76
+
77
+ # Returns whether missing cells within rows are padded during iteration.
78
+ #
79
+ # @return [Boolean]
80
+ # @api public
81
+ # : () -> bool
82
+ def pad_empty_cells?: () -> bool
83
+
84
+ alias pad_empty_cells pad_empty_cells?
85
+
86
+ # Returns the dimension reference string (e.g. "A1:Z50000"), or nil if not present.
87
+ #
88
+ # @return [String, nil]
89
+ # @api public
90
+ # : () -> String?
91
+ def dimension: () -> String?
92
+
93
+ # Returns the 1-based index of the first row defined in the sheet dimension, or nil.
94
+ #
95
+ # @return [Integer, nil]
96
+ # @api public
97
+ # : () -> Integer?
98
+ def first_row: () -> Integer?
99
+
100
+ # Returns the 1-based index of the first column defined in the sheet dimension, or nil.
101
+ #
102
+ # @return [Integer, nil]
103
+ # @api public
104
+ # : () -> Integer?
105
+ def first_column: () -> Integer?
106
+
107
+ alias first_col first_column
108
+
109
+ # Returns the 1-based index of the last row defined in the sheet dimension, or nil.
110
+ #
111
+ # @return [Integer, nil]
112
+ # @api public
113
+ # : () -> Integer?
114
+ def last_row: () -> Integer?
115
+
116
+ # Returns the 1-based index of the last column defined in the sheet dimension, or nil.
117
+ #
118
+ # @return [Integer, nil]
119
+ # @api public
120
+ # : () -> Integer?
121
+ def last_column: () -> Integer?
122
+
123
+ alias last_col last_column
124
+
125
+ # Returns whether the sheet uses the 1904 date system.
126
+ #
127
+ # @return [Boolean]
128
+ # @api public
129
+ # : () -> bool
130
+ def date1904?: () -> bool
131
+
132
+ # Returns whether the sheet is hidden (:hidden or :very_hidden).
133
+ #
134
+ # @return [Boolean]
135
+ # @api public
136
+ # : () -> bool
137
+ def hidden?: () -> bool
138
+
139
+ # Returns whether the sheet is visible.
140
+ #
141
+ # @return [Boolean]
142
+ # @api public
143
+ # : () -> bool
144
+ def visible?: () -> bool
42
145
 
43
146
  # Iterates over rows in this streaming worksheet with O(1) memory.
44
147
  #
45
148
  # @overload each_row(&block)
46
149
  # @yield [row]
47
150
  # @yieldparam row [StreamRow, Elements::Row] The current row.
151
+ # @overload each_row(trim_empty_rows: nil, pad_empty_rows: nil, pad_empty_cells: nil, &block)
152
+ # @param trim_empty_rows [Boolean, nil] Whether to omit trailing empty rows (defaults to sheet setting).
153
+ # @param pad_empty_rows [Boolean, nil] Whether to yield empty rows for skipped row numbers (defaults to sheet setting).
154
+ # @param pad_empty_cells [Boolean, nil] Whether to pad missing cells within rows (defaults to sheet setting).
155
+ # @yield [row]
156
+ # @yieldparam row [StreamRow, Elements::Row] The current row.
48
157
  # @return [void]
49
158
  #
50
- # @overload each_row
159
+ # @overload each_row(trim_empty_rows: nil, pad_empty_rows: nil, pad_empty_cells: nil)
160
+ # @param trim_empty_rows [Boolean, nil] Whether to omit trailing empty rows (defaults to sheet setting).
161
+ # @param pad_empty_rows [Boolean, nil] Whether to yield empty rows for skipped row numbers (defaults to sheet setting).
162
+ # @param pad_empty_cells [Boolean, nil] Whether to pad missing cells within rows (defaults to sheet setting).
51
163
  # @return [Enumerator<StreamRow | Elements::Row, void>]
52
164
  #
53
165
  # @api public
54
- # : () { (StreamRow | Elements::Row) -> void } -> void
55
- # : () -> Enumerator[StreamRow | Elements::Row, void]
56
- def each_row: () { (StreamRow | Elements::Row) -> void } -> void
57
- | () -> Enumerator[StreamRow | Elements::Row, void]
166
+ # : (?trim_empty_rows: bool?, ?pad_empty_rows: bool?, ?pad_empty_cells: bool?) { (StreamRow | Elements::Row) -> void } -> void
167
+ # : (?trim_empty_rows: bool?, ?pad_empty_rows: bool?, ?pad_empty_cells: bool?) -> Enumerator[StreamRow | Elements::Row, void]
168
+ def each_row: (?trim_empty_rows: bool?, ?pad_empty_rows: bool?, ?pad_empty_cells: bool?) { (StreamRow | Elements::Row) -> void } -> void
169
+ | (?trim_empty_rows: bool?, ?pad_empty_rows: bool?, ?pad_empty_cells: bool?) -> Enumerator[StreamRow | Elements::Row, void]
58
170
 
59
171
  # Iterates over all cells across all rows continuously with O(1) memory.
60
172
  #
@@ -72,21 +184,51 @@ module Xlsxrb
72
184
  def each_cell: () { (Elements::Cell) -> void } -> void
73
185
  | () -> Enumerator[Elements::Cell, void]
74
186
 
187
+ # Iterates over row values directly as Arrays without wrapping cells in Elements::Cell objects.
188
+ #
189
+ # @overload each_row_values(type_cast: false, trim_empty_rows: nil, pad_empty_rows: nil, pad_empty_cells: nil, &block)
190
+ # @param type_cast [Boolean] Whether to coerce date/time serial numbers into Date/Time instances.
191
+ # @param trim_empty_rows [Boolean, nil] Whether to omit trailing empty rows (defaults to sheet setting).
192
+ # @param pad_empty_rows [Boolean, nil] Whether to yield empty rows for skipped row numbers (defaults to sheet setting).
193
+ # @param pad_empty_cells [Boolean, nil] Whether to pad missing cells within rows (defaults to sheet setting).
194
+ # @yield [values]
195
+ # @yieldparam values [Array<Object>] Row values array.
196
+ # @return [void]
197
+ #
198
+ # @overload each_row_values(type_cast: false, trim_empty_rows: nil, pad_empty_rows: nil, pad_empty_cells: nil)
199
+ # @param type_cast [Boolean] Whether to coerce date/time serial numbers into Date/Time instances.
200
+ # @param trim_empty_rows [Boolean, nil] Whether to omit trailing empty rows (defaults to sheet setting).
201
+ # @param pad_empty_rows [Boolean, nil] Whether to yield empty rows for skipped row numbers (defaults to sheet setting).
202
+ # @param pad_empty_cells [Boolean, nil] Whether to pad missing cells within rows (defaults to sheet setting).
203
+ # @return [Enumerator<Array<Object>, void>]
204
+ #
205
+ # @api public
206
+ # : (?type_cast: bool, ?trim_empty_rows: bool?, ?pad_empty_rows: bool?, ?pad_empty_cells: bool?) { (Array[untyped]) -> void } -> void
207
+ # : (?type_cast: bool, ?trim_empty_rows: bool?, ?pad_empty_rows: bool?, ?pad_empty_cells: bool?) -> Enumerator[Array[untyped], void]
208
+ def each_row_values: (?type_cast: bool, ?trim_empty_rows: bool?, ?pad_empty_rows: bool?, ?pad_empty_cells: bool?) { (Array[untyped]) -> void } -> void
209
+ | (?type_cast: bool, ?trim_empty_rows: bool?, ?pad_empty_rows: bool?, ?pad_empty_cells: bool?) -> Enumerator[Array[untyped], void]
210
+
75
211
  # Default Enumerable iteration delegates to {#each_row}.
76
212
  #
77
- # @overload each(&block)
213
+ # @overload each(trim_empty_rows: nil, pad_empty_rows: nil, pad_empty_cells: nil, &block)
214
+ # @param trim_empty_rows [Boolean, nil] Whether to omit trailing empty rows.
215
+ # @param pad_empty_rows [Boolean, nil] Whether to yield empty rows for skipped row numbers.
216
+ # @param pad_empty_cells [Boolean, nil] Whether to pad missing cells within rows.
78
217
  # @yield [row]
79
218
  # @yieldparam row [StreamRow, Elements::Row]
80
219
  # @return [void]
81
220
  #
82
- # @overload each
221
+ # @overload each(trim_empty_rows: nil, pad_empty_rows: nil, pad_empty_cells: nil)
222
+ # @param trim_empty_rows [Boolean, nil] Whether to omit trailing empty rows.
223
+ # @param pad_empty_rows [Boolean, nil] Whether to yield empty rows for skipped row numbers.
224
+ # @param pad_empty_cells [Boolean, nil] Whether to pad missing cells within rows.
83
225
  # @return [Enumerator<StreamRow | Elements::Row, void>]
84
226
  #
85
227
  # @api public
86
- # : () { (StreamRow | Elements::Row) -> void } -> void
87
- # : () -> Enumerator[StreamRow | Elements::Row, void]
88
- def each: () { (StreamRow | Elements::Row) -> void } -> void
89
- | () -> Enumerator[StreamRow | Elements::Row, void]
228
+ # : (?trim_empty_rows: bool?, ?pad_empty_rows: bool?, ?pad_empty_cells: bool?) { (StreamRow | Elements::Row) -> void } -> void
229
+ # : (?trim_empty_rows: bool?, ?pad_empty_rows: bool?, ?pad_empty_cells: bool?) -> Enumerator[StreamRow | Elements::Row, void]
230
+ def each: (?trim_empty_rows: bool?, ?pad_empty_rows: bool?, ?pad_empty_cells: bool?) { (StreamRow | Elements::Row) -> void } -> void
231
+ | (?trim_empty_rows: bool?, ?pad_empty_rows: bool?, ?pad_empty_cells: bool?) -> Enumerator[StreamRow | Elements::Row, void]
90
232
 
91
233
  # Loads this sheet completely into an in-memory {Elements::Worksheet},
92
234
  # enabling coordinate random access (`sheet["A1"]`), row lookups (`row_at`),
@@ -99,6 +241,90 @@ module Xlsxrb
99
241
 
100
242
  alias to_worksheet load
101
243
 
244
+ # Returns hyperlinks configured for this worksheet as a Hash of cell references to hyperlink hashes.
245
+ #
246
+ # @return [Hash<String, Hash[Symbol, untyped]>]
247
+ # @api public
248
+ # : () -> Hash[String, Hash[Symbol, untyped]]
249
+ def hyperlinks: () -> Hash[String, Hash[Symbol, untyped]]
250
+
251
+ # Returns hyperlink metadata for a specific cell reference, or nil.
252
+ #
253
+ # @param ref_or_row [String, Symbol, Integer] Cell reference (e.g. "A1") or 0-based row index.
254
+ # @param col [Integer, nil] Optional 0-based column index.
255
+ # @return [Hash, nil]
256
+ # @api public
257
+ # : (String | Symbol | Integer ref_or_row, ?Integer? col) -> Hash[Symbol, untyped]?
258
+ def hyperlink: (String | Symbol | Integer ref_or_row, ?Integer? col) -> Hash[Symbol, untyped]?
259
+
260
+ # Returns comments configured for this worksheet as an Array of comment hashes.
261
+ #
262
+ # @return [Array<Hash[Symbol, untyped]>]
263
+ # @api public
264
+ # : () -> Array[Hash[Symbol, untyped]]
265
+ def comments: () -> Array[Hash[Symbol, untyped]]
266
+
267
+ # Returns comment metadata for a specific cell reference, or nil.
268
+ #
269
+ # @param ref_or_row [String, Symbol, Integer] Cell reference (e.g. "A1") or 0-based row index.
270
+ # @param col [Integer, nil] Optional 0-based column index.
271
+ # @return [Hash, nil]
272
+ # @api public
273
+ # : (String | Symbol | Integer ref_or_row, ?Integer? col) -> Hash[Symbol, untyped]?
274
+ def comment: (String | Symbol | Integer ref_or_row, ?Integer? col) -> Hash[Symbol, untyped]?
275
+
276
+ # Returns comments indexed by cell reference.
277
+ #
278
+ # @return [Hash<String, Hash[Symbol, untyped]>]
279
+ # @api public
280
+ # : () -> Hash[String, Hash[Symbol, untyped]]
281
+ def comments_by_ref: () -> Hash[String, Hash[Symbol, untyped]]
282
+
283
+ # Returns all embedded images in this worksheet.
284
+ #
285
+ # @return [Array<Elements::Image>]
286
+ # @api public
287
+ # : () -> Array[Elements::Image]
288
+ def images: () -> Array[Elements::Image]
289
+
290
+ # Returns all images anchored at a specific cell reference or 0-based coordinate.
291
+ #
292
+ # @param ref_or_row [String, Symbol, Integer] Cell reference (e.g. "A1") or 0-based row index.
293
+ # @param col [Integer, nil] Optional 0-based column index.
294
+ # @return [Array<Elements::Image>]
295
+ # @api public
296
+ # : (String | Symbol | Integer ref_or_row, ?Integer? col) -> Array[Elements::Image]
297
+ def images_at: (String | Symbol | Integer ref_or_row, ?Integer? col) -> Array[Elements::Image]
298
+
299
+ # Loads and returns images for this worksheet, optionally yielding self for block syntax.
300
+ #
301
+ # @yield [sheet]
302
+ # @yieldparam sheet [StreamSheet]
303
+ # @return [StreamSheet, void]
304
+ # @api public
305
+ # : () { (StreamSheet) -> void } -> void
306
+ # : () -> StreamSheet
307
+ def with_images: () { (StreamSheet) -> void } -> void
308
+ | () -> StreamSheet
309
+
310
+ # Access a cell by reference or 0-based coordinates.
311
+ #
312
+ # @param ref_or_row [String, Symbol, Integer] Cell reference (e.g. "A1") or 0-based row index.
313
+ # @param col [Integer, nil] Optional 0-based column index.
314
+ # @return [Elements::Cell, nil]
315
+ # @api public
316
+ # : (String | Symbol | Integer ref_or_row, ?Integer? col) -> Elements::Cell?
317
+ def cell: (String | Symbol | Integer ref_or_row, ?Integer? col) -> Elements::Cell?
318
+
319
+ # Returns the formatted string representation of a cell's value.
320
+ #
321
+ # @param ref_or_row [String, Symbol, Integer] Cell reference (e.g. "A1") or 0-based row index.
322
+ # @param col [Integer, nil] Optional 0-based column index.
323
+ # @return [String, nil]
324
+ # @api public
325
+ # : (String | Symbol | Integer ref_or_row, ?Integer? col) -> String?
326
+ def formatted_value: (String | Symbol | Integer ref_or_row, ?Integer? col) -> String?
327
+
102
328
  # Returns merged cell ranges (e.g. ["A1:B2"]) for this worksheet.
103
329
  #
104
330
  # @return [Array<String>]
@@ -136,5 +362,13 @@ module Xlsxrb
136
362
  # Returns the full raw XML string for this worksheet, loaded on demand.
137
363
  # : () -> String
138
364
  def raw_sheet_xml: () -> String
365
+
366
+ # Returns 1-based bounds [first_row, first_col, last_row, last_col] from dimension ref.
367
+ # : () -> Array[Integer]?
368
+ def dimension_bounds: () -> Array[Integer]?
369
+
370
+ # Extracts dimension reference from XML source lazily without parsing the entire file.
371
+ # : () -> String?
372
+ def extract_dimension: () -> String?
139
373
  end
140
374
  end