xlsxrb 0.1.9 → 0.1.10

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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/README.md +71 -253
  4. data/Rakefile +2 -1
  5. data/docs/PEER_LIBRARIES.md +121 -0
  6. data/docs/assets/benchmark_results.svg +144 -0
  7. data/docs/assets/lsp_autocompletion.png +0 -0
  8. data/docs/assets/playground_preview.png +0 -0
  9. data/docs/visual/VisualGallery.md +183 -0
  10. data/docs/wasm/ruby.wasm +0 -0
  11. data/lib/xlsxrb/chart_builder.rb +333 -0
  12. data/lib/xlsxrb/elements/workbook.rb +2 -2
  13. data/lib/xlsxrb/ooxml/reader/listeners.rb +6450 -0
  14. data/lib/xlsxrb/ooxml/reader.rb +2 -6438
  15. data/lib/xlsxrb/ooxml/workbook_writer.rb +10 -10
  16. data/lib/xlsxrb/ooxml/worksheet_parser.rb +161 -116
  17. data/lib/xlsxrb/ooxml/worksheet_writer.rb +5 -1
  18. data/lib/xlsxrb/stream_row.rb +5 -3
  19. data/lib/xlsxrb/stream_sheet.rb +125 -0
  20. data/lib/xlsxrb/stream_writer.rb +1646 -0
  21. data/lib/xlsxrb/version.rb +1 -1
  22. data/lib/xlsxrb/workbook_builder.rb +309 -0
  23. data/lib/xlsxrb/worksheet_builder.rb +691 -0
  24. data/lib/xlsxrb.rb +238 -2968
  25. data/sig/generated/xlsxrb/chart_builder.rbs +269 -0
  26. data/sig/generated/xlsxrb/ooxml/reader/listeners.rbs +1074 -0
  27. data/sig/generated/xlsxrb/ooxml/reader.rbs +0 -1067
  28. data/sig/generated/xlsxrb/ooxml/worksheet_parser.rbs +3 -3
  29. data/sig/generated/xlsxrb/stream_row.rbs +3 -2
  30. data/sig/generated/xlsxrb/stream_sheet.rbs +100 -0
  31. data/sig/generated/xlsxrb/stream_writer.rbs +954 -0
  32. data/sig/generated/xlsxrb/workbook_builder.rbs +146 -0
  33. data/sig/generated/xlsxrb/worksheet_builder.rbs +349 -0
  34. data/sig/generated/xlsxrb.rbs +103 -1563
  35. metadata +17 -1
@@ -0,0 +1,125 @@
1
+ # frozen_string_literal: true
2
+
3
+ # rbs_inline: enabled
4
+
5
+ module Xlsxrb
6
+ # Represents a worksheet being streamed sequentially from an XLSX file.
7
+ # Provides O(1) constant-memory streaming over rows and cells.
8
+ #
9
+ # Call {#load} (or {#to_worksheet}) to convert this streaming sheet into an
10
+ # in-memory {Elements::Worksheet} supporting coordinate random access (`sheet["A1"]`).
11
+ #
12
+ # @example Iterate rows and cells in streaming mode (O(1) memory)
13
+ # Xlsxrb.read("large_data.xlsx") do |sheet|
14
+ # puts "Processing sheet: #{sheet.name}"
15
+ # sheet.each_row do |row|
16
+ # row.each_cell do |cell|
17
+ # puts "#{cell.ref}: #{cell.value}"
18
+ # end
19
+ # end
20
+ # end
21
+ #
22
+ # @example Load into an in-memory Worksheet for coordinate random access
23
+ # wb = Xlsxrb.read("data.xlsx")
24
+ # doc_sheet = wb.sheets.first.load
25
+ # puts doc_sheet["A1"].value
26
+ #
27
+ # @api public
28
+ class StreamSheet
29
+ [Enumerable].each { |m| include m }
30
+
31
+ # @return [String] The sheet name.
32
+ # @api public
33
+ #: String
34
+ attr_reader :name
35
+
36
+ # Initializes a streaming worksheet context.
37
+ #
38
+ # @param name [String] The sheet name.
39
+ # @param sheet_xml [String] Raw XML content of the worksheet.
40
+ # @param shared_strings [Array<String>] Shared strings table.
41
+ # @param styles [Hash, nil] Optional parsed styles hash.
42
+ #: (String name, String sheet_xml, Array[String] shared_strings, ?Hash[untyped, untyped]? styles) -> void
43
+ def initialize(name, sheet_xml, shared_strings, styles = nil)
44
+ @name = name
45
+ @sheet_xml = sheet_xml
46
+ @shared_strings = shared_strings
47
+ @styles = styles
48
+ end
49
+
50
+ # Iterates over rows in this streaming worksheet with O(1) memory.
51
+ #
52
+ # @overload each_row(&block)
53
+ # @yield [row]
54
+ # @yieldparam row [StreamRow, Elements::Row] The current row.
55
+ # @return [void]
56
+ #
57
+ # @overload each_row
58
+ # @return [Enumerator<StreamRow | Elements::Row, void>]
59
+ #
60
+ # @api public
61
+ #: () { (StreamRow | Elements::Row) -> void } -> void
62
+ #: () -> Enumerator[StreamRow | Elements::Row, void]
63
+ def each_row
64
+ return enum_for(:each_row) unless block_given?
65
+
66
+ Ooxml::WorksheetParser.each_row(@sheet_xml, shared_strings: @shared_strings) do |row|
67
+ if row.is_a?(Elements::Row) || row.is_a?(StreamRow)
68
+ yield row
69
+ else
70
+ yield Xlsxrb.send(:build_row_from_raw, row)
71
+ end
72
+ end
73
+ end
74
+
75
+ # Iterates over all cells across all rows continuously with O(1) memory.
76
+ #
77
+ # @overload each_cell(&block)
78
+ # @yield [cell]
79
+ # @yieldparam cell [Elements::Cell] The current cell.
80
+ # @return [void]
81
+ #
82
+ # @overload each_cell
83
+ # @return [Enumerator<Elements::Cell, void>]
84
+ #
85
+ # @api public
86
+ #: () { (Elements::Cell) -> void } -> void
87
+ #: () -> Enumerator[Elements::Cell, void]
88
+ def each_cell(&)
89
+ return enum_for(:each_cell) unless block_given?
90
+
91
+ each_row do |row|
92
+ row.each_cell(&)
93
+ end
94
+ end
95
+
96
+ # Default Enumerable iteration delegates to {#each_row}.
97
+ #
98
+ # @overload each(&block)
99
+ # @yield [row]
100
+ # @yieldparam row [StreamRow, Elements::Row]
101
+ # @return [void]
102
+ #
103
+ # @overload each
104
+ # @return [Enumerator<StreamRow | Elements::Row, void>]
105
+ #
106
+ # @api public
107
+ #: () { (StreamRow | Elements::Row) -> void } -> void
108
+ #: () -> Enumerator[StreamRow | Elements::Row, void]
109
+ def each(&)
110
+ each_row(&)
111
+ end
112
+
113
+ # Loads this sheet completely into an in-memory {Elements::Worksheet},
114
+ # enabling coordinate random access (`sheet["A1"]`), row lookups (`row_at`),
115
+ # and immutable cell updates (`update_cell`).
116
+ #
117
+ # @return [Elements::Worksheet] The fully parsed in-memory worksheet.
118
+ # @api public
119
+ #: () -> Elements::Worksheet
120
+ def load
121
+ Xlsxrb.send(:build_worksheet, @name, @sheet_xml, @shared_strings, @styles)
122
+ end
123
+ alias to_worksheet load
124
+ end
125
+ end