oxcelix 0.2.4 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +21 -64
- data/README.rdoc +5 -3
- data/lib/oxcelix/cell.rb +5 -1
- data/lib/oxcelix/cellhelper.rb +4 -2
- data/lib/oxcelix/nf.rb +172 -0
- data/lib/oxcelix/numformats.rb +105 -0
- data/lib/oxcelix/sax/styles.rb +49 -0
- data/lib/oxcelix/sax/xlsheet.rb +3 -2
- data/lib/oxcelix/sheet.rb +10 -0
- data/lib/oxcelix/workbook.rb +20 -4
- data/lib/oxcelix.rb +3 -0
- data/oxcelix.gemspec +8 -4
- metadata +9 -6
- data/lib/lofaszka.rb +0 -6
data/CHANGES
CHANGED
@@ -1,64 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
replaced Ox::load_file with IO.read + Ox::load in workbook, as apparently workbook.xml could not be loaded under windows using that method Mon Oct 7 17:37:39 2013 +0200
|
24
|
-
* Minor typos corrected, added gemspec
|
25
|
-
Sun Oct 6 16:52:54 2013 +0200
|
26
|
-
* oxcelix.rb was not added to previous commit
|
27
|
-
Sun Oct 6 12:29:37 2013 +0200
|
28
|
-
* Broke down oxcelix.rb. Improved YARD documentation.
|
29
|
-
Sun Oct 6 12:25:59 2013 +0200
|
30
|
-
* Removed unneeded method from Xlsheet. Started converting docs to YARD
|
31
|
-
Sat Oct 5 09:20:31 2013 +0200
|
32
|
-
* Merge branch 'master' of https://github.com/gbiczo/oxcelix
|
33
|
-
Wed Oct 2 00:19:54 2013 +0200
|
34
|
-
* Repeating commit as the sheetdata method code was not included. Now it will simply do some Array magic to return the list of active sheets.
|
35
|
-
Wed Oct 2 00:19:18 2013 +0200
|
36
|
-
* Update README.md
|
37
|
-
|
38
|
-
Fixed typos Wed Oct 2 00:08:00 2013 +0200
|
39
|
-
* Merge branch 'master' of https://github.com/gbiczo/oxcelix
|
40
|
-
Tue Oct 1 23:51:13 2013 +0200
|
41
|
-
* Moved source to lib directory.
|
42
|
-
Tue Oct 1 23:43:53 2013 +0200
|
43
|
-
* Added README
|
44
|
-
Tue Oct 1 23:42:27 2013 +0200
|
45
|
-
* Added tests, recreated include-exclude code, now it works fine. Created README.rdoc
|
46
|
-
Tue Oct 1 23:42:00 2013 +0200
|
47
|
-
* Update README.md
|
48
|
-
|
49
|
-
Corrected typo Tue Oct 1 23:32:22 2013 +0200
|
50
|
-
* Update README.md Tue Oct 1 23:31:47 2013 +0200
|
51
|
-
* Initial commit
|
52
|
-
Tue Oct 1 14:21:10 2013 -0700
|
53
|
-
* Really deleted the last few lines of code.
|
54
|
-
Sat Sep 28 15:49:06 2013 +0200
|
55
|
-
* Wrapper module Oxcelix created. String, Matrix, Fixnum are not included. Sheet objects are now created as a last step instead og the simple hashes. Workbookhelper module added, with one method, [](sheetname), which accepts a string parameter and returns the sheet named sheetname. Code cleanups (especially the last lines of the code which were there only for testing purposes.)
|
56
|
-
Sat Sep 28 15:46:56 2013 +0200
|
57
|
-
* Corrected Cellhelper::x() and Cellhelper::y() methods, now both return correct values. RDoc documentation added.
|
58
|
-
Wed Sep 25 23:44:07 2013 +0200
|
59
|
-
* Added support for sheet inclusion and exclusion. Workbook#new now accepts a hash of parameters, which may contain: :copymerge (Bool), :include_sheets (Ary), :exclude_sheets (Ary)
|
60
|
-
Wed Sep 25 09:49:42 2013 +0200
|
61
|
-
* Added col_name to display excel column names. Style data of cell is now included. X and Y may get parameters. The Workbook constructor will now unzip and process the excel file. All sheets get converted to matrices. Upon the Array->Matrix conversion, the merged cells max be omitted or repeated.
|
62
|
-
Mon Sep 23 20:32:25 2013 +0200
|
63
|
-
* First gitted version.
|
64
|
-
Thu Aug 29 09:14:59 2013 +0200
|
1
|
+
* Further code cleanup in numformats.rb Tue Dec 3 19:49:03 2013 +0100
|
2
|
+
* Renamed add to add_custom_formats Tue Dec 3 19:46:15 2013 +0100
|
3
|
+
* Path cleanup Tue Dec 3 19:07:47 2013 +0100
|
4
|
+
* Added documentation to Formatarray. Fixed bug which prevented cells containing e.g. String values AND datetime/numeric formatting code to be properly returned when to_ru or to_fmt was invoked. Code cleanup. Tue Dec 3 19:06:39 2013 +0100
|
5
|
+
* Numberhelper included in Cell class. Various typos corrected. Cell#to_ru and Cell#to_fmt now reflect the inclusion of the Numberformats module. Mon Dec 2 23:27:52 2013 +0100
|
6
|
+
* to_ru and to_fmt methods are now encapsulated in the Numhelper method. This is not only cleaner, ensures them to be included in Cell and only there. Mon Dec 2 23:04:13 2013 +0100
|
7
|
+
* Cleared @numformats from Workbook. Formatarray is now a Numformats module constant available to any class including it. Mon Dec 2 22:47:40 2013 +0100
|
8
|
+
* Numformat is now included in Workbook. Dtmap became a constant. New method Numformats::add converts the temparray to a series of numformat hashes and adds it to the main numformat array. to_ru, to_fmt, datetime, numeric are now Workbook methods. Slight code cleanup. Sun Dec 1 19:28:41 2013 +0100
|
9
|
+
* Numformats.rb cleanup. Documented new modules/methods. Restructured to_ru and to_fmt. Fri Nov 29 09:23:41 2013 +0100
|
10
|
+
* Code cleanup. TODO: split format string (;)? cellhelper.rb to be cleaned up Mon Nov 25 00:06:38 2013 +0100
|
11
|
+
* finalized numeric method with a regex composed by 6 members: prefix, decimals, separator, floats, expo, postfix. This obsoletes the vgrp method as well as the other ones (still in the numformats.rb file.) TODO: delete all unnecessary code and provide a meaningful return value. Mon Nov 25 00:00:52 2013 +0100
|
12
|
+
* Added Numformats Sat Nov 23 09:48:50 2013 +0100
|
13
|
+
* Merge branch '0.3.0' of https://github.com/gbiczo/oxcelix into 0.3.0 Sat Nov 23 09:43:59 2013 +0100
|
14
|
+
* Added numformats.rb. Cleaned styles.rb from unnecessary comments. Sat Nov 23 09:41:10 2013 +0100
|
15
|
+
* Added badge Fri Nov 22 12:20:48 2013 +0100
|
16
|
+
* Some speed optimizations. matrixto does not accept fmt parameter any more. fixed typos Wed Nov 13 00:03:44 2013 +0100
|
17
|
+
* Cell now has a numformat attribute. A new module called Numformats will contain methods related to numeric formatting. to_r and to_d are now obsolete. Xlsheet init parameter (styles). Stylefile is opened in the workbook. Matrixto gets a :values option (this will be obsoleted shortly). Slight Gemspec and .md description change Mon Nov 4 17:47:17 2013 +0100
|
18
|
+
* Initial version of Sheet::to_m method Sat Oct 19 11:06:42 2013 +0200
|
19
|
+
* Format array is now a constant (FARY) Fri Oct 18 21:58:39 2013 +0200
|
20
|
+
* Fixed typo in README Fri Oct 18 21:51:09 2013 +0200
|
21
|
+
* Started working on cell value formats Fri Oct 18 21:50:24 2013 +0200
|
data/README.rdoc
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
= \Oxcelix - A fast .xlsx file parser
|
2
2
|
|
3
|
+
{<img src="https://badge.fury.io/rb/oxcelix.png" alt="Gem Version" />}[http://badge.fury.io/rb/oxcelix]
|
4
|
+
|
3
5
|
== Description
|
4
6
|
|
5
7
|
Oxcelix is an xlsx (Excel 2007/2010) parser. The result of the parsing is a
|
6
8
|
Workbook which is an array of Sheet objects, which in turn store the data in
|
7
9
|
Matrix objects. Matrices consist of Cell objects to maintain comments and
|
8
|
-
formatting/style data
|
9
|
-
|
10
|
+
formatting/style data.
|
11
|
+
|
10
12
|
Oxcelix uses the great Ox gem (http://rubygems.org/gems/ox) for fast SAX-parsing.
|
11
13
|
|
12
14
|
== Synopsis
|
@@ -27,4 +29,4 @@ To include only some of the sheets:
|
|
27
29
|
|
28
30
|
To have the values of the merged cells copied over the mergegroup:
|
29
31
|
|
30
|
-
w = Oxcelix::Workbook.new('whatever.xlsx', :
|
32
|
+
w = Oxcelix::Workbook.new('whatever.xlsx', :copymerge => true)
|
data/lib/oxcelix/cell.rb
CHANGED
@@ -10,9 +10,13 @@ module Oxcelix
|
|
10
10
|
# @return [String] Comment text
|
11
11
|
# @!attribute [rw] style
|
12
12
|
# @return [String] Excel style attribute
|
13
|
+
# @!attribute [rw] numformat
|
14
|
+
# @return [String] Excel style number formatting
|
15
|
+
|
13
16
|
class Cell
|
14
|
-
attr_accessor :xlcoords, :type, :value, :comment, :style
|
17
|
+
attr_accessor :xlcoords, :type, :value, :comment, :style, :numformat
|
15
18
|
include Cellhelper
|
16
19
|
include Cellvalues
|
20
|
+
include Numberhelper
|
17
21
|
end
|
18
22
|
end
|
data/lib/oxcelix/cellhelper.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
-
|
2
1
|
module Oxcelix
|
3
|
-
|
2
|
+
|
3
|
+
# The Cellvalues module provides methods for setting cell values. They are named after the relevant XML entitiesd and
|
4
|
+
# called directly by the Xlsheet SAX parser.
|
4
5
|
module Cellvalues
|
5
6
|
# Set the excel cell name (eg: 'A2')
|
6
7
|
# @param [String] val Excel cell address name
|
@@ -13,6 +14,7 @@ module Oxcelix
|
|
13
14
|
def s(val); @style = val; end;
|
14
15
|
end
|
15
16
|
|
17
|
+
# The Cellhelper module defines some methods useful to manipulate Cell objects
|
16
18
|
module Cellhelper
|
17
19
|
# When called without parameters, returns the x coordinate of the calling cell object based on the value of #@xlcoords
|
18
20
|
# If a parameter is given, #x will return the x coordinate corresponding to the parameter
|
data/lib/oxcelix/nf.rb
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
module Oxcelix
|
2
|
+
module Numformats
|
3
|
+
# Formatarray is the array of default format strings in Excel. Nil values should apparently contain CJK date format strings,
|
4
|
+
#feel free to add/document those according to existing standards.
|
5
|
+
Formatarray = [
|
6
|
+
{:id => '0', :xl => 'General', :ostring => nil, :cls => 'string'},
|
7
|
+
{:id => '1', :xl => '0', :ostring => '%1d', :cls => 'numeric'},
|
8
|
+
{:id => '2', :xl => '0.00', :ostring => '%1.2f', :cls => 'numeric'},
|
9
|
+
{:id => '3', :xl => '#,##0', :ostring => '%#4d', :cls => 'numeric'},
|
10
|
+
{:id => '4', :xl => '#,##0.00', :ostring => '%#4.2f', :cls => 'numeric'},
|
11
|
+
{:id => '5', :xl => '', :ostring => nil, :cls => 'string'},
|
12
|
+
{:id => '6', :xl => '', :ostring => nil, :cls => 'string'},
|
13
|
+
{:id => '7', :xl => '', :ostring => nil, :cls => 'string'},
|
14
|
+
{:id => '8', :xl => '', :ostring => nil, :cls => 'string'},
|
15
|
+
{:id => '9', :xl => '0%', :ostring => '%1d%', :cls => 'numeric'},
|
16
|
+
{:id => '10', :xl => '0.00%', :ostring => '%1.2f%', :cls => 'numeric'},
|
17
|
+
{:id => '11', :xl => '0.00E+00', :ostring => '%1.2fE+', :cls => 'numeric'},
|
18
|
+
{:id => '12', :xl => '# ?/?', :ostring => '%#1d', :cls => 'rational'},
|
19
|
+
{:id => '13', :xl => '# ??/??', :ostring => '%#1d', :cls => 'rational'},
|
20
|
+
{:id => '14', :xl => 'd/m/yyyy', :ostring => '%-d/%-m/%Y', :cls => 'date'},
|
21
|
+
{:id => '15', :xl => 'd-mmm-yy', :ostring => '%-d-%b-%y', :cls => 'date'},
|
22
|
+
{:id => '16', :xl => 'd-mmm', :ostring => '%-d-%b', :cls => 'date'},
|
23
|
+
{:id => '17', :xl => 'mmm-yy', :ostring => '%b-%y', :cls => 'date'},
|
24
|
+
{:id => '18', :xl => 'h:mm tt', :ostring => '%-k:%M tt', :cls => 'date'},
|
25
|
+
{:id => '19', :xl => 'h:mm:ss tt', :ostring => '%-k:%M:%-S tt', :cls => 'date'},
|
26
|
+
{:id => '20', :xl => 'H:mm', :ostring => '%-k:%M', :cls => 'date'},
|
27
|
+
{:id => '21', :xl => 'H:mm:ss', :ostring => '%-k:%M:%-S', :cls => 'date'},
|
28
|
+
{:id => '22', :xl => 'm/d/yyyy H:mm', :ostring => '%-m/%-d/%Y %-k:%M', :cls => 'date'},
|
29
|
+
{:id => '23', :xl => '', :ostring => nil, :cls => 'string'},
|
30
|
+
{:id => '24', :xl => '', :ostring => nil, :cls => 'string'},
|
31
|
+
{:id => '25', :xl => '', :ostring => nil, :cls => 'string'},
|
32
|
+
{:id => '26', :xl => '', :ostring => nil, :cls => 'string'},
|
33
|
+
{:id => '27', :xl => '', :ostring => nil, :cls => 'string'},
|
34
|
+
{:id => '28', :xl => '', :ostring => nil, :cls => 'string'},
|
35
|
+
{:id => '29', :xl => '', :ostring => nil, :cls => 'string'},
|
36
|
+
{:id => '30', :xl => '', :ostring => nil, :cls => 'string'},
|
37
|
+
{:id => '31', :xl => '', :ostring => nil, :cls => 'string'},
|
38
|
+
{:id => '32', :xl => '', :ostring => nil, :cls => 'string'},
|
39
|
+
{:id => '33', :xl => '', :ostring => nil, :cls => 'string'},
|
40
|
+
{:id => '34', :xl => '', :ostring => nil, :cls => 'string'},
|
41
|
+
{:id => '35', :xl => '', :ostring => nil, :cls => 'string'},
|
42
|
+
{:id => '36', :xl => '', :ostring => nil, :cls => 'string'},
|
43
|
+
{:id => '37', :xl => '#,##0 ;(#,##0)', :ostring => '%#4d', :cls => 'numeric'},
|
44
|
+
{:id => '38', :xl => '#,##0 ;[Red](#,##0)', :ostring => '%#4d', :cls => 'numeric'},
|
45
|
+
{:id => '39', :xl => '#,##0.00;(#,##0.00)', :ostring => '%#4.2f', :cls => 'numeric'},
|
46
|
+
{:id => '40', :xl => '#,##0.00;[Red](#,##0.00)', :ostring => '%#4.2f', :cls => 'numeric'},
|
47
|
+
{:id => '41', :xl => '', :ostring => nil, :cls => 'string'},
|
48
|
+
{:id => '42', :xl => '', :ostring => nil, :cls => 'string'},
|
49
|
+
{:id => '43', :xl => '', :ostring => nil, :cls => 'string'},
|
50
|
+
{:id => '44', :xl => '', :ostring => nil, :cls => 'string'},
|
51
|
+
{:id => '45', :xl => 'mm:ss', :ostring => '%M:%-S', :cls => 'date'},
|
52
|
+
{:id => '46', :xl => '[h]:mm:ss', :ostring => '%-k:%M:%-S', :cls => 'date'},
|
53
|
+
{:id => '47', :xl => 'mmss.0', :ostring => '%M%-S.%1n', :cls => 'date'},
|
54
|
+
{:id => '48', :xl => '##0.0E+0', :ostring => '%#3.1E', :cls => 'numeric'},
|
55
|
+
{:id => '49', :xl => '@,', :ostring => '@%d', :cls => 'numeric'},
|
56
|
+
{:id => '50', :xl => '', :ostring => nil, :cls => 'string'},
|
57
|
+
{:id => '51', :xl => '', :ostring => nil, :cls => 'string'},
|
58
|
+
{:id => '52', :xl => '', :ostring => nil, :cls => 'string'},
|
59
|
+
{:id => '53', :xl => '', :ostring => nil, :cls => 'string'},
|
60
|
+
{:id => '54', :xl => '', :ostring => nil, :cls => 'string'},
|
61
|
+
{:id => '55', :xl => '', :ostring => nil, :cls => 'string'},
|
62
|
+
{:id => '56', :xl => '', :ostring => nil, :cls => 'string'},
|
63
|
+
{:id => '57', :xl => '', :ostring => nil, :cls => 'string'},
|
64
|
+
{:id => '58', :xl => '', :ostring => nil, :cls => 'string'},
|
65
|
+
{:id => '59', :xl => '', :ostring => nil, :cls => 'string'},
|
66
|
+
{:id => '60', :xl => '', :ostring => nil, :cls => 'string'},
|
67
|
+
{:id => '61', :xl => '', :ostring => nil, :cls => 'string'},
|
68
|
+
{:id => '62', :xl => '', :ostring => nil, :cls => 'string'},
|
69
|
+
{:id => '63', :xl => '', :ostring => nil, :cls => 'string'},
|
70
|
+
{:id => '64', :xl => '', :ostring => nil, :cls => 'string'},
|
71
|
+
{:id => '65', :xl => '', :ostring => nil, :cls => 'string'},
|
72
|
+
{:id => '66', :xl => '', :ostring => nil, :cls => 'string'},
|
73
|
+
{:id => '67', :xl => '', :ostring => nil, :cls => 'string'},
|
74
|
+
{:id => '68', :xl => '', :ostring => nil, :cls => 'string'},
|
75
|
+
{:id => '69', :xl => '', :ostring => nil, :cls => 'string'},
|
76
|
+
{:id => '70', :xl => '', :ostring => nil, :cls => 'string'},
|
77
|
+
{:id => '71', :xl => '', :ostring => nil, :cls => 'string'},
|
78
|
+
{:id => '72', :xl => '', :ostring => nil, :cls => 'string'},
|
79
|
+
{:id => '73', :xl => '', :ostring => nil, :cls => 'string'},
|
80
|
+
{:id => '74', :xl => '', :ostring => nil, :cls => 'string'},
|
81
|
+
{:id => '75', :xl => '', :ostring => nil, :cls => 'string'},
|
82
|
+
{:id => '76', :xl => '', :ostring => nil, :cls => 'string'},
|
83
|
+
{:id => '77', :xl => '', :ostring => nil, :cls => 'string'},
|
84
|
+
{:id => '78', :xl => '', :ostring => nil, :cls => 'string'},
|
85
|
+
{:id => '79', :xl => '', :ostring => nil, :cls => 'string'},
|
86
|
+
{:id => '80', :xl => '', :ostring => nil, :cls => 'string'},
|
87
|
+
{:id => '81', :xl => '', :ostring => nil, :cls => 'string'},
|
88
|
+
{:id => '82', :xl => '', :ostring => nil, :cls => 'string'},
|
89
|
+
{:id => '83', :xl => '', :ostring => nil, :cls => 'string'},
|
90
|
+
{:id => '84', :xl => '', :ostring => nil, :cls => 'string'},
|
91
|
+
{:id => '85', :xl => '', :ostring => nil, :cls => 'string'},
|
92
|
+
{:id => '86', :xl => '', :ostring => nil, :cls => 'string'},
|
93
|
+
{:id => '87', :xl => '', :ostring => nil, :cls => 'string'},
|
94
|
+
{:id => '88', :xl => '', :ostring => nil, :cls => 'string'},
|
95
|
+
{:id => '89', :xl => '', :ostring => nil, :cls => 'string'},
|
96
|
+
{:id => '90', :xl => '', :ostring => nil, :cls => 'string'},
|
97
|
+
{:id => '91', :xl => '', :ostring => nil, :cls => 'string'},
|
98
|
+
{:id => '92', :xl => '', :ostring => nil, :cls => 'string'},
|
99
|
+
{:id => '93', :xl => '', :ostring => nil, :cls => 'string'},
|
100
|
+
{:id => '94', :xl => '', :ostring => nil, :cls => 'string'},
|
101
|
+
{:id => '95', :xl => '', :ostring => nil, :cls => 'string'},
|
102
|
+
{:id => '96', :xl => '', :ostring => nil, :cls => 'string'},
|
103
|
+
{:id => '97', :xl => '', :ostring => nil, :cls => 'string'},
|
104
|
+
{:id => '98', :xl => '', :ostring => nil, :cls => 'string'},
|
105
|
+
{:id => '99', :xl => '', :ostring => nil, :cls => 'string'},
|
106
|
+
{:id => '100', :xl => '', :ostring => nil, :cls => 'string'},
|
107
|
+
{:id => '101', :xl => '', :ostring => nil, :cls => 'string'},
|
108
|
+
{:id => '102', :xl => '', :ostring => nil, :cls => 'string'},
|
109
|
+
{:id => '103', :xl => '', :ostring => nil, :cls => 'string'},
|
110
|
+
{:id => '104', :xl => '', :ostring => nil, :cls => 'string'},
|
111
|
+
{:id => '105', :xl => '', :ostring => nil, :cls => 'string'},
|
112
|
+
{:id => '106', :xl => '', :ostring => nil, :cls => 'string'},
|
113
|
+
{:id => '107', :xl => '', :ostring => nil, :cls => 'string'},
|
114
|
+
{:id => '108', :xl => '', :ostring => nil, :cls => 'string'},
|
115
|
+
{:id => '109', :xl => '', :ostring => nil, :cls => 'string'},
|
116
|
+
{:id => '110', :xl => '', :ostring => nil, :cls => 'string'},
|
117
|
+
{:id => '111', :xl => '', :ostring => nil, :cls => 'string'},
|
118
|
+
{:id => '112', :xl => '', :ostring => nil, :cls => 'string'},
|
119
|
+
{:id => '113', :xl => '', :ostring => nil, :cls => 'string'},
|
120
|
+
{:id => '114', :xl => '', :ostring => nil, :cls => 'string'},
|
121
|
+
{:id => '115', :xl => '', :ostring => nil, :cls => 'string'},
|
122
|
+
{:id => '116', :xl => '', :ostring => nil, :cls => 'string'},
|
123
|
+
{:id => '117', :xl => '', :ostring => nil, :cls => 'string'},
|
124
|
+
{:id => '118', :xl => '', :ostring => nil, :cls => 'string'},
|
125
|
+
{:id => '119', :xl => '', :ostring => nil, :cls => 'string'},
|
126
|
+
{:id => '120', :xl => '', :ostring => nil, :cls => 'string'},
|
127
|
+
{:id => '121', :xl => '', :ostring => nil, :cls => 'string'},
|
128
|
+
{:id => '122', :xl => '', :ostring => nil, :cls => 'string'},
|
129
|
+
{:id => '123', :xl => '', :ostring => nil, :cls => 'string'},
|
130
|
+
{:id => '124', :xl => '', :ostring => nil, :cls => 'string'},
|
131
|
+
{:id => '125', :xl => '', :ostring => nil, :cls => 'string'},
|
132
|
+
{:id => '126', :xl => '', :ostring => nil, :cls => 'string'},
|
133
|
+
{:id => '127', :xl => '', :ostring => nil, :cls => 'string'},
|
134
|
+
{:id => '128', :xl => '', :ostring => nil, :cls => 'string'},
|
135
|
+
{:id => '129', :xl => '', :ostring => nil, :cls => 'string'},
|
136
|
+
{:id => '130', :xl => '', :ostring => nil, :cls => 'string'},
|
137
|
+
{:id => '131', :xl => '', :ostring => nil, :cls => 'string'},
|
138
|
+
{:id => '132', :xl => '', :ostring => nil, :cls => 'string'},
|
139
|
+
{:id => '133', :xl => '', :ostring => nil, :cls => 'string'},
|
140
|
+
{:id => '134', :xl => '', :ostring => nil, :cls => 'string'},
|
141
|
+
{:id => '135', :xl => '', :ostring => nil, :cls => 'string'},
|
142
|
+
{:id => '136', :xl => '', :ostring => nil, :cls => 'string'},
|
143
|
+
{:id => '137', :xl => '', :ostring => nil, :cls => 'string'},
|
144
|
+
{:id => '138', :xl => '', :ostring => nil, :cls => 'string'},
|
145
|
+
{:id => '139', :xl => '', :ostring => nil, :cls => 'string'},
|
146
|
+
{:id => '140', :xl => '', :ostring => nil, :cls => 'string'},
|
147
|
+
{:id => '141', :xl => '', :ostring => nil, :cls => 'string'},
|
148
|
+
{:id => '142', :xl => '', :ostring => nil, :cls => 'string'},
|
149
|
+
{:id => '143', :xl => '', :ostring => nil, :cls => 'string'},
|
150
|
+
{:id => '144', :xl => '', :ostring => nil, :cls => 'string'},
|
151
|
+
{:id => '145', :xl => '', :ostring => nil, :cls => 'string'},
|
152
|
+
{:id => '146', :xl => '', :ostring => nil, :cls => 'string'},
|
153
|
+
{:id => '147', :xl => '', :ostring => nil, :cls => 'string'},
|
154
|
+
{:id => '148', :xl => '', :ostring => nil, :cls => 'string'},
|
155
|
+
{:id => '149', :xl => '', :ostring => nil, :cls => 'string'},
|
156
|
+
{:id => '150', :xl => '', :ostring => nil, :cls => 'string'},
|
157
|
+
{:id => '151', :xl => '', :ostring => nil, :cls => 'string'},
|
158
|
+
{:id => '152', :xl => '', :ostring => nil, :cls => 'string'},
|
159
|
+
{:id => '153', :xl => '', :ostring => nil, :cls => 'string'},
|
160
|
+
{:id => '154', :xl => '', :ostring => nil, :cls => 'string'},
|
161
|
+
{:id => '155', :xl => '', :ostring => nil, :cls => 'string'},
|
162
|
+
{:id => '156', :xl => '', :ostring => nil, :cls => 'string'},
|
163
|
+
{:id => '157', :xl => '', :ostring => nil, :cls => 'string'},
|
164
|
+
{:id => '158', :xl => '', :ostring => nil, :cls => 'string'},
|
165
|
+
{:id => '159', :xl => '', :ostring => nil, :cls => 'string'},
|
166
|
+
{:id => '160', :xl => '', :ostring => nil, :cls => 'string'},
|
167
|
+
{:id => '161', :xl => '', :ostring => nil, :cls => 'string'},
|
168
|
+
{:id => '162', :xl => '', :ostring => nil, :cls => 'string'},
|
169
|
+
{:id => '163', :xl => '', :ostring => nil, :cls => 'string'},
|
170
|
+
]
|
171
|
+
end
|
172
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module Oxcelix
|
2
|
+
# The Numformats module provides helper methods that either return the Cell object's raw @value as a ruby value
|
3
|
+
# (e.g. Numeric, DateTime, String) or formats it according to the excel _numformat_ string (#Cell.numformat).
|
4
|
+
module Numformats
|
5
|
+
Dtmap = {'hh'=>'%H', 'ii'=>'%M', 'i'=>'%-M', 'H'=>'%-k', 'h'=>'%-k',\
|
6
|
+
'ss'=>'%-S', 's'=>'%S', 'mmmmm'=>'%b', 'mmmm'=>'%B', 'mmm'=>'%b', 'mm'=>'%m', \
|
7
|
+
'm'=>'%-m', 'dddd'=>'%A', 'ddd'=>'%a', 'dd'=>'%d', 'd'=>'%-d', 'yyyy'=>'%Y', \
|
8
|
+
'yy'=>'%y', 'AM/PM'=>'%p', 'A/P'=>'%p', '.0'=>'', 'ss'=>'%-S', 's'=>'%S'}
|
9
|
+
|
10
|
+
# Convert the temporary format array (the collection of non-default number formatting strings defined in the excel sheet in use)
|
11
|
+
# to a series of hashes containing an id, an excel format string, a converted format string and an object class the format is
|
12
|
+
# interpreted on.
|
13
|
+
def add_custom_formats fmtary
|
14
|
+
fmtary.each do |x|
|
15
|
+
if x[:formatCode] =~ /[#0%\?]/
|
16
|
+
ostring = numeric x[:formatCode]
|
17
|
+
if x[:formatCode] =~ /\//
|
18
|
+
cls = 'rational'
|
19
|
+
else
|
20
|
+
cls = 'numeric'
|
21
|
+
end
|
22
|
+
elsif x[:formatCode].downcase =~ /[dmysh]/
|
23
|
+
ostring = datetime x[:formatCode]
|
24
|
+
cls = 'date'
|
25
|
+
elsif x[:formatCode].downcase == "general"
|
26
|
+
ostring = nil
|
27
|
+
cls = 'string'
|
28
|
+
end
|
29
|
+
Formatarray << {:id => x[:numFmtId].to_s, :xl => x[:formatCode].to_s, :ostring => ostring, :cls => cls}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Convert the excel-style number format to a ruby #Kernel::Format string and return that String.
|
34
|
+
# The conversion is internally done by regexp'ing 7 groups: prefix, decimals, separator, floats, exponential (E+)
|
35
|
+
# and postfix. Rational numbers ar not handled yet.
|
36
|
+
# @param [String] val an Excel number format string.
|
37
|
+
# @return [String] a rubyish Kernel::Format string.
|
38
|
+
def numeric val
|
39
|
+
ostring = "%"
|
40
|
+
strippedfmt = @numformat.gsub(/\?/, '0').gsub(',','')
|
41
|
+
prefix, decimals, sep, floats, expo, postfix=/(^[^\#0e].?)?([\#0]*)?(\.)?([\#0]*)?(e.?)?(.?[^\#0e]$)?/i.match(strippedfmt).captures
|
42
|
+
ostring.prepend prefix.to_s
|
43
|
+
if !decimals.nil? && decimals.size != 0
|
44
|
+
if (eval decimals) == nil
|
45
|
+
ostring += "##{decimals.size}"
|
46
|
+
elsif (eval decimals) == 0
|
47
|
+
ostring += decimals.size.to_s
|
48
|
+
end
|
49
|
+
else
|
50
|
+
ostring += decimals
|
51
|
+
end
|
52
|
+
ostring += sep.to_s
|
53
|
+
if !floats.nil? && floats.size != 0 # expo!!!
|
54
|
+
ostring += ((floats.size.to_s) +"f")
|
55
|
+
end
|
56
|
+
if sep.nil? && floats.nil? || floats.size == 0
|
57
|
+
ostring += "d"
|
58
|
+
end
|
59
|
+
ostring += (expo.to_s + postfix.to_s) #postfix '+' ?
|
60
|
+
return ostring
|
61
|
+
end
|
62
|
+
|
63
|
+
# Convert excel-style date formats into ruby DateTime strftime format strings
|
64
|
+
# @param [String] val an Excel number format string.
|
65
|
+
# @return [String] a DateTime::strftime format string.
|
66
|
+
def datetime formatcode
|
67
|
+
deminutified = formatcode.downcase.gsub(/(?<hrs>H|h)(?<div>.)m/, '\k<hrs>\k<div>i')
|
68
|
+
.gsub(/im/, 'ii')
|
69
|
+
.gsub(/m(?<div>.)(?<secs>s)/, 'i\k<div>\k<secs>')
|
70
|
+
.gsub(/mi/, 'ii')
|
71
|
+
return deminutified.gsub(/[yMmDdHhSsi]*/, Dtmap)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# The Numberhelper module implements methods that return the formatted value or the value converted into a Ruby type (DateTime, Numeric, etc)
|
76
|
+
module Numberhelper
|
77
|
+
include Numformats
|
78
|
+
# Get the cell's value and excel format string and return a string, a ruby Numeric or a DateTime object accordingly
|
79
|
+
def to_ru
|
80
|
+
if !@value.numeric? || Numformats::Formatarray[@numformat.to_i][:xl] == nil || Numformats::Formatarray[@numformat.to_i][:xl].downcase == "general"
|
81
|
+
return @value
|
82
|
+
end
|
83
|
+
if Numformats::Formatarray[@numformat.to_i][:cls] == 'numeric' || Numformats::Formatarray[@numformat.to_i][:cls] == 'rational'
|
84
|
+
return eval @value
|
85
|
+
elsif Numformats::Formatarray[@numformat.to_i][:cls] == 'date'
|
86
|
+
return DateTime.new(1899, 12, 30) + (eval @value)
|
87
|
+
else
|
88
|
+
eval @value rescue @value
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Get the cell's value, convert it with to_ru and finally, format it based on the value's type.
|
93
|
+
def to_fmt
|
94
|
+
begin
|
95
|
+
if Numformats::Formatarray[@numformat][:cls] == 'date'
|
96
|
+
self.to_ru.strftime(datetime(Numformats::Formatarray[@numformat][:xl])) rescue @value
|
97
|
+
elsif Numformats::Formatarray[@numformat.to_i][:cls] == 'numeric' || Numformats::Formatarray[@numformat.to_i][:cls] == 'rational'
|
98
|
+
sprintf(numeric(Numformats::Formatarray[@numformat][:xl]), self.to_ru) rescue @value
|
99
|
+
else
|
100
|
+
return @value
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'ox'
|
2
|
+
module Oxcelix
|
3
|
+
|
4
|
+
# Ox based SAX parser which pushes the number formats (taken from the styles.xml file) to an array
|
5
|
+
# The reference taken from the cell's 's' attribute points to an element of the
|
6
|
+
# style array, which in turn points to a number format (numFmt) that can be
|
7
|
+
# either built-in (@formats) or defined in the styles.xml itself.
|
8
|
+
class Styles < ::Ox::Sax
|
9
|
+
attr_accessor :styleary, :xmlstack, :temparray
|
10
|
+
def initialize
|
11
|
+
@temparray=[]
|
12
|
+
@styleary=[]
|
13
|
+
@xmlstack = []
|
14
|
+
@numform={}
|
15
|
+
end
|
16
|
+
|
17
|
+
def nf key, value
|
18
|
+
@numform[key]=value
|
19
|
+
if @numform.size == 2
|
20
|
+
@temparray << @numform
|
21
|
+
@numform = {}
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def numFmtId str
|
26
|
+
if @xmlstack[-2] == :cellXfs
|
27
|
+
@styleary << str
|
28
|
+
elsif @xmlstack[-2] == :numFmts
|
29
|
+
nf :numFmtId, str
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def formatCode str
|
34
|
+
nf :formatCode, str
|
35
|
+
end
|
36
|
+
|
37
|
+
def start_element(name)
|
38
|
+
@xmlstack << name
|
39
|
+
end
|
40
|
+
|
41
|
+
def end_element(name)
|
42
|
+
@xmlstack.pop
|
43
|
+
end
|
44
|
+
|
45
|
+
def attr(name, str)
|
46
|
+
self.send name, str if self.respond_to?(name)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/oxcelix/sax/xlsheet.rb
CHANGED
@@ -62,8 +62,9 @@ module Oxcelix
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
#
|
66
|
-
# sharedStrings.xml file is done in the #Sharedstrings class
|
65
|
+
# Cell content is parsed here. For cells containing strings, interpolation using the
|
66
|
+
# sharedStrings.xml file is done in the #Sharedstrings class.
|
67
|
+
# The numformat attribute gets a value here based on the styles variable, to preserve the numeric formatting (thus the type) of values.
|
67
68
|
def text(str)
|
68
69
|
if @xmlstack.last == :c
|
69
70
|
if @cell.type != "shared" && @cell.type != "e" && str.numeric?
|
data/lib/oxcelix/sheet.rb
CHANGED
@@ -25,5 +25,15 @@ module Oxcelix
|
|
25
25
|
super(i,j[0])
|
26
26
|
end
|
27
27
|
end
|
28
|
+
|
29
|
+
def to_m(*attrs)
|
30
|
+
m=Matrix.build(self.col(0).length, self.row(0).length){nil}
|
31
|
+
self.each do |x, row, col|
|
32
|
+
if attrs.size == 0 || attrs.nil?
|
33
|
+
m[row, col]=x.value
|
34
|
+
end
|
35
|
+
end
|
36
|
+
return m
|
37
|
+
end
|
28
38
|
end
|
29
39
|
end
|
data/lib/oxcelix/workbook.rb
CHANGED
@@ -19,7 +19,10 @@ module Oxcelix
|
|
19
19
|
class Workbook
|
20
20
|
include Cellhelper
|
21
21
|
include Workbookhelper
|
22
|
+
include Numformats
|
23
|
+
|
22
24
|
attr_accessor :sheets
|
25
|
+
|
23
26
|
##
|
24
27
|
# Create a new {Workbook} object.
|
25
28
|
#
|
@@ -31,6 +34,8 @@ module Oxcelix
|
|
31
34
|
# the group of three merged cells <tt>| a |</tt> will become <tt>|a|a|a|</tt>
|
32
35
|
# * :include (Ary) - an array of sheet names to be included
|
33
36
|
# * :exclude (Ary) - an array of sheet names not to be processed
|
37
|
+
# * :values (Symbol) - cell values. This can be: :false, if the whole cell is needed, :excel, if the raw excel values need to be inserted
|
38
|
+
# and :ruby if ruby objects are preferred.
|
34
39
|
#
|
35
40
|
# The excel file is first getting unzipped, then the workbook.xml file gets
|
36
41
|
# processed. This file stores sheet metadata, which will be filtered (by including
|
@@ -56,10 +61,19 @@ module Oxcelix
|
|
56
61
|
@sheetbase={}
|
57
62
|
@sharedstrings=[]
|
58
63
|
|
59
|
-
f=IO.read(@destination+'/xl/workbook.xml')
|
64
|
+
f=IO.read(@destination + '/xl/workbook.xml')
|
60
65
|
@a=Ox::load(f)
|
61
66
|
|
62
67
|
sheetdata(options); commentsrel; shstrings;
|
68
|
+
|
69
|
+
styles = Styles.new()
|
70
|
+
File.open(@destination + '/xl/styles.xml', 'r') do |f|
|
71
|
+
Ox.sax_parse(styles, f)
|
72
|
+
end
|
73
|
+
|
74
|
+
styles.temparray.sort_by!{|st| st[:numFmtId].to_i}
|
75
|
+
add_custom_formats styles.temparray
|
76
|
+
styles.styleary.map!{|s| Numformats::Formatarray[s.to_i][:id].to_i}
|
63
77
|
|
64
78
|
@sheets.each do |x|
|
65
79
|
|
@@ -70,6 +84,7 @@ module Oxcelix
|
|
70
84
|
end
|
71
85
|
comments = mkcomments(x[:comments])
|
72
86
|
@sheet.cellarray.each do |sh|
|
87
|
+
sh.numformat = styles.styleary[sh.style.to_i]
|
73
88
|
if sh.type=="s"
|
74
89
|
sh.value = @sharedstrings[sh.value.to_i]
|
75
90
|
end
|
@@ -85,7 +100,7 @@ module Oxcelix
|
|
85
100
|
x[:mergedcells] = @sheet.mergedcells
|
86
101
|
end
|
87
102
|
FileUtils.remove_dir(@destination, true)
|
88
|
-
matrixto
|
103
|
+
matrixto options[:copymerge]
|
89
104
|
end
|
90
105
|
|
91
106
|
private
|
@@ -196,14 +211,15 @@ module Oxcelix
|
|
196
211
|
# of each copied cell is changed to reflect the actual Excel coordinate.
|
197
212
|
#
|
198
213
|
# The matrix will replace the array of cells in the actual sheet.
|
199
|
-
# @param [Bool
|
214
|
+
# @param [Bool] copymerge
|
215
|
+
# @yield a value to be put as a cell. e.g: matrixto true, { |x| x = x.value.to_ru }
|
200
216
|
# @return [Matrix] a Matrix object that stores the cell values, and, depending on the copymerge parameter, will copy the merged value
|
201
217
|
# into every merged cell
|
202
218
|
def matrixto(copymerge)
|
203
219
|
@sheets.each_with_index do |sheet, i|
|
204
220
|
m=Sheet.build(sheet[:cells].last.y+1, sheet[:cells].last.x+1) {nil}
|
205
221
|
sheet[:cells].each do |c|
|
206
|
-
m[c.y, c.x]=c
|
222
|
+
m[c.y, c.x] = c
|
207
223
|
end
|
208
224
|
if copymerge==true
|
209
225
|
sheet[:mergedcells].each do |mc|
|
data/lib/oxcelix.rb
CHANGED
@@ -4,12 +4,15 @@ require 'matrix'
|
|
4
4
|
require 'fileutils'
|
5
5
|
require 'zip'
|
6
6
|
require 'oxcelix/cellhelper'
|
7
|
+
require 'oxcelix/numformats'
|
8
|
+
require 'oxcelix/nf'
|
7
9
|
require 'oxcelix/cell'
|
8
10
|
require 'oxcelix/sheet'
|
9
11
|
require 'oxcelix/workbook'
|
10
12
|
require 'oxcelix/sax/sharedstrings'
|
11
13
|
require 'oxcelix/sax/comments'
|
12
14
|
require 'oxcelix/sax/xlsheet'
|
15
|
+
require 'oxcelix/sax/styles'
|
13
16
|
|
14
17
|
class String
|
15
18
|
# Returns true if the given String represents a numeric value
|
data/oxcelix.gemspec
CHANGED
@@ -3,16 +3,20 @@
|
|
3
3
|
require 'rake'
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = 'oxcelix'
|
6
|
-
s.version = '0.
|
7
|
-
s.date = '2013-
|
6
|
+
s.version = '0.3.0'
|
7
|
+
s.date = '2013-11-12'
|
8
8
|
s.summary = 'A fast Excel 2007/2010 file parser'
|
9
|
-
s.description = 'A fast .xlsx file
|
9
|
+
s.description = 'A fast Excel 2007/2010 (.xlsx) file parser that returns a collection of Matrix objects'
|
10
10
|
s.authors = 'Giovanni Biczo'
|
11
11
|
s.homepage = 'http://github.com/gbiczo/oxcelix'
|
12
12
|
s.rubyforge_project = 'oxcelix'
|
13
13
|
|
14
14
|
s.files = FileList["LICENSE", "README.rdoc", "README.md",
|
15
|
-
"lib
|
15
|
+
"lib/oxcelix.rb", "lib/oxcelix/cellhelper.rb",
|
16
|
+
"lib/oxcelix/cell.rb", "lib/oxcelix/numformats.rb",
|
17
|
+
"lib/oxcelix/nf.rb",
|
18
|
+
"lib/oxcelix/sheet.rb", "lib/oxcelix/workbook.rb",
|
19
|
+
"lib/oxcelix/sax/*",
|
16
20
|
"oxcelix.gemspec", "spec/*", ".yardopts", "CHANGES"].to_a
|
17
21
|
s.license = 'MIT'
|
18
22
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oxcelix
|
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:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-11-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ox
|
@@ -43,7 +43,8 @@ dependencies:
|
|
43
43
|
- - ! '>='
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: 0.9.9
|
46
|
-
description: A fast .xlsx file
|
46
|
+
description: A fast Excel 2007/2010 (.xlsx) file parser that returns a collection
|
47
|
+
of Matrix objects
|
47
48
|
email:
|
48
49
|
executables: []
|
49
50
|
extensions: []
|
@@ -52,14 +53,16 @@ files:
|
|
52
53
|
- LICENSE
|
53
54
|
- README.rdoc
|
54
55
|
- README.md
|
55
|
-
- lib/lofaszka.rb
|
56
56
|
- lib/oxcelix.rb
|
57
|
+
- lib/oxcelix/cellhelper.rb
|
57
58
|
- lib/oxcelix/cell.rb
|
58
|
-
- lib/oxcelix/
|
59
|
+
- lib/oxcelix/numformats.rb
|
60
|
+
- lib/oxcelix/nf.rb
|
59
61
|
- lib/oxcelix/sheet.rb
|
60
|
-
- lib/oxcelix/
|
62
|
+
- lib/oxcelix/workbook.rb
|
61
63
|
- lib/oxcelix/sax/sharedstrings.rb
|
62
64
|
- lib/oxcelix/sax/xlsheet.rb
|
65
|
+
- lib/oxcelix/sax/styles.rb
|
63
66
|
- lib/oxcelix/sax/comments.rb
|
64
67
|
- oxcelix.gemspec
|
65
68
|
- spec/test.xlsx
|