28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
# File 'lib/webdrone/form.rb', line 28
def save(filename:, sheet:, item:, name: 'ITEM')
prev = @data
data = {}
@data = data
yield
ensure
File.open(".#{filename}.lock", File::RDWR | File::CREAT, 0o644) do
items = {}
items[item] = data
begin
workbook = RubyXL::Parser.parse(filename)
worksheet = workbook[sheet]
worksheet ||= workbook.add_worksheet sheet
rescue StandardError
workbook = RubyXL::Workbook.new
worksheet = workbook[0]
worksheet.sheet_name = sheet
end
rows = worksheet.sheet_data.rows.collect do |row|
row.cells.collect do |cell|
cell&.value
end
end
heads = rows.shift || []
rows.each do |row|
item = {}
key = nil
row.each_with_index do |val, i|
val = val.to_s if val
if i.zero?
key = val
elsif key
items[key] = {} unless items[key]
items[key][heads[i]] = val if !heads[i].nil? && items[key][heads[i]].nil?
end
end
end
x = heads.shift
x ||= name
worksheet.add_cell 0, 0, x
heads += data.keys.sort
heads = heads.uniq
heads.each_with_index do |field, coli|
worksheet.add_cell 0, coli + 1, field
end
worksheet.change_row_bold 0, true
items.each_with_index do |elem, rowi|
key, item = elem
worksheet.add_cell rowi + 1, 0, key
heads.each_with_index do |field, coli|
worksheet.add_cell rowi + 1, coli + 1, item[field]
end
end
workbook.write filename
end
@data = prev
end
|