我使用的是 Rails 5 (Ruby 2.4)。我想阅读 .xls 文档,并且希望将数据转换为 CSV 格式,就像在 Excel 文件中显示的那样。有人推荐我使用 Roo,所以我就这么做了
book = Roo::Spreadsheet.open(file_location)
sheet = book.sheet(0)
text = sheet.to_csv
arr_of_arrs = CSV.parse(text)
然而,返回的内容与我在电子表格中看到的不同。例如,电子表格中的一个单元格有
16:45.81
当我从上面获取 CSV 数据时,返回的是
"0.011641319444444444"
如何解析 Excel 文档并准确获取我所看到的内容?我不在乎是否使用 Roo 进行解析,只要我可以获得 CSV 数据,它代表我所看到的内容,而不是一些奇怪的内部表示。作为参考,当我运行“file name_of_file.xls”时,我正在解析的文件类型给出了这一点...
Composite Document File V2 Document, Little Endian, Os: Windows, Version 5.1, Code page: 1252, Author: Dwight Schroot, Last Saved By: Dwight Schroot, Name of Creating Application: Microsoft Excel, Create Time/Date: Tue Sep 21 17:05:21 2010, Last Saved Time/Date: Wed Oct 13 16:52:14 2010, Security: 0
您需要将自定义公式以文本格式保存在 .xls 端。如果您从互联网打开 .xls 文件,这将不起作用,但如果您可以操作该文件,这将解决您的问题。您可以使用该功能来做到这一点=TEXT(A2, "mm:ss.0")
A2 只是我用作示例的单元格。
book = ::Roo::Spreadsheet.open(file_location)
puts book.cell('B', 2)
=> '16.45.8'
如果操作文件不是一个选项,您可以将自定义转换器传递给CSV.new()
并将小数时间转换回您需要的正确格式。
require 'roo-xls'
require 'csv'
CSV::Converters[:time_parser] = lambda do |field, info|
case info[:header].strip
when "time" then begin
# 0.011641319444444444 * 24 hours * 3600 seconds = 1005.81
parse_time = field.to_f * 24 * 3600
# 1005.81.divmod(60) = [16, 45.809999999999999945]
mm, ss = parse_time.divmod(60)
# returns "16:45.81"
time = "#{mm}:#{ss.round(2)}"
time
rescue
field
end
else
field
end
end
book = ::Roo::Spreadsheet.open(file_location)
sheet = book.sheet(0)
csv = CSV.new(sheet.to_csv, headers: true, converters: [:time_parser]).map {|row| row.to_hash}
puts csv
=> {"time "=>"16:45.81"}
{"time "=>"12:46.0"}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)