如何将CSV转换为Excel?

Ruby中是否有插件将CSV文件转换为Excel。 我做了一点谷歌,但我发现所有转换成Excel文件到CSV。 我知道我可以稍微调整一些gem,用来将Excel转换为CSV,但是我需要知道是否有人以前做过这些。

根据这个post , 电子表格gem是一种可能性。 看起来这是一个非常受欢迎的gem。 一探究竟。 例:

book = Spreadsheet::Workbook.new sheet1 = book.create_worksheet header_format = Spreadsheet::Format.new( :weight => :bold, :horizontal_align => :center, :bottom => true, :locked => true ) sheet1.row(0).default_format = header_format FasterCSV.open(input_path, 'r') do |csv| csv.each_with_index do |row, i| sheet1.row(i).replace(row) end end book.write(output_path) 

根据这个post , write_xlsx是一种可能性。

我已经使用JRuby的Apache POI库来导出xls文件。 这是一个简单的例子。

 require 'java' require 'poi.jar' # require 'poi-ooxml.jar' require 'rubygems' require 'fastercsv' java_import org.apache.poi.hssf.usermodel.HSSFWorkbook; wb = HSSFWorkbook.new # OR XSSFWorkbook, for xlsx sheet = wb.create_sheet('Sheet 1') FasterCSV.open(ARGV.first) do |csv| csv.each_with_index do |csv_row, line_no| row = sheet.createRow(line_no) csv_row.each_with_index do |csv_value, col_no| cell = row.createCell(col_no) cell.setCellValue(csv_value) unless csv_value.nil? # can't pass nil. end end end f = java.io.FileOutputStream.new("workbook.xls") wb.write(f) f.close 

一些有用的格式化POI电子表格的方法是

  • sheet.createFreezePane(0,1,0,1)
  • wb.setRepeatingRowsAndColumns(0, -1, -1, 0, 1)
  • sheet.setColumnWidth(i, 100 *256)
  • sheet.autoSizeColumn(i) ,但要小心,如果你在无头模式下运行,你必须调用java.lang.System.setProperty("java.awt.headless", "true")

如果您安装了Excel,也可以在Windows上使用Win32ole

 require 'win32ole' require 'rubygems' require 'fastercsv' xl = WIN32OLE.new('Excel.Application') xl.Visible = 0 wb = xl.Workbooks.Add ws = wb.Worksheets(1) FasterCSV.open(ARGV.first) do |csv| csv.each_with_index do |csv_row, line_no| csv_row.each_with_index do |value, col| ws.Cells(line_no + 1, col + 1).Value = value end end end wb.SaveAs("workbook.xls", 56) # 56 = xlExcel8 aka Excel 97-2003. ie xls wb.SaveAs("workbook.xlsx", 51) # 51 = xlOpenXMLWorkbook wb.SaveAs("workbook.xlsb", 50) # 50 = xlExcel12 wb.Close(2) #xlDoNotSaveChanges xl.Quit 

用Excel格式化一些有用的方法是

  • xl.Rows(1).Font.Bold = true
  • ws.Cells.EntireColumn.AutoFit

另外一个select是直接写入微软的XML Spreadsheet格式,就像Railscasts.com的Ryan Bates在导出CSV和Excel的时候那样

 <?xml version="1.0"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <Worksheet ss:Name="Sheet1"> <Table> <Row> <Cell><Data ss:Type="String">ID</Data></Cell> <Cell><Data ss:Type="String">Name</Data></Cell> <Cell><Data ss:Type="String">Release Date</Data></Cell> <Cell><Data ss:Type="String">Price</Data></Cell> </Row> <% @products.each do |product| %> <Row> <Cell><Data ss:Type="Number"><%= product.id %></Data></Cell> <Cell><Data ss:Type="String"><%= product.name %></Data></Cell> <Cell><Data ss:Type="String"><%= product.released_on %></Data></Cell> <Cell><Data ss:Type="Number"><%= product.price %></Data></Cell> </Row> <% end %> </Table> </Worksheet> </Workbook> 

这颗gem看起来也很有希望 。

如果你没有find任何将CSV转换为EXCEL的gem,那么你可以尝试分别find两个gem

  1. 读取/写入CSV(用于读取CSV文件)例如FasterCSV
  2. 读取/写入EXCEL(用于写入EXCEL文件)例如SpreadSheet