2012-04-12 14 views
8

¿Hay algún complemento en Ruby que convierta un archivo CSV en Excel? Hice poco Google, pero todo lo que encontré fue convertir el archivo de Excel en CSV. Conozco algunas gemas que puedo modificar un poco y usar para convertir Excel a CSV, pero necesito saber si alguien lo ha hecho antes.Cómo convertir CSV a Excel?

+3

Normalmente, solo dejamos que Excel importe el archivo CSV. Por lo general, solo funciona. –

+0

Otra alternativa casi nativa: la importación XML también puede producir documentos Excel "bonitos". Alimentar la salida de Rails '#to_xml en un XSLT para hacer esto. –

+0

Posible pregunta duplicada: http://stackoverflow.com/questions/6646430/whats-the-easiest-way-to-export-a-csv-to-excel-with-ruby –

Respuesta

10

De acuerdo con this post, la gema spreadsheet es una posibilidad. Parece que esta es una joya muy popular. Echale un vistazo. Ejemplo:

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) 

Según this post, write_xlsx es una posibilidad.

He usado el Apache POI library con JRuby para exportar archivos xls. Aquí hay un ejemplo rápido.

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 

Algunos métodos útiles para el formato de las hojas de cálculo de puntos de interés son

  • sheet.createFreezePane(0,1,0,1)
  • wb.setRepeatingRowsAndColumns(0, -1, -1, 0, 1)
  • sheet.setColumnWidth(i, 100 *256)
  • sheet.autoSizeColumn(i), pero cuidado, si se está ejecutando en el modo sin cabeza, que tiene que llame al java.lang.System.setProperty("java.awt.headless", "true")

Puede también utilizar Win32ole en Windows, si tiene Excel instalado

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. i.e. xls 
wb.SaveAs("workbook.xlsx", 51) # 51 = xlOpenXMLWorkbook 
wb.SaveAs("workbook.xlsb", 50) # 50 = xlExcel12 

wb.Close(2) #xlDoNotSaveChanges 
xl.Quit 

Algunos métodos útiles para formatear con Excel está

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

embargo Otra opción es escribir directamente en el XML Spreadsheet de Microsoft formato, como Ryan Bates en Railscasts.com hace at the end of his Exporting CSV and Excel episode.

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

This gem looks promising, too.

+2

Parece que si está usando win32ole de todos modos podría simplemente 'abrir' el archivo csv en Excel y guardarlo como xls. Aunque no estoy seguro de lo que sería el código. – pguardiario

+0

Buen punto. Esperaba que el ejemplo fuera similar al anterior, pero abrir el CSV directamente en Excel es una idea más inteligente. –

+0

Hay una gema más que encontré writeexcel hizo el trabajo muy fácilmente .. Gracias de nuevo. –

2

Si no encuentra ninguna joya para convertir CSV a EXCEL, entonces puede tratar de encontrar dos gemas separado

  1. lectura/escritura CSV (Para leer el archivo CSV) por ejemplo, FasterCSV
  2. Lectura/Escritura EXCEL (para el archivo EXCEL de escritura) p. SpreadSheet
+1

Tenga en cuenta que FasterCSV está integrado en Ruby 1.9 ahora como 'require" csv "' en la biblioteca estándar. – Phrogz