workbook 0.4.2 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/.gitignore +2 -1
  2. data/.yardoc/checksums +22 -21
  3. data/.yardoc/object_types +0 -0
  4. data/.yardoc/objects/root.dat +0 -0
  5. data/Gemfile.lock +2 -2
  6. data/doc/RubyXL.html +1 -1
  7. data/doc/RubyXL/Cell.html +1 -1
  8. data/doc/RubyXL/Workbook.html +31 -31
  9. data/doc/Workbook.html +4 -4
  10. data/doc/Workbook/Book.html +5 -5
  11. data/doc/Workbook/Cell.html +202 -62
  12. data/doc/Workbook/Format.html +32 -32
  13. data/doc/Workbook/Modules.html +1 -1
  14. data/doc/Workbook/Modules/RawObjectsStorage.html +5 -5
  15. data/doc/Workbook/Modules/TableDiffSort.html +14 -14
  16. data/doc/Workbook/Modules/TypeParser.html +7 -7
  17. data/doc/Workbook/NilValue.html +434 -0
  18. data/doc/Workbook/Readers.html +3 -3
  19. data/doc/Workbook/Readers/CsvReader.html +6 -6
  20. data/doc/Workbook/Readers/OdsReader.html +562 -60
  21. data/doc/Workbook/Readers/TxtReader.html +2 -2
  22. data/doc/Workbook/Readers/XlsReader.html +14 -14
  23. data/doc/Workbook/Readers/XlsShared.html +67 -67
  24. data/doc/Workbook/Readers/XlsxReader.html +7 -7
  25. data/doc/Workbook/Row.html +243 -5
  26. data/doc/Workbook/Sheet.html +2 -2
  27. data/doc/Workbook/Table.html +669 -58
  28. data/doc/Workbook/Template.html +5 -5
  29. data/doc/Workbook/Writers.html +1 -1
  30. data/doc/Workbook/Writers/CsvTableWriter.html +1 -1
  31. data/doc/Workbook/Writers/HtmlWriter.html +27 -13
  32. data/doc/Workbook/Writers/XlsWriter.html +2 -2
  33. data/doc/_index.html +23 -8
  34. data/doc/class_list.html +1 -1
  35. data/doc/file.README.html +16 -12
  36. data/doc/index.html +16 -12
  37. data/doc/method_list.html +232 -72
  38. data/doc/top-level-namespace.html +1 -1
  39. data/lib/workbook/book.rb +25 -25
  40. data/lib/workbook/cell.rb +33 -33
  41. data/lib/workbook/format.rb +10 -10
  42. data/lib/workbook/modules/raw_objects_storage.rb +19 -19
  43. data/lib/workbook/modules/table_diff_sort.rb +22 -22
  44. data/lib/workbook/modules/type_parser.rb +18 -18
  45. data/lib/workbook/nil_value.rb +6 -6
  46. data/lib/workbook/readers/csv_reader.rb +8 -8
  47. data/lib/workbook/readers/ods_reader.rb +92 -46
  48. data/lib/workbook/readers/txt_reader.rb +2 -2
  49. data/lib/workbook/readers/xls_reader.rb +19 -19
  50. data/lib/workbook/readers/xls_shared.rb +70 -70
  51. data/lib/workbook/readers/xlsx_reader.rb +42 -42
  52. data/lib/workbook/row.rb +59 -29
  53. data/lib/workbook/sheet.rb +8 -8
  54. data/lib/workbook/table.rb +52 -19
  55. data/lib/workbook/template.rb +10 -10
  56. data/lib/workbook/version.rb +1 -1
  57. data/lib/workbook/writers/csv_table_writer.rb +1 -1
  58. data/lib/workbook/writers/html_writer.rb +6 -6
  59. data/lib/workbook/writers/xls_writer.rb +12 -12
  60. data/rbeautify.rb +232 -0
  61. data/test/artifacts/book_with_colspans.ods +0 -0
  62. data/test/artifacts/book_with_tabs_and_colours.ods +0 -0
  63. data/test/test_book.rb +10 -10
  64. data/test/test_cell.rb +14 -14
  65. data/test/test_format.rb +11 -11
  66. data/test/test_functional.rb +3 -3
  67. data/test/test_modules_table_diff_sort.rb +24 -24
  68. data/test/test_modules_type_parser.rb +27 -27
  69. data/test/test_readers_csv_reader.rb +11 -11
  70. data/test/test_readers_ods_reader.rb +22 -15
  71. data/test/test_readers_txt_reader.rb +13 -13
  72. data/test/test_readers_xls_reader.rb +11 -11
  73. data/test/test_readers_xlsx_reader.rb +5 -5
  74. data/test/test_row.rb +96 -26
  75. data/test/test_sheet.rb +9 -9
  76. data/test/test_table.rb +42 -26
  77. data/test/test_template.rb +3 -3
  78. data/test/test_writers_html_writer.rb +6 -4
  79. data/test/test_writers_xls_writer.rb +7 -7
  80. metadata +5 -1
@@ -4,9 +4,9 @@ module Workbook
4
4
  module TxtReader
5
5
  def load_txt text
6
6
  csv = text
7
- parse_txt csv
7
+ parse_txt csv
8
8
  end
9
-
9
+
10
10
  def parse_txt csv_raw
11
11
  csv = []
12
12
  csv_raw.split("\n").each {|l| csv << csv_lib.parse_line(l,{:col_sep=>"\t"});nil}
@@ -11,17 +11,17 @@ module Workbook
11
11
  template.add_raw sp
12
12
  parse_xls sp
13
13
  rescue Ole::Storage::FormatError => e
14
- begin
14
+ begin
15
15
  # Assuming it is a tab separated txt inside .xls
16
- open(file_obj.path, 'txt')
16
+ open(file_obj.path, 'txt')
17
17
  rescue
18
18
  raise e
19
19
  end
20
20
  end
21
-
21
+
22
22
  end
23
-
24
-
23
+
24
+
25
25
  def parse_xls xls_spreadsheet=template.raws[Spreadsheet::Excel::Workbook], options={}
26
26
  options = {:additional_type_parsing=>true}.merge options
27
27
  number_of_worksheets = xls_spreadsheet.worksheets.count
@@ -29,16 +29,16 @@ module Workbook
29
29
  xls_sheet = xls_spreadsheet.worksheets[si]
30
30
  begin
31
31
  number_of_rows = xls_spreadsheet.worksheets[si].count
32
- s = create_or_open_sheet_at(si)
32
+ s = create_or_open_sheet_at(si)
33
33
  (0..number_of_rows-1).each do |ri|
34
34
  xls_row = xls_sheet.row(ri)
35
35
  r = s.table.create_or_open_row_at(ri)
36
36
  col_widths = xls_sheet.columns.collect{|c| c.width if c}
37
37
  xls_row.each_with_index do |xls_cell,ci|
38
-
38
+
39
39
  begin
40
- r[ci] = Workbook::Cell.new xls_cell
41
- r[ci].parse!
40
+ r[ci] = Workbook::Cell.new xls_cell
41
+ r[ci].parse!
42
42
  rescue ArgumentError => e
43
43
  if e.message.match('not a Spreadsheet::Formula')
44
44
  v = xls_cell.value
@@ -48,27 +48,27 @@ module Workbook
48
48
  end
49
49
  if v.is_a? Spreadsheet::Excel::Error
50
50
  v = "----!"
51
- end
51
+ end
52
52
  r[ci] = Workbook::Cell.new v
53
53
  elsif e.message.match('not a Spreadsheet::Link')
54
54
  r[ci] = Workbook::Cell.new xls_cell.to_s
55
55
  elsif e.message.match('not a Spreadsheet::Link')
56
56
  r[ci] = Workbook::Cell.new xls_cell.to_s
57
57
  elsif e.message.match('not a Spreadsheet::Excel::Error')
58
- r[ci] = "._."
59
- else
58
+ r[ci] = "._."
59
+ else
60
60
  r[ci] = "._." # raise e (we're going to be silent for now)
61
61
  end
62
62
  end
63
63
  xls_format = xls_row.format(ci)
64
64
  col_width = nil
65
-
65
+
66
66
  if ri == 0
67
67
  col_width = col_widths[ci]
68
68
  end
69
69
  f = template.create_or_find_format_by "object_id_#{xls_format.object_id}",col_width
70
70
  f[:width]= col_width
71
- f[:rotation] = xls_format.rotation if xls_format.rotation
71
+ f[:rotation] = xls_format.rotation if xls_format.rotation
72
72
  f[:background_color] = xls_color_to_html_hex(xls_format.pattern_fg_color)
73
73
  f[:number_format] = ms_formatting_to_strftime(xls_format.number_format)
74
74
  f[:text_direction] = xls_format.text_direction
@@ -77,7 +77,7 @@ module Workbook
77
77
  f[:color] = xls_color_to_html_hex(xls_format.font.color)
78
78
 
79
79
  f.add_raw xls_format
80
-
80
+
81
81
  r[ci].format = f
82
82
  end
83
83
  end
@@ -87,13 +87,13 @@ module Workbook
87
87
  end
88
88
  end
89
89
  end
90
-
91
- private
90
+
91
+ private
92
92
  def xls_color_to_html_hex color_sym
93
93
  Workbook::Book::XLS_COLORS[color_sym] ? Workbook::Book::XLS_COLORS[color_sym] : "#000000"
94
94
  end
95
-
96
- def ms_formatting_to_strftime ms_nr_format
95
+
96
+ def ms_formatting_to_strftime ms_nr_format
97
97
  ms_nr_format = ms_nr_format.downcase
98
98
  return nil if ms_nr_format == 'general'
99
99
  ms_nr_format.gsub('yyyy','%Y').gsub('dddd','%A').gsub('mmmm','%B').gsub('ddd','%a').gsub('mmm','%b').gsub('yy','%y').gsub('dd','%d').gsub('mm','%m').gsub('y','%y').gsub('%%y','%y').gsub('d','%e').gsub('%%e','%d').gsub('m','%m').gsub('%%m','%m').gsub(';@','').gsub('\\','')
@@ -3,74 +3,74 @@ module Workbook
3
3
  module Readers
4
4
  module XlsShared
5
5
  XLS_COLORS = {:xls_color_1=>'#000000',
6
- :xls_color_2=>'#FFFFFF',
7
- :xls_color_3=>'#FF0000',
8
- :xls_color_4=>'#00FF00',
9
- :xls_color_5=>'#0000FF',
10
- :xls_color_6=>'#FFFF00',
11
- :xls_color_7=>'#FF00FF',
12
- :xls_color_8=>'#00FFFF',
13
- :xls_color_9=>'#800000',
14
- :xls_color_10=>'#008000',
15
- :xls_color_11=>'#000080',
16
- :xls_color_12=>'#808000',
17
- :xls_color_13=>'#800080',
18
- :xls_color_14=>'#008080',
19
- :xls_color_15=>'#C0C0C0',
20
- :xls_color_16=>'#808080',
21
- :xls_color_17=>'#9999FF',
22
- :xls_color_18=>'#993366',
23
- :xls_color_19=>'#FFFFCC',
24
- :xls_color_20=>'#CCFFFF',
25
- :xls_color_21=>'#660066',
26
- :xls_color_22=>'#FF8080',
27
- :xls_color_23=>'#0066CC',
28
- :xls_color_24=>'#CCCCFF',
29
- :xls_color_25=>'#000080',
30
- :xls_color_26=>'#FF00FF',
31
- :xls_color_27=>'#FFFF00',
32
- :xls_color_28=>'#00FFFF',
33
- :xls_color_29=>'#800080',
34
- :xls_color_30=>'#800000',
35
- :xls_color_31=>'#008080',
36
- :xls_color_32=>'#0000FF',
37
- :xls_color_33=>'#00CCFF',
38
- :xls_color_34=>'#CCFFFF',
39
- :xls_color_35=>'#CCFFCC',
40
- :xls_color_36=>'#FFFF99',
41
- :xls_color_37=>'#99CCFF',
42
- :xls_color_38=>'#FF99CC',
43
- :xls_color_39=>'#CC99FF',
44
- :xls_color_40=>'#FFCC99',
45
- :xls_color_41=>'#3366FF',
46
- :xls_color_42=>'#33CCCC',
47
- :xls_color_43=>'#99CC00',
48
- :xls_color_44=>'#FFCC00',
49
- :xls_color_45=>'#FF9900',
50
- :xls_color_46=>'#FF6600',
51
- :xls_color_47=>'#666699',
52
- :xls_color_48=>'#969696',
53
- :xls_color_49=>'#003366',
54
- :xls_color_50=>'#339966',
55
- :xls_color_51=>'#003300',
56
- :xls_color_52=>'#333300',
57
- :xls_color_53=>'#993300',
58
- :xls_color_54=>'#993366',
59
- :xls_color_55=>'#333399',
60
- :xls_color_56=>'#333333',
61
- :black=>'#000000',
62
- :white=>'#FFFFFF',
63
- :red=>'#FF0000',
64
- :green=>'#00FF00',
65
- :blue=>'#0000FF',
66
- :yellow=>'#FFFF00',
67
- :magenta=>'#FF00FF',
68
- :cyan=>'#00FFFF',
69
- :border=>'#FFFFFF',
70
- :text=>'#000000',
71
- :lime=>'#00f94c'
72
- }
73
- end
74
- end
6
+ :xls_color_2=>'#FFFFFF',
7
+ :xls_color_3=>'#FF0000',
8
+ :xls_color_4=>'#00FF00',
9
+ :xls_color_5=>'#0000FF',
10
+ :xls_color_6=>'#FFFF00',
11
+ :xls_color_7=>'#FF00FF',
12
+ :xls_color_8=>'#00FFFF',
13
+ :xls_color_9=>'#800000',
14
+ :xls_color_10=>'#008000',
15
+ :xls_color_11=>'#000080',
16
+ :xls_color_12=>'#808000',
17
+ :xls_color_13=>'#800080',
18
+ :xls_color_14=>'#008080',
19
+ :xls_color_15=>'#C0C0C0',
20
+ :xls_color_16=>'#808080',
21
+ :xls_color_17=>'#9999FF',
22
+ :xls_color_18=>'#993366',
23
+ :xls_color_19=>'#FFFFCC',
24
+ :xls_color_20=>'#CCFFFF',
25
+ :xls_color_21=>'#660066',
26
+ :xls_color_22=>'#FF8080',
27
+ :xls_color_23=>'#0066CC',
28
+ :xls_color_24=>'#CCCCFF',
29
+ :xls_color_25=>'#000080',
30
+ :xls_color_26=>'#FF00FF',
31
+ :xls_color_27=>'#FFFF00',
32
+ :xls_color_28=>'#00FFFF',
33
+ :xls_color_29=>'#800080',
34
+ :xls_color_30=>'#800000',
35
+ :xls_color_31=>'#008080',
36
+ :xls_color_32=>'#0000FF',
37
+ :xls_color_33=>'#00CCFF',
38
+ :xls_color_34=>'#CCFFFF',
39
+ :xls_color_35=>'#CCFFCC',
40
+ :xls_color_36=>'#FFFF99',
41
+ :xls_color_37=>'#99CCFF',
42
+ :xls_color_38=>'#FF99CC',
43
+ :xls_color_39=>'#CC99FF',
44
+ :xls_color_40=>'#FFCC99',
45
+ :xls_color_41=>'#3366FF',
46
+ :xls_color_42=>'#33CCCC',
47
+ :xls_color_43=>'#99CC00',
48
+ :xls_color_44=>'#FFCC00',
49
+ :xls_color_45=>'#FF9900',
50
+ :xls_color_46=>'#FF6600',
51
+ :xls_color_47=>'#666699',
52
+ :xls_color_48=>'#969696',
53
+ :xls_color_49=>'#003366',
54
+ :xls_color_50=>'#339966',
55
+ :xls_color_51=>'#003300',
56
+ :xls_color_52=>'#333300',
57
+ :xls_color_53=>'#993300',
58
+ :xls_color_54=>'#993366',
59
+ :xls_color_55=>'#333399',
60
+ :xls_color_56=>'#333333',
61
+ :black=>'#000000',
62
+ :white=>'#FFFFFF',
63
+ :red=>'#FF0000',
64
+ :green=>'#00FF00',
65
+ :blue=>'#0000FF',
66
+ :yellow=>'#FFFF00',
67
+ :magenta=>'#FF00FF',
68
+ :cyan=>'#00FFFF',
69
+ :border=>'#FFFFFF',
70
+ :text=>'#000000',
71
+ :lime=>'#00f94c'
72
+ }
73
+ end
74
+ end
75
75
  end
76
-
76
+
@@ -4,7 +4,7 @@ require 'rubyXL'
4
4
  # Monkeypatching rubyXL, pull request submitted: https://github.com/gilt/rubyXL/pull/47
5
5
  module RubyXL
6
6
  class Workbook
7
-
7
+
8
8
  # Improves upon date format detection
9
9
  def is_date_format?(num_fmt)
10
10
  num_fmt.downcase!
@@ -71,36 +71,36 @@ module RubyXL
71
71
  def num_fmts_by_id
72
72
  return @num_fmts_hash unless @num_fmts_hash.nil?
73
73
  @num_fmts_hash={1=>{:attributes=>{:formatCode=>'0'}},
74
- 2=>{:attributes=>{:formatCode=>'0.00'}},
75
- 3=>{:attributes=>{:formatCode=>'#, ##0'}},
76
- 4=>{:attributes=>{:formatCode=>'#, ##0.00'}},
77
- 5=>{:attributes=>{:formatCode=>'$#, ##0_);($#, ##0)'}},
78
- 6=>{:attributes=>{:formatCode=>'$#, ##0_);[Red]($#, ##0)'}},
79
- 7=>{:attributes=>{:formatCode=>'$#, ##0.00_);($#, ##0.00)'}},
80
- 8=>{:attributes=>{:formatCode=>'$#, ##0.00_);[Red]($#, ##0.00)'}},
81
- 9=>{:attributes=>{:formatCode=>'0%'}},
82
- 10=>{:attributes=>{:formatCode=>'0.00%'}},
83
- 11=>{:attributes=>{:formatCode=>'0.00E+00'}},
84
- 12=>{:attributes=>{:formatCode=>'# ?/?'}},
85
- 13=>{:attributes=>{:formatCode=>'# ??/??'}},
86
- 14=>{:attributes=>{:formatCode=>'m/d/yyyy'}},
87
- 15=>{:attributes=>{:formatCode=>'d-mmm-yy'}},
88
- 16=>{:attributes=>{:formatCode=>'d-mmm'}},
89
- 17=>{:attributes=>{:formatCode=>'mmm-yy'}},
90
- 18=>{:attributes=>{:formatCode=>'h:mm AM/PM'}},
91
- 19=>{:attributes=>{:formatCode=>'h:mm:ss AM/PM'}},
92
- 20=>{:attributes=>{:formatCode=>'h:mm'}},
93
- 21=>{:attributes=>{:formatCode=>'h:mm:ss'}},
94
- 22=>{:attributes=>{:formatCode=>'m/d/yyyy h:mm'}},
95
- 37=>{:attributes=>{:formatCode=>'#, ##0_);(#, ##0)'}},
96
- 38=>{:attributes=>{:formatCode=>'#, ##0_);[Red](#, ##0)'}},
97
- 39=>{:attributes=>{:formatCode=>'#, ##0.00_);(#, ##0.00)'}},
98
- 40=>{:attributes=>{:formatCode=>'#, ##0.00_);[Red](#, ##0.00)'}},
99
- 45=>{:attributes=>{:formatCode=>'mm:ss'}},
100
- 46=>{:attributes=>{:formatCode=>'[h]:mm:ss'}},
101
- 47=>{:attributes=>{:formatCode=>'mm:ss.0'}},
102
- 48=>{:attributes=>{:formatCode=>'##0.0E+0'}},
103
- 49=>{:attributes=>{:formatCode=>'@'}}}
74
+ 2=>{:attributes=>{:formatCode=>'0.00'}},
75
+ 3=>{:attributes=>{:formatCode=>'#, ##0'}},
76
+ 4=>{:attributes=>{:formatCode=>'#, ##0.00'}},
77
+ 5=>{:attributes=>{:formatCode=>'$#, ##0_);($#, ##0)'}},
78
+ 6=>{:attributes=>{:formatCode=>'$#, ##0_);[Red]($#, ##0)'}},
79
+ 7=>{:attributes=>{:formatCode=>'$#, ##0.00_);($#, ##0.00)'}},
80
+ 8=>{:attributes=>{:formatCode=>'$#, ##0.00_);[Red]($#, ##0.00)'}},
81
+ 9=>{:attributes=>{:formatCode=>'0%'}},
82
+ 10=>{:attributes=>{:formatCode=>'0.00%'}},
83
+ 11=>{:attributes=>{:formatCode=>'0.00E+00'}},
84
+ 12=>{:attributes=>{:formatCode=>'# ?/?'}},
85
+ 13=>{:attributes=>{:formatCode=>'# ??/??'}},
86
+ 14=>{:attributes=>{:formatCode=>'m/d/yyyy'}},
87
+ 15=>{:attributes=>{:formatCode=>'d-mmm-yy'}},
88
+ 16=>{:attributes=>{:formatCode=>'d-mmm'}},
89
+ 17=>{:attributes=>{:formatCode=>'mmm-yy'}},
90
+ 18=>{:attributes=>{:formatCode=>'h:mm AM/PM'}},
91
+ 19=>{:attributes=>{:formatCode=>'h:mm:ss AM/PM'}},
92
+ 20=>{:attributes=>{:formatCode=>'h:mm'}},
93
+ 21=>{:attributes=>{:formatCode=>'h:mm:ss'}},
94
+ 22=>{:attributes=>{:formatCode=>'m/d/yyyy h:mm'}},
95
+ 37=>{:attributes=>{:formatCode=>'#, ##0_);(#, ##0)'}},
96
+ 38=>{:attributes=>{:formatCode=>'#, ##0_);[Red](#, ##0)'}},
97
+ 39=>{:attributes=>{:formatCode=>'#, ##0.00_);(#, ##0.00)'}},
98
+ 40=>{:attributes=>{:formatCode=>'#, ##0.00_);[Red](#, ##0.00)'}},
99
+ 45=>{:attributes=>{:formatCode=>'mm:ss'}},
100
+ 46=>{:attributes=>{:formatCode=>'[h]:mm:ss'}},
101
+ 47=>{:attributes=>{:formatCode=>'mm:ss.0'}},
102
+ 48=>{:attributes=>{:formatCode=>'##0.0E+0'}},
103
+ 49=>{:attributes=>{:formatCode=>'@'}}}
104
104
  if num_fmts and num_fmts[:numFmt]
105
105
  num_fmts[:numFmt].each do |num_fmt|
106
106
  @num_fmts_hash[num_fmt[:attributes][:numFmtId]]=num_fmt
@@ -125,7 +125,7 @@ module RubyXL
125
125
  end
126
126
  end
127
127
  end
128
- # end of monkey patch
128
+ # end of monkey patch
129
129
 
130
130
  module Workbook
131
131
  module Readers
@@ -136,25 +136,25 @@ module Workbook
136
136
  template.add_raw sp
137
137
  parse_xlsx sp
138
138
  end
139
-
139
+
140
140
  def parse_xlsx xlsx_spreadsheet=template.raws[RubyXL::Workbook], options={}
141
141
  options = {:additional_type_parsing=>false}.merge options
142
142
  #number_of_worksheets = xlsx_spreadsheet.worksheets.count
143
143
  xlsx_spreadsheet.worksheets.each_with_index do |worksheet, si|
144
- s = create_or_open_sheet_at(si)
144
+ s = create_or_open_sheet_at(si)
145
145
  col_widths = xlsx_spreadsheet.worksheets.first.cols.collect{|a| a[:attributes][:width].to_f if a[:attributes]}
146
146
  worksheet.each_with_index do |row, ri|
147
147
  r = s.table.create_or_open_row_at(ri)
148
-
148
+
149
149
  row.each_with_index do |cell,ci|
150
150
  if cell.nil?
151
151
  r[ci] = Workbook::Cell.new nil
152
152
  else
153
- r[ci] = Workbook::Cell.new cell.value
154
- r[ci].parse!
153
+ r[ci] = Workbook::Cell.new cell.value
154
+ r[ci].parse!
155
155
  xls_format = cell.style_index
156
156
  col_width = nil
157
-
157
+
158
158
  if ri == 0
159
159
  col_width = col_widths[ci]
160
160
  end
@@ -166,16 +166,16 @@ module Workbook
166
166
  f[:color] = "##{cell.font_color}"
167
167
 
168
168
  f.add_raw xls_format
169
-
169
+
170
170
  r[ci].format = f
171
171
  end
172
172
  end
173
173
  end
174
174
  end
175
175
  end
176
- private
177
- def ms_formatting_to_strftime ms_nr_format
178
- if ms_nr_format
176
+ private
177
+ def ms_formatting_to_strftime ms_nr_format
178
+ if ms_nr_format
179
179
  ms_nr_format = ms_nr_format.downcase
180
180
  return nil if ms_nr_format == 'general'
181
181
  ms_nr_format.gsub('yyyy','%Y').gsub('dddd','%A').gsub('mmmm','%B').gsub('ddd','%a').gsub('mmm','%b').gsub('yy','%y').gsub('dd','%d').gsub('mm','%m').gsub('y','%y').gsub('%%y','%y').gsub('d','%e').gsub('%%e','%d').gsub('m','%m').gsub('%%m','%m').gsub(';@','').gsub('\\','')
data/lib/workbook/row.rb CHANGED
@@ -4,17 +4,17 @@ module Workbook
4
4
  alias_method :compare_without_header, :<=>
5
5
  attr_accessor :placeholder # The placeholder attribute is used in compares (corresponds to newly created or removed lines (depending which side you're on)
6
6
  attr_accessor :format
7
-
7
+
8
8
  # Initialize a new row
9
9
  #
10
10
  # @param [Workbook::Row, Array<Workbook::Cell>, Array] cells list of cells to initialize the row with, default is empty
11
11
  # @param [Workbook::Table] table a row normally belongs to a table, reference it here
12
12
  # @param [Hash] options Supprted options: parse_cells_on_batch_creation (parse cell values during row-initalization, default: false), cell_parse_options (default {}, see Workbook::Modules::TypeParser)
13
13
  def initialize cells=[], table=nil, options={}
14
- options=options ? {:parse_cells_on_batch_creation=>false,:cell_parse_options=>{}}.merge(options) : {}
14
+ options=options ? {:parse_cells_on_batch_creation=>false,:cell_parse_options=>{}}.merge(options) : {}
15
15
  cells = [] if cells==nil
16
16
  self.table= table
17
- cells.each do |c|
17
+ cells.each do |c|
18
18
  if c.is_a? Workbook::Cell
19
19
  c = c
20
20
  else
@@ -24,28 +24,28 @@ module Workbook
24
24
  push c
25
25
  end
26
26
  end
27
-
27
+
28
28
  # An internal function used in diffs
29
- #
30
- # @return [Boolean] returns true when this row is not an actual row, but a placeholder row to 'compare' against
29
+ #
30
+ # @return [Boolean] returns true when this row is not an actual row, but a placeholder row to 'compare' against
31
31
  def placeholder?
32
32
  placeholder ? true : false
33
33
  end
34
-
34
+
35
35
  # Returns the table this row belongs to
36
36
  #
37
37
  # @return [Workbook::Table] the table this row belongs to
38
38
  def table
39
39
  @table
40
40
  end
41
-
41
+
42
42
  # Set reference to the table this row belongs to without adding the row to the table
43
43
  #
44
44
  # @param [Workbook::Table] t the table this row belongs to
45
45
  def set_table(t)
46
46
  @table = t
47
47
  end
48
-
48
+
49
49
  # Set reference to the table this row belongs to and add the row to this table
50
50
  #
51
51
  # @param [Workbook::Table] t the table this row belongs to
@@ -56,7 +56,7 @@ module Workbook
56
56
  table.push(self) #unless table.index(self) and self.placeholder?
57
57
  end
58
58
  end
59
-
59
+
60
60
  # Overrides normal Array's []-function with support for symbols that identify a column based on the header-values
61
61
  #
62
62
  # @example Lookup using fixnum or header value encoded as symbol
@@ -73,7 +73,7 @@ module Workbook
73
73
  rescue NoMethodError
74
74
  end
75
75
  return rv
76
- else
76
+ else
77
77
  if index_or_hash
78
78
  return to_a[index_or_hash]
79
79
  end
@@ -87,27 +87,27 @@ module Workbook
87
87
  # row[:a] #=> <Cell value="a">
88
88
  #
89
89
  # @param [Fixnum, Symbol] index_or_hash
90
- # @param [String, Fixnum, NilClass, Date, DateTime, Time, Float] value
90
+ # @param [String, Fixnum, NilClass, Date, DateTime, Time, Float] value
91
91
  # @return [Workbook::Cell, nil]
92
92
  def []= (index_or_hash, value)
93
93
  index = index_or_hash
94
94
  if index_or_hash.is_a? Symbol
95
95
  index = table_header_keys.index(index_or_hash)
96
96
  end
97
-
97
+
98
98
  value_celled = Workbook::Cell.new
99
99
  if value.is_a? Workbook::Cell
100
100
  value_celled = value
101
101
  else
102
102
  current_cell = self[index]
103
103
  if current_cell.is_a? Workbook::Cell
104
- value_celled = current_cell
104
+ value_celled = current_cell
105
105
  end
106
106
  value_celled.value=(value)
107
107
  end
108
108
  super(index,value_celled)
109
109
  end
110
-
110
+
111
111
  # Returns an array of cells allows you to find cells by a given color, normally a string containing a hex
112
112
  #
113
113
  # @param [String] color a CSS-style hex-string
@@ -119,44 +119,44 @@ module Workbook
119
119
  r = Row.new cells
120
120
  options[:hash_keys] ? r.to_symbols : r
121
121
  end
122
-
123
- # Returns true when the row belongs to a table and it is the header row (typically the first row)
122
+
123
+ # Returns true when the row belongs to a table and it is the header row (typically the first row)
124
124
  #
125
125
  # @return [Boolean]
126
126
  def header?
127
127
  table != nil and self.object_id == table.header.object_id
128
128
  end
129
-
129
+
130
130
  # Is this the first row in the table
131
- #
131
+ #
132
132
  # @return [Boolean, NilClass] returns nil if it doesn't belong to a table, false when it isn't the first row of a table and true when it is.
133
133
  def first?
134
134
  table != nil and self.object_id == table.first.object_id
135
135
  end
136
-
136
+
137
137
  # Returns true when all the cells in the row have values whose to_s value equals an empty string
138
138
  #
139
139
  # @return [Boolean]
140
140
  def no_values?
141
141
  all? {|c| c.value.to_s == ''}
142
142
  end
143
-
143
+
144
144
  # Converts a row to an array of symbol representations of the row content, see also: Workbook::Cell#to_sym
145
145
  # @return [Array<Symbol>] returns row as an array of symbols
146
146
  def to_symbols
147
147
  collect{|c| c.to_sym}
148
148
  end
149
-
149
+
150
150
  # Converts the row to an array of Workbook::Cell's
151
151
  # @return [Array<Workbook::Cell>] returns row as an array of symbols
152
152
  def to_a
153
153
  self.collect{|c| c}
154
154
  end
155
-
155
+
156
156
  def table_header_keys
157
157
  table.header.to_symbols
158
158
  end
159
-
159
+
160
160
  # Returns a hash representation of this row
161
161
  #
162
162
  # @return [Hash]
@@ -168,36 +168,66 @@ module Workbook
168
168
  keys.each_with_index {|k,i| @hash[k]=values[i]}
169
169
  return @hash
170
170
  end
171
-
171
+
172
172
  # Compares one row wiht another
173
173
  #
174
174
  # @param [Workbook::Row] other row to compare against
175
- # @return [Workbook::Row] a row with the diff result.
175
+ # @return [Workbook::Row] a row with the diff result.
176
176
  def <=> other
177
177
  a = self.header? ? 0 : 1
178
178
  b = other.header? ? 0 : 1
179
179
  return (a <=> b) if (a==0 or b==0)
180
180
  compare_without_header other
181
181
  end
182
-
182
+
183
183
  # The first cell of the row is considered to be the key
184
184
  #
185
185
  # @return [Workbook::Cell] the key cell
186
186
  def key
187
187
  first
188
188
  end
189
-
189
+
190
190
  # Compact detaches the row from the table
191
191
  def compact
192
192
  r = self.clone
193
193
  r = r.collect{|c| c unless c.nil?}.compact
194
194
  end
195
-
195
+
196
196
  # clone the row with together with the cells
197
197
  #
198
198
  # @return [Workbook::Row] a cloned copy of self with cells
199
199
  def clone
200
200
  Workbook::Row.new(to_a.collect{|c| c.clone})
201
201
  end
202
+
203
+ # remove all the trailing nil-cells (returning a trimmed clone)
204
+ #
205
+ # @param [Integer] desired_length of the new row
206
+ # @return [Workbook::Row] a trimmed clone of the array
207
+ def trim(desired_length=nil)
208
+ self.clone.trim!(desired_length)
209
+ end
210
+
211
+ # remove all the trailing nil-cells (returning a trimmed self)
212
+ #
213
+ # @param [Integer] desired_length of the new row
214
+ # @return [Workbook::Row] self
215
+ def trim!(desired_length=nil)
216
+ self_count = self.count-1
217
+ self.count.times do |index|
218
+ index = self_count - index
219
+ if desired_length and index < desired_length
220
+ break
221
+ elsif desired_length and index >= desired_length
222
+ self.delete_at(index)
223
+ elsif self[index].nil?
224
+ self.delete_at(index)
225
+ else
226
+ break
227
+ end
228
+ end
229
+ (desired_length - self.count).times{|a| self << (Workbook::Cell.new(nil))} if desired_length and (desired_length - self.count) > 0
230
+ self
231
+ end
202
232
  end
203
233
  end