jruby-poi 0.1.0 → 0.4.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/.gitignore CHANGED
@@ -6,3 +6,4 @@ nbproject
6
6
  tmp
7
7
  *.swp
8
8
  TAGS
9
+ pkg
data/README.markdown CHANGED
@@ -12,6 +12,7 @@ Contributors
12
12
  ============
13
13
 
14
14
  * [Scott Deming](http://github.com/sdeming)
15
+ * [Jason Rogers](http://github.com/jacaetevha)
15
16
 
16
17
  Note on Patches/Pull Requests
17
18
  =============================
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.4.0
data/jruby-poi.gemspec ADDED
@@ -0,0 +1,67 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{jruby-poi}
8
+ s.version = "0.4.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Scott Deming"]
12
+ s.date = %q{2010-08-27}
13
+ s.description = %q{A rubyesque library for manipulating spreadsheets and other document types for jruby, using Apache POI.}
14
+ s.email = %q{sdeming@makefile.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.markdown"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "LICENSE",
22
+ "NOTICE",
23
+ "README.markdown",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "jruby-poi.gemspec",
27
+ "lib/ooxml-lib/dom4j-1.6.1.jar",
28
+ "lib/ooxml-lib/geronimo-stax-api_1.0_spec-1.0.jar",
29
+ "lib/ooxml-lib/xmlbeans-2.3.0.jar",
30
+ "lib/poi-3.6-20091214.jar",
31
+ "lib/poi-contrib-3.6-20091214.jar",
32
+ "lib/poi-examples-3.6-20091214.jar",
33
+ "lib/poi-ooxml-3.6-20091214.jar",
34
+ "lib/poi-ooxml-schemas-3.6-20091214.jar",
35
+ "lib/poi-scratchpad-3.6-20091214.jar",
36
+ "lib/poi.rb",
37
+ "lib/poi/workbook.rb",
38
+ "lib/poi/workbook/cell.rb",
39
+ "lib/poi/workbook/row.rb",
40
+ "lib/poi/workbook/workbook.rb",
41
+ "lib/poi/workbook/worksheet.rb",
42
+ "spec_debug.sh",
43
+ "specs/data/simple_with_picture.ods",
44
+ "specs/data/simple_with_picture.xls",
45
+ "specs/data/various_samples.xlsx",
46
+ "specs/io_spec.rb",
47
+ "specs/spec_helper.rb",
48
+ "specs/support/matchers/cell_matcher.rb",
49
+ "specs/workbook_spec.rb"
50
+ ]
51
+ s.homepage = %q{http://github.com/sdeming/jruby-poi}
52
+ s.rdoc_options = ["--charset=UTF-8"]
53
+ s.require_paths = ["lib"]
54
+ s.rubygems_version = %q{1.3.6}
55
+ s.summary = %q{Apache POI class library for jruby}
56
+
57
+ if s.respond_to? :specification_version then
58
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
59
+ s.specification_version = 3
60
+
61
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
62
+ else
63
+ end
64
+ else
65
+ end
66
+ end
67
+
@@ -22,21 +22,74 @@ module POI
22
22
  end
23
23
 
24
24
  class Cell
25
+ CELL = Java::org.apache.poi.ss.usermodel.Cell
26
+ CELL_VALUE = Java::org.apache.poi.ss.usermodel.CellValue
27
+ CELL_TYPE_BLANK = CELL::CELL_TYPE_BLANK
28
+ CELL_TYPE_BOOLEAN = CELL::CELL_TYPE_BOOLEAN
29
+ CELL_TYPE_ERROR = CELL::CELL_TYPE_ERROR
30
+ CELL_TYPE_FORMULA = CELL::CELL_TYPE_FORMULA
31
+ CELL_TYPE_NUMERIC = CELL::CELL_TYPE_NUMERIC
32
+ CELL_TYPE_STRING = CELL::CELL_TYPE_STRING
33
+
25
34
  def initialize(cell)
26
35
  @cell = cell
27
36
  end
37
+
38
+ def value
39
+ value_of(cell_value_for_type(@cell.getCellType))
40
+ end
41
+
42
+ def comment
43
+ @cell.getCellComment
44
+ end
28
45
 
29
46
  def index
30
47
  @cell.getColumnIndex
31
48
  end
32
49
 
33
- def to_s
34
- @cell.getStringCellValue
50
+ def to_s(evaluate_formulas=true)
51
+ if @cell.getCellType == CELL_TYPE_FORMULA
52
+ evaluate_formulas ? value.to_s : @cell.getCellFormula
53
+ else
54
+ value.to_s
55
+ end
35
56
  end
36
57
 
37
58
  def poi_cell
38
59
  @cell
39
60
  end
61
+
62
+ private
63
+ def value_of(cell_value)
64
+ case cell_value.getCellType
65
+ when CELL_TYPE_BLANK: nil
66
+ when CELL_TYPE_BOOLEAN: cell_value.getBooleanValue
67
+ when CELL_TYPE_ERROR: Java::org.apache.poi.hssf.record.formula.eval.ErrorEval.getText(cell_value.getErrorValue)
68
+ when CELL_TYPE_NUMERIC
69
+ if Java::org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted @cell
70
+ Date.parse(Java::org.apache.poi.ss.usermodel.DateUtil.getJavaDate(cell_value.getNumberValue).to_s)
71
+ else
72
+ cell_value.getNumberValue
73
+ end
74
+ when CELL_TYPE_STRING: cell_value.getStringValue
75
+ else
76
+ raise "unhandled cell type[#{@cell.getCellType}]"
77
+ end
78
+ end
79
+
80
+ def cell_value_for_type(cell_type)
81
+ case cell_type
82
+ when CELL_TYPE_BLANK: nil
83
+ when CELL_TYPE_BOOLEAN: CELL_VALUE.valueOf(@cell.getBooleanCellValue)
84
+ when CELL_TYPE_FORMULA
85
+ formula_evaluator = Java::org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator.new @cell.sheet.workbook
86
+ formula_evaluator.evaluate @cell
87
+ when CELL_TYPE_STRING: CELL_VALUE.new(@cell.getStringCellValue)
88
+ when CELL_TYPE_ERROR, CELL_TYPE_NUMERIC: CELL_VALUE.new(@cell.getNumericCellValue)
89
+ else
90
+ raise "unhandled cell type[#{@cell.getCellType}]"
91
+ end
92
+ end
40
93
  end
41
94
  end
42
95
 
@@ -25,6 +25,10 @@ module POI
25
25
  def initialize(row)
26
26
  @row = row
27
27
  end
28
+
29
+ def [](index)
30
+ Cell.new(@row.getCell(index))
31
+ end
28
32
 
29
33
  def cells
30
34
  Cells.new(self)
@@ -1,24 +1,35 @@
1
+ require 'tmpdir'
2
+ require 'stringio'
3
+
1
4
  module POI
2
5
  class Workbook
3
- def self.open(filename)
4
- raise Exception, "FileNotFound" unless File.exists? filename
5
- instance = self.new(filename)
6
-
6
+ def self.open(filename_or_stream)
7
+ name, stream = if filename_or_stream.kind_of?(java.io.InputStream)
8
+ [File.join(Dir.tmpdir, "spreadsheet.xlsx"), filename_or_stream]
9
+ elsif filename_or_stream.kind_of?(IO) || StringIO === filename_or_stream || filename_or_stream.respond_to?(:read)
10
+ # NOTE: the String.unpack here can be very inefficient
11
+ [File.join(Dir.tmpdir, "spreadsheet.xlsx"), java.io.ByteArrayInputStream.new(filename_or_stream.read.unpack('c*').to_java(:byte))]
12
+ else
13
+ raise Exception, "FileNotFound" unless File.exists?( filename_or_stream )
14
+ [filename_or_stream, java.io.FileInputStream.new(filename_or_stream)]
15
+ end
16
+ instance = self.new(name, stream)
7
17
  if block_given?
8
18
  result = yield instance
9
19
  return result
10
20
  end
11
-
12
21
  instance
13
22
  end
23
+
24
+ attr_reader :filename
14
25
 
15
- def initialize(filename)
26
+ def initialize(filename, io_stream)
16
27
  @filename = filename
17
- @workbook = org.apache.poi.ss.usermodel.WorkbookFactory.create(java.io.FileInputStream.new(filename))
28
+ @workbook = org.apache.poi.ss.usermodel.WorkbookFactory.create(io_stream)
18
29
  end
19
30
 
20
31
  def save
21
- @workbook.write(java.io.FileOutputStream.new(@filename))
32
+ save_as(@filename)
22
33
  end
23
34
 
24
35
  def save_as(filename)
data/spec_debug.sh ADDED
@@ -0,0 +1,21 @@
1
+ #!/bin/sh
2
+ #set -x
3
+ RUBY_DIR=$(dirname $(which ruby))/..
4
+ RUBYGEMS_DIR=${RUBY_DIR}/lib/ruby/gems/1.8/gems
5
+
6
+ GEM_COLUMNIZE=$(ls -1d $RUBYGEMS_DIR/columnize*/lib | head -1 | /usr/bin/ruby -e 'print File.expand_path($stdin.read)')
7
+ GEM_RUBY_DEBUG_BASE=$(ls -1d $RUBYGEMS_DIR/ruby-debug-base-*/lib | head -1 | /usr/bin/ruby -e 'print File.expand_path($stdin.read)')
8
+ GEM_RUBY_DEBUG_CLI=$(ls -1d $RUBYGEMS_DIR/ruby-debug-*/cli | head -1 | /usr/bin/ruby -e 'print File.expand_path($stdin.read)')
9
+ GEM_SOURCES=$(ls -1d $RUBYGEMS_DIR/sources-*/lib | head -1 | /usr/bin/ruby -e 'print File.expand_path($stdin.read)')
10
+
11
+ runner="ruby --client \
12
+ -I${GEM_COLUMNIZE} \
13
+ -I${GEM_RUBY_DEBUG_BASE} \
14
+ -I${GEM_RUBY_DEBUG_CLI} \
15
+ -I${GEM_SOURCES} \
16
+ -rubygems -S"
17
+
18
+ cmd="spec -c --debugger $*"
19
+ #cmd="irb"
20
+
21
+ $runner $cmd
Binary file
data/specs/spec_helper.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'poi'))
2
+ Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
2
3
 
3
4
  class TestDataFile
4
5
  def self.expand_path(name)
@@ -0,0 +1,17 @@
1
+ Spec::Matchers.define :equal_at_cell do |expected, row, col|
2
+ match do |actual|
3
+ actual == expected
4
+ end
5
+
6
+ failure_message_for_should do |actual|
7
+ "expected #{actual} to equal #{expected} (row:#{row}, cell:#{col})"
8
+ end
9
+
10
+ failure_message_for_should_not do |actual|
11
+ "expected #{actual} not to equal #{expected} (row:#{row}, cell:#{col})"
12
+ end
13
+
14
+ description do
15
+ "to equal #{expected}"
16
+ end
17
+ end
@@ -1,35 +1,52 @@
1
1
  require File.join(File.dirname(__FILE__), 'spec_helper')
2
+ require 'date'
3
+ require 'stringio'
2
4
 
3
5
  describe POI::Workbook do
4
6
  it "should open a workbook and allow access to its worksheets" do
5
- name = TestDataFile.expand_path("simple_with_picture.xlsx")
7
+ name = TestDataFile.expand_path("various_samples.xlsx")
6
8
  book = POI::Workbook.open(name)
9
+ book.worksheets.size.should == 4
10
+ book.filename.should == name
11
+ end
12
+
13
+ it "should be able to create a Workbook from an IO object" do
14
+ content = StringIO.new(open(TestDataFile.expand_path("various_samples.xlsx"), 'rb'){|f| f.read})
15
+ book = POI::Workbook.open(content)
16
+ book.worksheets.size.should == 4
17
+ book.filename.should =~ /spreadsheet.xlsx$/
18
+ end
7
19
 
8
- book.worksheets.size.should == 3
20
+ it "should be able to create a Workbook from a Java input stream" do
21
+ content = java.io.FileInputStream.new(TestDataFile.expand_path("various_samples.xlsx"))
22
+ book = POI::Workbook.open(content)
23
+ book.worksheets.size.should == 4
24
+ book.filename.should =~ /spreadsheet.xlsx$/
9
25
  end
10
26
  end
11
27
 
12
28
  describe POI::Worksheets do
13
29
  it "should allow indexing worksheets by ordinal" do
14
- name = TestDataFile.expand_path("simple_with_picture.xlsx")
30
+ name = TestDataFile.expand_path("various_samples.xlsx")
15
31
  book = POI::Workbook.open(name)
16
32
 
17
- book.worksheets[0].name.should == "Sheet1"
18
- book.worksheets[1].name.should == "Sheet2"
19
- book.worksheets[2].name.should == "Sheet3"
33
+ book.worksheets[0].name.should == "text & pic"
34
+ book.worksheets[1].name.should == "numbers"
35
+ book.worksheets[2].name.should == "dates"
36
+ book.worksheets[3].name.should == "bools & errors"
20
37
  end
21
38
 
22
39
  it "should allow indexing worksheets by name" do
23
- name = TestDataFile.expand_path("simple_with_picture.xlsx")
40
+ name = TestDataFile.expand_path("various_samples.xlsx")
24
41
  book = POI::Workbook.open(name)
25
42
 
26
- book.worksheets["Sheet1"].name.should == "Sheet1"
27
- book.worksheets["Sheet2"].name.should == "Sheet2"
28
- book.worksheets["Sheet3"].name.should == "Sheet3"
43
+ book.worksheets["text & pic"].name.should == "text & pic"
44
+ book.worksheets["numbers"].name.should == "numbers"
45
+ book.worksheets["dates"].name.should == "dates"
29
46
  end
30
47
 
31
48
  it "should be enumerable" do
32
- name = TestDataFile.expand_path("simple_with_picture.xlsx")
49
+ name = TestDataFile.expand_path("various_samples.xlsx")
33
50
  book = POI::Workbook.open(name)
34
51
  book.worksheets.should be_kind_of Enumerable
35
52
 
@@ -37,32 +54,43 @@ describe POI::Worksheets do
37
54
  sheet.should be_kind_of POI::Worksheet
38
55
  end
39
56
 
40
- book.worksheets.size.should == 3
41
- book.worksheets.collect.size.should == 3
57
+ book.worksheets.size.should == 4
58
+ book.worksheets.collect.size.should == 4
42
59
  end
43
60
  end
44
61
 
45
62
  describe POI::Rows do
46
63
  it "should be enumerable" do
47
- name = TestDataFile.expand_path("simple_with_picture.xlsx")
64
+ name = TestDataFile.expand_path("various_samples.xlsx")
48
65
  book = POI::Workbook.open(name)
49
- sheet = book.worksheets["Sheet1"]
66
+ sheet = book.worksheets["text & pic"]
50
67
  sheet.rows.should be_kind_of Enumerable
51
68
 
52
69
  sheet.rows.each do |row|
53
70
  row.should be_kind_of POI::Row
54
71
  end
55
72
 
56
- sheet.rows.size.should == 6
57
- sheet.rows.collect.size.should == 6
73
+ sheet.rows.size.should == 7
74
+ sheet.rows.collect.size.should == 7
58
75
  end
59
76
  end
60
77
 
61
78
  describe POI::Cells do
79
+ before :each do
80
+ @name = TestDataFile.expand_path("various_samples.xlsx")
81
+ @book = POI::Workbook.open(@name)
82
+ end
83
+
84
+ def book
85
+ @book
86
+ end
87
+
88
+ def name
89
+ @name
90
+ end
91
+
62
92
  it "should be enumerable" do
63
- name = TestDataFile.expand_path("simple_with_picture.xlsx")
64
- book = POI::Workbook.open(name)
65
- sheet = book.worksheets["Sheet1"]
93
+ sheet = book.worksheets["text & pic"]
66
94
  rows = sheet.rows
67
95
  cells = rows[0].cells
68
96
 
@@ -71,18 +99,125 @@ describe POI::Cells do
71
99
  cells.collect.size.should == 1
72
100
  end
73
101
 
102
+ it "should provide dates for date cells" do
103
+ sheet = book.worksheets["dates"]
104
+ rows = sheet.rows
105
+
106
+ dates_by_column = [
107
+ (Date.parse('2010-02-28')..Date.parse('2010-03-14')),
108
+ (Date.parse('2010-03-14')..Date.parse('2010-03-28')),
109
+ (Date.parse('2010-03-28')..Date.parse('2010-04-11'))]
110
+ (0..2).each do |col|
111
+ dates_by_column[col].each_with_index do |date, index|
112
+ row = index + 1
113
+ rows[row][col].value.should equal_at_cell(date, row, col)
114
+ end
115
+ end
116
+ end
117
+
118
+ it "should provide numbers for numeric cells" do
119
+ sheet = book.worksheets["numbers"]
120
+ rows = sheet.rows
121
+
122
+ (1..15).each do |number|
123
+ row = number
124
+ rows[row][0].value.should equal_at_cell(number, row, 0)
125
+ rows[row][1].value.should equal_at_cell(number ** 2, row, 1)
126
+ rows[row][2].value.should equal_at_cell(number ** 3, row, 2)
127
+ rows[row][3].value.should equal_at_cell(Math.sqrt(number), row, 3)
128
+ end
129
+
130
+ rows[9][0].to_s.should == '9.0'
131
+ rows[9][1].to_s.should == '81.0'
132
+ rows[9][2].to_s.should == '729.0'
133
+ rows[9][3].to_s.should == '3.0'
134
+ end
135
+
136
+ it "should provide error text for error cells" do
137
+ sheet = book.worksheets["bools & errors"]
138
+ rows = sheet.rows
139
+
140
+ rows[6][0].value.should == '~CIRCULAR~REF~'
141
+ rows[7][0].value.should == '#DIV/0!'
142
+ rows[8][0].value.should == '#N/A'
143
+ rows[9][0].value.should == '#NAME?'
144
+ rows[10][0].value.should == '#NULL!'
145
+ rows[11][0].value.should == '#NUM!'
146
+ rows[12][0].value.should == '#REF!'
147
+ rows[13][0].value.should == '#VALUE!'
148
+ lambda{ rows[14][0].value }.should raise_error(Java::java.lang.RuntimeException)
149
+
150
+ rows[6][0].to_s.should == '~CIRCULAR~REF~'
151
+ rows[7][0].to_s.should == '#DIV/0!'
152
+ rows[8][0].to_s.should == '#N/A'
153
+ rows[9][0].to_s.should == '#NAME?'
154
+ rows[10][0].to_s.should == '#NULL!'
155
+ rows[11][0].to_s.should == '#NUM!'
156
+ rows[12][0].to_s.should == '#REF!'
157
+ rows[13][0].to_s.should == '#VALUE!'
158
+ lambda{ rows[14][0].to_s }.should raise_error(Java::java.lang.RuntimeException)
159
+ end
160
+
161
+ it "should provide booleans for boolean cells" do
162
+ sheet = book.worksheets["bools & errors"]
163
+ rows = sheet.rows
164
+ rows[1][0].value.should == false
165
+ rows[1][0].to_s.should == 'false'
166
+
167
+ rows[1][1].value.should == false
168
+ rows[1][1].to_s.should == 'false'
169
+
170
+ rows[2][0].value.should == true
171
+ rows[2][0].to_s.should == 'true'
172
+
173
+ rows[2][1].value.should == true
174
+ rows[2][1].to_s.should == 'true'
175
+ end
176
+
74
177
  it "should provide the cell value as a string" do
75
- name = TestDataFile.expand_path("simple_with_picture.xlsx")
76
- book = POI::Workbook.open(name)
77
- sheet = book.worksheets["Sheet1"]
178
+ sheet = book.worksheets["text & pic"]
179
+ rows = sheet.rows
180
+
181
+ rows[0][0].value.should == "This"
182
+ rows[1][0].value.should == "is"
183
+ rows[2][0].value.should == "an"
184
+ rows[3][0].value.should == "Excel"
185
+ rows[4][0].value.should == "XLSX"
186
+ rows[5][0].value.should == "workbook"
187
+ rows[9][0].value.should == 'This is an Excel XLSX workbook.'
188
+
189
+
190
+ rows[0][0].to_s.should == "This"
191
+ rows[1][0].to_s.should == "is"
192
+ rows[2][0].to_s.should == "an"
193
+ rows[3][0].to_s.should == "Excel"
194
+ rows[4][0].to_s.should == "XLSX"
195
+ rows[5][0].to_s.should == "workbook"
196
+ rows[9][0].to_s.should == 'This is an Excel XLSX workbook.'
197
+ end
198
+
199
+ it "should provide formulas instead of string-ified values" do
200
+ sheet = book.worksheets["numbers"]
78
201
  rows = sheet.rows
79
202
 
80
- rows[0].cells[0].to_s.should == "This"
81
- rows[1].cells[0].to_s.should == "is"
82
- rows[2].cells[0].to_s.should == "an"
83
- rows[3].cells[0].to_s.should == "Excel"
84
- rows[4].cells[0].to_s.should == "XLSX"
85
- rows[5].cells[0].to_s.should == "workbook"
203
+ (1..15).each do |number|
204
+ row = number
205
+ rows[row][0].to_s(false).should == "#{number}.0"
206
+ rows[row][1].to_s(false).should == "A#{row + 1}*A#{row + 1}"
207
+ rows[row][2].to_s(false).should == "B#{row + 1}*A#{row + 1}"
208
+ rows[row][3].to_s(false).should == "SQRT(A#{row + 1})"
209
+ end
210
+
211
+ sheet = book.worksheets["bools & errors"]
212
+ rows = sheet.rows
213
+ rows[1][0].to_s(false).should == '1=2'
214
+ rows[1][1].to_s(false).should == 'FALSE'
215
+ rows[2][0].to_s(false).should == '1=1'
216
+ rows[2][1].to_s(false).should == 'TRUE'
217
+ rows[14][0].to_s(false).should == 'foobar(1)'
218
+
219
+ sheet = book.worksheets["text & pic"]
220
+ sheet.rows[9][0].to_s(false).should == 'CONCATENATE(A1," ", A2," ", A3," ", A4," ", A5," ", A6,".")'
86
221
  end
87
222
  end
88
223
 
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
7
+ - 4
8
8
  - 0
9
- version: 0.1.0
9
+ version: 0.4.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Scott Deming
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-07-27 00:00:00 -04:00
17
+ date: 2010-08-27 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -34,6 +34,7 @@ files:
34
34
  - README.markdown
35
35
  - Rakefile
36
36
  - VERSION
37
+ - jruby-poi.gemspec
37
38
  - lib/ooxml-lib/dom4j-1.6.1.jar
38
39
  - lib/ooxml-lib/geronimo-stax-api_1.0_spec-1.0.jar
39
40
  - lib/ooxml-lib/xmlbeans-2.3.0.jar
@@ -49,11 +50,13 @@ files:
49
50
  - lib/poi/workbook/row.rb
50
51
  - lib/poi/workbook/workbook.rb
51
52
  - lib/poi/workbook/worksheet.rb
53
+ - spec_debug.sh
52
54
  - specs/data/simple_with_picture.ods
53
55
  - specs/data/simple_with_picture.xls
54
- - specs/data/simple_with_picture.xlsx
56
+ - specs/data/various_samples.xlsx
55
57
  - specs/io_spec.rb
56
58
  - specs/spec_helper.rb
59
+ - specs/support/matchers/cell_matcher.rb
57
60
  - specs/workbook_spec.rb
58
61
  has_rdoc: true
59
62
  homepage: http://github.com/sdeming/jruby-poi
Binary file