workbook 0.4.2 → 0.4.3

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.
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