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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -0
- data/README.md +71 -253
- data/Rakefile +2 -1
- data/docs/PEER_LIBRARIES.md +121 -0
- data/docs/assets/benchmark_results.svg +144 -0
- data/docs/assets/lsp_autocompletion.png +0 -0
- data/docs/assets/playground_preview.png +0 -0
- data/docs/visual/VisualGallery.md +183 -0
- data/docs/wasm/ruby.wasm +0 -0
- data/lib/xlsxrb/chart_builder.rb +333 -0
- data/lib/xlsxrb/elements/workbook.rb +2 -2
- data/lib/xlsxrb/ooxml/reader/listeners.rb +6450 -0
- data/lib/xlsxrb/ooxml/reader.rb +2 -6438
- data/lib/xlsxrb/ooxml/workbook_writer.rb +10 -10
- data/lib/xlsxrb/ooxml/worksheet_parser.rb +161 -116
- data/lib/xlsxrb/ooxml/worksheet_writer.rb +5 -1
- data/lib/xlsxrb/stream_row.rb +5 -3
- data/lib/xlsxrb/stream_sheet.rb +125 -0
- data/lib/xlsxrb/stream_writer.rb +1646 -0
- data/lib/xlsxrb/version.rb +1 -1
- data/lib/xlsxrb/workbook_builder.rb +309 -0
- data/lib/xlsxrb/worksheet_builder.rb +691 -0
- data/lib/xlsxrb.rb +238 -2968
- data/sig/generated/xlsxrb/chart_builder.rbs +269 -0
- data/sig/generated/xlsxrb/ooxml/reader/listeners.rbs +1074 -0
- data/sig/generated/xlsxrb/ooxml/reader.rbs +0 -1067
- data/sig/generated/xlsxrb/ooxml/worksheet_parser.rbs +3 -3
- data/sig/generated/xlsxrb/stream_row.rbs +3 -2
- data/sig/generated/xlsxrb/stream_sheet.rbs +100 -0
- data/sig/generated/xlsxrb/stream_writer.rbs +954 -0
- data/sig/generated/xlsxrb/workbook_builder.rbs +146 -0
- data/sig/generated/xlsxrb/worksheet_builder.rbs +349 -0
- data/sig/generated/xlsxrb.rbs +103 -1563
- 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
|