xlsx_writer 0.2.2 → 0.3.0
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.
- data/CHANGELOG +7 -0
- data/README.markdown +10 -0
- data/foo.rb +8 -7
- data/lib/xlsx_writer/cell.rb +9 -2
- data/lib/xlsx_writer/document.rb +18 -0
- data/lib/xlsx_writer/generators/sheet.rb +20 -11
- data/lib/xlsx_writer/version.rb +1 -1
- data/test/test_xlsx_writer.rb +49 -1
- metadata +2 -2
data/CHANGELOG
CHANGED
data/README.markdown
CHANGED
@@ -25,11 +25,21 @@ Features not present in simple_xlsx_writer:
|
|
25
25
|
* header and footer, with support for images (.emf only) and page numbers
|
26
26
|
* fits columns to text
|
27
27
|
|
28
|
+
## Wishlist
|
29
|
+
|
30
|
+
1. Optional shared string optimizer
|
31
|
+
|
28
32
|
## Example
|
29
33
|
|
30
34
|
require 'xlsx_writer'
|
31
35
|
|
32
36
|
doc = XlsxWriter::Document.new
|
37
|
+
|
38
|
+
# show TRUE for true but a blank cell instead of FALSE
|
39
|
+
doc.quiet_booleans!
|
40
|
+
|
41
|
+
# freeze pane underneath the first (header) row
|
42
|
+
doc.freeze!
|
33
43
|
|
34
44
|
sheet1 = doc.add_sheet("People")
|
35
45
|
|
data/foo.rb
CHANGED
@@ -11,14 +11,15 @@ require 'xlsx_writer'
|
|
11
11
|
|
12
12
|
@doc = XlsxWriter::Document.new
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
#
|
19
|
-
|
14
|
+
@sheet1 = @doc.add_sheet("Sheet1")
|
15
|
+
@sheet1.add_row(['a', 'a'])
|
16
|
+
@sheet1.add_row(['a', { :value => 'a', :faded => true, :type => :String }])
|
17
|
+
@sheet1.add_row(['a', 'a'])
|
18
|
+
# @sheet1.add_row(['foo', 'bar'])
|
19
|
+
@sheet1.add_autofilter 'A1:B1'
|
20
20
|
|
21
|
-
@
|
21
|
+
@doc.freeze!
|
22
|
+
@sheet2 = @doc.add_sheet("Freeze")
|
22
23
|
@sheet2.add_row(['a', 'a'])
|
23
24
|
@sheet2.add_row(['false1', false])
|
24
25
|
@sheet2.add_row(['false2', {:value => false, :type => :Boolean}])
|
data/lib/xlsx_writer/cell.rb
CHANGED
@@ -187,7 +187,7 @@ module XlsxWriter
|
|
187
187
|
end
|
188
188
|
|
189
189
|
def to_xml
|
190
|
-
if value.nil? or (value.is_a?(String) and value.empty?)
|
190
|
+
if value.nil? or (value.is_a?(String) and value.empty?) or (value == false and quiet_booleans?)
|
191
191
|
%{<c r="#{excel_column_letter}#{row.ndx}" s="0" t="inlineStr" />}
|
192
192
|
elsif excel_type == :inlineStr
|
193
193
|
%{<c r="#{excel_column_letter}#{row.ndx}" s="#{excel_style_number}" t="#{excel_type}"><is><t>#{excel_value}</t></is></c>}
|
@@ -195,10 +195,17 @@ module XlsxWriter
|
|
195
195
|
%{<c r="#{excel_column_letter}#{row.ndx}" s="#{excel_style_number}" t="#{excel_type}"><v>#{excel_value}</v></c>}
|
196
196
|
end
|
197
197
|
end
|
198
|
-
|
198
|
+
|
199
199
|
# 0 -> A (zero based!)
|
200
200
|
def excel_column_letter
|
201
201
|
Cell.excel_column_letter row.cells.index(self)
|
202
202
|
end
|
203
|
+
|
204
|
+
private
|
205
|
+
|
206
|
+
def quiet_booleans?
|
207
|
+
return @quiet_booleans if defined?(@quiet_booleans)
|
208
|
+
@quiet_booleans = row.sheet.document.quiet_booleans?
|
209
|
+
end
|
203
210
|
end
|
204
211
|
end
|
data/lib/xlsx_writer/document.rb
CHANGED
@@ -28,6 +28,24 @@ module XlsxWriter
|
|
28
28
|
@header_footer = HeaderFooter.new
|
29
29
|
@mutex = ::Mutex.new
|
30
30
|
end
|
31
|
+
|
32
|
+
# Instead of TRUE or FALSE, show TRUE and blank if false
|
33
|
+
def quiet_booleans!
|
34
|
+
@quiet_booleans = true
|
35
|
+
end
|
36
|
+
|
37
|
+
def quiet_booleans?
|
38
|
+
@quiet_booleans == true
|
39
|
+
end
|
40
|
+
|
41
|
+
# Freeze the pane under the first (header) row
|
42
|
+
def freeze!
|
43
|
+
@freeze_pane = true
|
44
|
+
end
|
45
|
+
|
46
|
+
def freeze?
|
47
|
+
@freeze_pane == true
|
48
|
+
end
|
31
49
|
|
32
50
|
def add_sheet(name)
|
33
51
|
raise ::RuntimeError, "Can't add sheet, already generated!" if generated?
|
@@ -81,22 +81,31 @@ module XlsxWriter
|
|
81
81
|
|
82
82
|
# not using ERB to save memory
|
83
83
|
def to_file(f)
|
84
|
-
f.
|
84
|
+
f.write <<-EOS
|
85
85
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
86
86
|
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
|
87
|
-
<cols>
|
88
87
|
EOS
|
88
|
+
if document.freeze?
|
89
|
+
f.write <<-EOS
|
90
|
+
<sheetViews>
|
91
|
+
<sheetView workbookViewId="0">
|
92
|
+
<pane ySplit="1" topLeftCell="A2" activePane="bottomLeft" state="frozen"/>
|
93
|
+
</sheetView>
|
94
|
+
</sheetViews>
|
95
|
+
EOS
|
96
|
+
end
|
97
|
+
f.write %{<cols>}
|
89
98
|
(0..max_length-1).each do |x|
|
90
|
-
f.
|
99
|
+
f.write %{<col min="#{x+1}" max="#{x+1}" width="#{max_cell_width(x)}" bestFit="1" customWidth="1" />}
|
91
100
|
end
|
92
|
-
f.
|
93
|
-
f.
|
94
|
-
rows.each { |row| f.
|
95
|
-
f.
|
96
|
-
autofilters.each { |autofilter| f.
|
97
|
-
f.
|
98
|
-
f.
|
99
|
-
f.
|
101
|
+
f.write %{</cols>}
|
102
|
+
f.write %{<sheetData>}
|
103
|
+
rows.each { |row| f.write row.to_xml }
|
104
|
+
f.write %{</sheetData>}
|
105
|
+
autofilters.each { |autofilter| f.write autofilter.to_xml }
|
106
|
+
f.write document.page_setup.to_xml
|
107
|
+
f.write document.header_footer.to_xml
|
108
|
+
f.write %{</worksheet>}
|
100
109
|
end
|
101
110
|
|
102
111
|
def max_length
|
data/lib/xlsx_writer/version.rb
CHANGED
data/test/test_xlsx_writer.rb
CHANGED
@@ -8,6 +8,8 @@ describe XlsxWriter do
|
|
8
8
|
@sheet1 = @doc.add_sheet("People")
|
9
9
|
@sheet1.add_row(['header1', 'header2'])
|
10
10
|
@sheet1.add_row(['hello', 'world'])
|
11
|
+
@sheet1.add_row(['affirmative', true])
|
12
|
+
@sheet1.add_row(['negative', false])
|
11
13
|
end
|
12
14
|
after do
|
13
15
|
@doc.cleanup
|
@@ -17,7 +19,7 @@ describe XlsxWriter do
|
|
17
19
|
File.extname(@doc.path).must_equal '.xlsx'
|
18
20
|
end
|
19
21
|
it "is a readable xlsx" do
|
20
|
-
RemoteTable.new(
|
22
|
+
RemoteTable.new(@doc.path, :format => :xlsx).rows.first.must_equal('header1' => 'hello', 'header2' => 'world')
|
21
23
|
end
|
22
24
|
it "only generates once" do
|
23
25
|
@doc.generate
|
@@ -48,6 +50,52 @@ describe XlsxWriter do
|
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
53
|
+
describe "quiet booleans" do
|
54
|
+
before do
|
55
|
+
@doc = XlsxWriter::Document.new
|
56
|
+
@sheet1 = @doc.add_sheet("QuietBooleans")
|
57
|
+
@sheet1.add_row(['affirmative', 'negative'])
|
58
|
+
@sheet1.add_row([true, false])
|
59
|
+
end
|
60
|
+
after do
|
61
|
+
@doc.cleanup
|
62
|
+
end
|
63
|
+
it "shows TRUE or FALSE for booleans by default" do
|
64
|
+
t = RemoteTable.new(@doc.path, :format => :xlsx)
|
65
|
+
t[0]['affirmative'].must_equal 'TRUE'
|
66
|
+
t[0]['negative'].must_equal 'FALSE'
|
67
|
+
end
|
68
|
+
it "shows TRUE or blank for false if quiet booleans is enabled" do
|
69
|
+
@doc.quiet_booleans!
|
70
|
+
t = RemoteTable.new(@doc.path, :format => :xlsx)
|
71
|
+
t[0]['affirmative'].must_equal 'TRUE'
|
72
|
+
t[0]['negative'].must_equal ''
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
describe "freeze pane under first (header) row" do
|
77
|
+
before do
|
78
|
+
@doc = XlsxWriter::Document.new
|
79
|
+
@sheet1 = @doc.add_sheet("Freeze")
|
80
|
+
@sheet1.add_row([1, 2])
|
81
|
+
@sheet1.add_row([3, 4])
|
82
|
+
end
|
83
|
+
after do
|
84
|
+
@doc.cleanup
|
85
|
+
end
|
86
|
+
it "doesn't freeze by default" do
|
87
|
+
dir = UnixUtils.unzip @doc.path
|
88
|
+
File.read("#{dir}/xl/worksheets/sheet1.xml").wont_include 'pane'
|
89
|
+
FileUtils.rm_rf dir
|
90
|
+
end
|
91
|
+
it "shows TRUE or blank for false if quiet booleans is enabled" do
|
92
|
+
@doc.freeze!
|
93
|
+
dir = UnixUtils.unzip @doc.path
|
94
|
+
File.read("#{dir}/xl/worksheets/sheet1.xml").must_include 'pane'
|
95
|
+
FileUtils.rm_rf dir
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
51
99
|
describe "example with autofilter, header image, and footer text" do
|
52
100
|
before do
|
53
101
|
@doc = XlsxWriter::Document.new
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xlsx_writer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-07-
|
14
|
+
date: 2012-07-10 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: activesupport
|