nurettin-jruby-poi 0.8.2
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/.travis.yml +2 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +29 -0
- data/LICENSE +507 -0
- data/NOTICE +21 -0
- data/README.markdown +87 -0
- data/Rakefile +35 -0
- data/VERSION +1 -0
- data/bin/autospec +16 -0
- data/bin/htmldiff +16 -0
- data/bin/ldiff +16 -0
- data/bin/rdebug +16 -0
- data/bin/rspec +16 -0
- data/jruby-poi.gemspec +90 -0
- data/lib/ooxml-lib/dom4j-1.6.1.jar +0 -0
- data/lib/ooxml-lib/geronimo-stax-api_1.0_spec-1.0.jar +0 -0
- data/lib/ooxml-lib/xmlbeans-2.3.0.jar +0 -0
- data/lib/poi/workbook/area.rb +81 -0
- data/lib/poi/workbook/cell.rb +175 -0
- data/lib/poi/workbook/named_range.rb +30 -0
- data/lib/poi/workbook/row.rb +58 -0
- data/lib/poi/workbook/workbook.rb +262 -0
- data/lib/poi/workbook/worksheet.rb +78 -0
- data/lib/poi/workbook.rb +41 -0
- data/lib/poi-3.7-20101029.jar +0 -0
- data/lib/poi-examples-3.7-20101029.jar +0 -0
- data/lib/poi-ooxml-3.7-20101029.jar +0 -0
- data/lib/poi-ooxml-schemas-3.7-20101029.jar +0 -0
- data/lib/poi-scratchpad-3.7-20101029.jar +0 -0
- data/lib/poi.rb +15 -0
- data/spec/data/simple_with_picture.ods +0 -0
- data/spec/data/simple_with_picture.xls +0 -0
- data/spec/data/spreadsheet.ods +0 -0
- data/spec/data/timesheet.xlsx +0 -0
- data/spec/data/various_samples.xlsx +0 -0
- data/spec/facade_spec.rb +48 -0
- data/spec/io_spec.rb +69 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/java/jrubypoi/MockOutputStream.java +24 -0
- data/spec/support/java/support.jar +0 -0
- data/spec/support/matchers/cell_matcher.rb +17 -0
- data/spec/workbook_spec.rb +370 -0
- data/spec/writing_spec.rb +146 -0
- data/spec_debug.sh +32 -0
- metadata +135 -0
data/Rakefile
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
require 'bundler'
|
4
|
+
begin
|
5
|
+
Bundler.setup(:default, :development)
|
6
|
+
rescue Bundler::BundlerError => e
|
7
|
+
$stderr.puts e.message
|
8
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
9
|
+
exit e.status_code
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'rake'
|
13
|
+
require 'jeweler'
|
14
|
+
require 'rspec/core'
|
15
|
+
require 'rspec/core/rake_task'
|
16
|
+
|
17
|
+
# gemify
|
18
|
+
Jeweler::Tasks.new do |gemspec|
|
19
|
+
gemspec.name = "jruby-poi"
|
20
|
+
gemspec.summary = "Apache POI class library for jruby"
|
21
|
+
gemspec.description = "A rubyesque library for manipulating spreadsheets and other document types for jruby, using Apache POI."
|
22
|
+
gemspec.license = "Apache"
|
23
|
+
gemspec.email = ["sdeming@makefile.com", "jacaetevha@gmail.com"]
|
24
|
+
gemspec.homepage = "http://github.com/kameeoze/jruby-poi"
|
25
|
+
gemspec.authors = ["Scott Deming", "Jason Rogers"]
|
26
|
+
end
|
27
|
+
Jeweler::RubygemsDotOrgTasks.new
|
28
|
+
|
29
|
+
# test
|
30
|
+
RSpec::Core::RakeTask.new(:spec)
|
31
|
+
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
32
|
+
spec.rcov = true
|
33
|
+
end
|
34
|
+
|
35
|
+
task :default => :spec
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.8.2
|
data/bin/autospec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env jruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'autospec' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rspec-core', 'autospec')
|
data/bin/htmldiff
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env jruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'htmldiff' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('diff-lcs', 'htmldiff')
|
data/bin/ldiff
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env jruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'ldiff' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('diff-lcs', 'ldiff')
|
data/bin/rdebug
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env jruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rdebug' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('ruby-debug', 'rdebug')
|
data/bin/rspec
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env jruby
|
2
|
+
#
|
3
|
+
# This file was generated by Bundler.
|
4
|
+
#
|
5
|
+
# The application 'rspec' is installed as part of a gem, and
|
6
|
+
# this file is here to facilitate running it.
|
7
|
+
#
|
8
|
+
|
9
|
+
require 'pathname'
|
10
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
|
11
|
+
Pathname.new(__FILE__).realpath)
|
12
|
+
|
13
|
+
require 'rubygems'
|
14
|
+
require 'bundler/setup'
|
15
|
+
|
16
|
+
load Gem.bin_path('rspec-core', 'rspec')
|
data/jruby-poi.gemspec
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{nurettin-jruby-poi}
|
8
|
+
s.version = "0.8.2"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Scott Deming", "Jason Rogers", "Nurettin Onur TUĞCU"]
|
12
|
+
s.date = %q{2012-04-19}
|
13
|
+
s.description = %q{A rubyesque library for manipulating spreadsheets and other document types for jruby, using Apache POI.}
|
14
|
+
s.email = ["sdeming@makefile.com", "jacaetevha@gmail.com", "onur.tugcu@gmail.com"]
|
15
|
+
s.executables = ["autospec", "htmldiff", "ldiff", "rdebug", "rspec"]
|
16
|
+
s.extra_rdoc_files = [
|
17
|
+
"LICENSE",
|
18
|
+
"README.markdown"
|
19
|
+
]
|
20
|
+
s.files = [
|
21
|
+
".travis.yml",
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE",
|
25
|
+
"NOTICE",
|
26
|
+
"README.markdown",
|
27
|
+
"Rakefile",
|
28
|
+
"VERSION",
|
29
|
+
"bin/autospec",
|
30
|
+
"bin/htmldiff",
|
31
|
+
"bin/ldiff",
|
32
|
+
"bin/rdebug",
|
33
|
+
"bin/rspec",
|
34
|
+
"jruby-poi.gemspec",
|
35
|
+
"lib/ooxml-lib/dom4j-1.6.1.jar",
|
36
|
+
"lib/ooxml-lib/geronimo-stax-api_1.0_spec-1.0.jar",
|
37
|
+
"lib/ooxml-lib/xmlbeans-2.3.0.jar",
|
38
|
+
"lib/poi-3.7-20101029.jar",
|
39
|
+
"lib/poi-examples-3.7-20101029.jar",
|
40
|
+
"lib/poi-ooxml-3.7-20101029.jar",
|
41
|
+
"lib/poi-ooxml-schemas-3.7-20101029.jar",
|
42
|
+
"lib/poi-scratchpad-3.7-20101029.jar",
|
43
|
+
"lib/poi.rb",
|
44
|
+
"lib/poi/workbook.rb",
|
45
|
+
"lib/poi/workbook/area.rb",
|
46
|
+
"lib/poi/workbook/cell.rb",
|
47
|
+
"lib/poi/workbook/named_range.rb",
|
48
|
+
"lib/poi/workbook/row.rb",
|
49
|
+
"lib/poi/workbook/workbook.rb",
|
50
|
+
"lib/poi/workbook/worksheet.rb",
|
51
|
+
"spec/data/simple_with_picture.ods",
|
52
|
+
"spec/data/simple_with_picture.xls",
|
53
|
+
"spec/data/spreadsheet.ods",
|
54
|
+
"spec/data/timesheet.xlsx",
|
55
|
+
"spec/data/various_samples.xlsx",
|
56
|
+
"spec/facade_spec.rb",
|
57
|
+
"spec/io_spec.rb",
|
58
|
+
"spec/spec_helper.rb",
|
59
|
+
"spec/support/java/jrubypoi/MockOutputStream.java",
|
60
|
+
"spec/support/java/support.jar",
|
61
|
+
"spec/support/matchers/cell_matcher.rb",
|
62
|
+
"spec/workbook_spec.rb",
|
63
|
+
"spec/writing_spec.rb",
|
64
|
+
"spec_debug.sh"
|
65
|
+
]
|
66
|
+
s.homepage = %q{http://github.com/nurettin/jruby-poi}
|
67
|
+
s.licenses = ["Apache"]
|
68
|
+
s.require_paths = ["lib"]
|
69
|
+
s.rubygems_version = %q{1.5.1}
|
70
|
+
s.summary = %q{Apache POI class library for jruby}
|
71
|
+
|
72
|
+
if s.respond_to? :specification_version then
|
73
|
+
s.specification_version = 3
|
74
|
+
|
75
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
76
|
+
s.add_development_dependency(%q<rspec>, [">= 2.5.0"])
|
77
|
+
s.add_development_dependency(%q<jeweler>, [">= 1.6.0"])
|
78
|
+
s.add_development_dependency(%q<rcov>, [">= 0"])
|
79
|
+
else
|
80
|
+
s.add_dependency(%q<rspec>, [">= 2.5.0"])
|
81
|
+
s.add_dependency(%q<jeweler>, [">= 1.6.0"])
|
82
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
83
|
+
end
|
84
|
+
else
|
85
|
+
s.add_dependency(%q<rspec>, [">= 2.5.0"])
|
86
|
+
s.add_dependency(%q<jeweler>, [">= 1.6.0"])
|
87
|
+
s.add_dependency(%q<rcov>, [">= 0"])
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module POI
|
2
|
+
class Area
|
3
|
+
def initialize reference
|
4
|
+
@ref = reference
|
5
|
+
end
|
6
|
+
|
7
|
+
def in workbook
|
8
|
+
if single_cell_reference?
|
9
|
+
ref = area.all_referenced_cells.first
|
10
|
+
return [workbook.single_cell, ref]
|
11
|
+
end
|
12
|
+
|
13
|
+
begin
|
14
|
+
by_column = {}
|
15
|
+
# refs = area.all_referenced_cells
|
16
|
+
# slices = refs.enum_slice(refs.length/15)
|
17
|
+
# slices.collect do |cell_refs|
|
18
|
+
# Thread.start do
|
19
|
+
# cell_refs.each do |cell_ref|
|
20
|
+
# first = workbook.worksheets[cell_ref.sheet_name].first_row
|
21
|
+
# last = workbook.worksheets[cell_ref.sheet_name].last_row
|
22
|
+
# next unless cell_ref.row >= first && cell_ref.row <= last
|
23
|
+
#
|
24
|
+
# # ref = POI::CELL_REF.new(c.format_as_string)
|
25
|
+
# cell = workbook.single_cell cell_ref
|
26
|
+
# (by_column[cell_ref.cell_ref_parts.collect.last] ||= []) << cell
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
# end.each {|t| t.join}
|
30
|
+
|
31
|
+
area.all_referenced_cells.each do |cell_ref|
|
32
|
+
first = workbook.worksheets[cell_ref.sheet_name].first_row
|
33
|
+
last = workbook.worksheets[cell_ref.sheet_name].last_row
|
34
|
+
next unless cell_ref.row >= first && cell_ref.row <= last
|
35
|
+
|
36
|
+
# ref = POI::CELL_REF.new(c.format_as_string)
|
37
|
+
cell = workbook.single_cell cell_ref
|
38
|
+
(by_column[cell_ref.cell_ref_parts.collect.last] ||= []) << cell
|
39
|
+
end
|
40
|
+
|
41
|
+
by_column.each do |key, cells|
|
42
|
+
by_column[key] = cells.compact
|
43
|
+
end
|
44
|
+
|
45
|
+
if by_column.length == 1
|
46
|
+
by_column.values.flatten
|
47
|
+
else
|
48
|
+
by_column
|
49
|
+
end
|
50
|
+
rescue
|
51
|
+
[]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def single_cell_reference?
|
56
|
+
area.single_cell? #@ref == getFirstCell.formatAsString rescue false
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
def area
|
61
|
+
@area ||= new_area_reference
|
62
|
+
end
|
63
|
+
|
64
|
+
def new_area_reference
|
65
|
+
begin
|
66
|
+
return POI::AREA_REF.new(@ref)
|
67
|
+
rescue
|
68
|
+
# not a valid reference, so proceed through to see if it's a column-based reference
|
69
|
+
end
|
70
|
+
sheet_parts = @ref.split('!')
|
71
|
+
area_parts = sheet_parts.last.split(':')
|
72
|
+
area_start = "#{sheet_parts.first}!#{area_parts.first}"
|
73
|
+
area_end = area_parts.last
|
74
|
+
begin
|
75
|
+
POI::AREA_REF.getWholeColumn(area_start, area_end)
|
76
|
+
rescue
|
77
|
+
raise "could not determine area reference for #{@ref}: #{$!.message}"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,175 @@
|
|
1
|
+
module POI
|
2
|
+
class Cells
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize(row)
|
6
|
+
@row = row
|
7
|
+
@poi_row = row.poi_row
|
8
|
+
@cells = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def [](index)
|
12
|
+
@cells[index] ||= Cell.new(@poi_row.cell(index) || @poi_row.create_cell(index), @row)
|
13
|
+
end
|
14
|
+
|
15
|
+
def size
|
16
|
+
@poi_row.physical_number_of_cells
|
17
|
+
end
|
18
|
+
|
19
|
+
def each
|
20
|
+
it = @poi_row.cell_iterator
|
21
|
+
yield Cell.new(it.next, @row) while it.has_next
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class Cell < Facade(:poi_cell, org.apache.poi.ss.usermodel.Cell)
|
26
|
+
DATE_UTIL = Java::org.apache.poi.ss.usermodel.DateUtil
|
27
|
+
CELL = Java::org.apache.poi.ss.usermodel.Cell
|
28
|
+
CELL_VALUE = Java::org.apache.poi.ss.usermodel.CellValue
|
29
|
+
CELL_TYPE_BLANK = CELL::CELL_TYPE_BLANK
|
30
|
+
CELL_TYPE_BOOLEAN = CELL::CELL_TYPE_BOOLEAN
|
31
|
+
CELL_TYPE_ERROR = CELL::CELL_TYPE_ERROR
|
32
|
+
CELL_TYPE_FORMULA = CELL::CELL_TYPE_FORMULA
|
33
|
+
CELL_TYPE_NUMERIC = CELL::CELL_TYPE_NUMERIC
|
34
|
+
CELL_TYPE_STRING = CELL::CELL_TYPE_STRING
|
35
|
+
|
36
|
+
def initialize(cell, row)
|
37
|
+
@cell = cell
|
38
|
+
@row = row
|
39
|
+
end
|
40
|
+
|
41
|
+
def <=> other
|
42
|
+
return 1 if other.nil?
|
43
|
+
return self.index <=> other.index
|
44
|
+
end
|
45
|
+
|
46
|
+
# This is NOT an inexpensive operation. The purpose of this method is merely to get more information
|
47
|
+
# out of cell when one thinks the value returned is incorrect. It may have more value in development
|
48
|
+
# than in production.
|
49
|
+
def error_value
|
50
|
+
if poi_cell.cell_type == CELL_TYPE_ERROR
|
51
|
+
error_value_from(poi_cell.error_cell_value)
|
52
|
+
elsif poi_cell.cell_type == CELL_TYPE_FORMULA &&
|
53
|
+
poi_cell.cached_formula_result_type == CELL_TYPE_ERROR
|
54
|
+
|
55
|
+
# breaks Law of Demeter by reaching into the Row's Worksheet, but it makes sense to do in this case
|
56
|
+
value_of(@row.worksheet.workbook.formula_evaluator.evaluate(poi_cell))
|
57
|
+
else
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# returns the formula for this Cell if it has one, otherwise nil
|
63
|
+
def formula_value
|
64
|
+
poi_cell.cell_type == CELL_TYPE_FORMULA ? poi_cell.cell_formula : nil
|
65
|
+
end
|
66
|
+
|
67
|
+
def value
|
68
|
+
return nil if poi_cell.nil?
|
69
|
+
value_of(cell_value_for_type(poi_cell.cell_type))
|
70
|
+
end
|
71
|
+
|
72
|
+
def formula= new_value
|
73
|
+
poi_cell.cell_formula = new_value
|
74
|
+
@row.worksheet.workbook.on_formula_update self
|
75
|
+
self
|
76
|
+
end
|
77
|
+
|
78
|
+
def formula
|
79
|
+
poi_cell.cell_formula
|
80
|
+
end
|
81
|
+
|
82
|
+
def value= new_value
|
83
|
+
set_cell_value new_value
|
84
|
+
if new_value.nil?
|
85
|
+
@row.worksheet.workbook.on_delete self
|
86
|
+
else
|
87
|
+
@row.worksheet.workbook.on_update self
|
88
|
+
end
|
89
|
+
self
|
90
|
+
end
|
91
|
+
|
92
|
+
def comment
|
93
|
+
poi_cell.cell_comment
|
94
|
+
end
|
95
|
+
|
96
|
+
def index
|
97
|
+
poi_cell.column_index
|
98
|
+
end
|
99
|
+
|
100
|
+
# Get the String representation of this Cell's value.
|
101
|
+
#
|
102
|
+
# If this Cell is a formula you can pass a false to this method and
|
103
|
+
# get the formula instead of the String representation.
|
104
|
+
def to_s(evaluate_formulas=true)
|
105
|
+
return '' if poi_cell.nil?
|
106
|
+
|
107
|
+
if poi_cell.cell_type == CELL_TYPE_FORMULA && evaluate_formulas == false
|
108
|
+
formula_value
|
109
|
+
else
|
110
|
+
value.to_s
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# returns the underlying org.apache.poi.ss.usermodel.Cell
|
115
|
+
def poi_cell
|
116
|
+
@cell
|
117
|
+
end
|
118
|
+
|
119
|
+
# :cell_style= comes from the Façade superclass
|
120
|
+
alias :style= :cell_style=
|
121
|
+
|
122
|
+
def style! options
|
123
|
+
self.style = @row.worksheet.workbook.create_style(options)
|
124
|
+
end
|
125
|
+
|
126
|
+
private
|
127
|
+
def value_of(cell_value)
|
128
|
+
return nil if cell_value.nil?
|
129
|
+
|
130
|
+
case cell_value.cell_type
|
131
|
+
when CELL_TYPE_BLANK then nil
|
132
|
+
when CELL_TYPE_BOOLEAN then cell_value.boolean_value
|
133
|
+
when CELL_TYPE_ERROR then error_value_from(cell_value.error_value)
|
134
|
+
when CELL_TYPE_NUMERIC then numeric_value_from(cell_value)
|
135
|
+
when CELL_TYPE_STRING then cell_value.string_value
|
136
|
+
else
|
137
|
+
raise "unhandled cell type[#{cell_value.cell_type}]"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def cell_value_for_type(cell_type)
|
142
|
+
return nil if cell_type.nil?
|
143
|
+
begin
|
144
|
+
case cell_type
|
145
|
+
when CELL_TYPE_BLANK then nil
|
146
|
+
when CELL_TYPE_BOOLEAN then CELL_VALUE.value_of(poi_cell.boolean_cell_value)
|
147
|
+
when CELL_TYPE_FORMULA then cell_value_for_type(poi_cell.cached_formula_result_type)
|
148
|
+
when CELL_TYPE_STRING then CELL_VALUE.new(poi_cell.string_cell_value)
|
149
|
+
when CELL_TYPE_ERROR, CELL_TYPE_NUMERIC then CELL_VALUE.new(poi_cell.numeric_cell_value)
|
150
|
+
else
|
151
|
+
raise "unhandled cell type[#{poi_cell.cell_type}]"
|
152
|
+
end
|
153
|
+
rescue
|
154
|
+
nil
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def error_value_from(cell_value)
|
159
|
+
org.apache.poi.ss.usermodel.ErrorConstants.text(cell_value)
|
160
|
+
end
|
161
|
+
|
162
|
+
def formula_evaluator_for(workbook)
|
163
|
+
workbook.creation_helper.create_formula_evaluator
|
164
|
+
end
|
165
|
+
|
166
|
+
def numeric_value_from(cell_value)
|
167
|
+
if DATE_UTIL.cell_date_formatted(poi_cell)
|
168
|
+
Date.parse(DATE_UTIL.get_java_date(cell_value.number_value).to_s)
|
169
|
+
else
|
170
|
+
cell_value.number_value
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module POI
|
2
|
+
class NamedRange
|
3
|
+
|
4
|
+
# takes an instance of org.apache.poi.ss.usermodel.Name, and a POI::Workbook
|
5
|
+
def initialize name, workbook
|
6
|
+
@name = name
|
7
|
+
@workbook = workbook
|
8
|
+
end
|
9
|
+
|
10
|
+
def name
|
11
|
+
@name.name_name
|
12
|
+
end
|
13
|
+
|
14
|
+
def sheet
|
15
|
+
@workbook.worksheets[@name.sheet_name]
|
16
|
+
end
|
17
|
+
|
18
|
+
def formula
|
19
|
+
@name.refers_to_formula
|
20
|
+
end
|
21
|
+
|
22
|
+
def cells
|
23
|
+
@name.is_deleted ? [] : [@workbook.cell(formula)].flatten
|
24
|
+
end
|
25
|
+
|
26
|
+
def values
|
27
|
+
cells.collect{|c| c.value}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module POI
|
2
|
+
class Rows
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize(worksheet)
|
6
|
+
@worksheet = worksheet
|
7
|
+
@poi_worksheet = worksheet.poi_worksheet
|
8
|
+
@rows = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def [](index)
|
12
|
+
@rows[index] ||= Row.new(@poi_worksheet.row(index) || @poi_worksheet.create_row(index), @worksheet)
|
13
|
+
end
|
14
|
+
|
15
|
+
def size
|
16
|
+
@poi_worksheet.physical_number_of_rows
|
17
|
+
end
|
18
|
+
|
19
|
+
def each
|
20
|
+
it = @poi_worksheet.row_iterator
|
21
|
+
yield Row.new(it.next, @worksheet) while it.has_next
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class Row < Facade(:poi_row, org.apache.poi.ss.usermodel.Row)
|
26
|
+
def initialize(row, worksheet)
|
27
|
+
@row = row
|
28
|
+
@worksheet = worksheet
|
29
|
+
end
|
30
|
+
|
31
|
+
def [](index)
|
32
|
+
return nil if poi_row.nil?
|
33
|
+
cells[index]
|
34
|
+
end
|
35
|
+
|
36
|
+
def cells
|
37
|
+
@cells ||= Cells.new(self)
|
38
|
+
end
|
39
|
+
|
40
|
+
def index
|
41
|
+
return nil if poi_row.nil?
|
42
|
+
poi_row.row_num
|
43
|
+
end
|
44
|
+
|
45
|
+
# def height_in_points= num
|
46
|
+
# set_height_in_points num.to_f
|
47
|
+
# end
|
48
|
+
|
49
|
+
def poi_row
|
50
|
+
@row
|
51
|
+
end
|
52
|
+
|
53
|
+
def worksheet
|
54
|
+
@worksheet
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|