Как конвертировать CSV в Excel?

Есть ли в Ruby плагин, который конвертирует CSV-файл в Excel. Я немного поработал с Google, но все, что я нашел, это конвертирование файла Excel в CSV. Я знаю немного драгоценных камней, которые я могу немного подправить и использовать для преобразования Excel в CSV, но мне нужно знать, делал ли это кто-то раньше.

 John Douthat05 июн. 2012 г., 10:55
@texasbruce Excel OLE автоматизация только для Windows, и большинство людей используют Ruby на Mac или Linux. Также требуется платная лицензия, в то время как другие варианты бесплатны. Запуск с OLE также имеет проблемы, например, если вам нужно повторно активировать Office, запуск с OLE приведет к зависанию Excel на неопределенный срок, что потребует ручного вмешательства, чтобы он снова заработал.
 texasbruce05 июн. 2012 г., 08:51
Почему вы просто не используете OLE? Excel может открывать CSV-файлы и напрямую сохранять их в формате xlsx ...
 John Douthat05 июн. 2012 г., 08:52
@ IgnacioVazquez-Abrams Excel часто искажает данные CSV. Он будет сбрасывать начальные нули, преобразовывать строчные / истинные / ложные в верхние, преобразовывать большие числа в научную запись и, возможно, больше. Отправляя пользователю файл XLS, вы можете контролировать форматирование и избежать потери данных.
 Ignacio Vazquez-Abrams12 апр. 2012 г., 08:24
Обычно мы просто позволяем Excel импортировать CSV. Обычно это просто работает.
 Martin Carpenter12 апр. 2012 г., 09:18
Другая почти нативная альтернатива: импорт XML может привести к «хорошему» Excel документы тоже. Я передаю вывод из Rails & apos; #to_xml в XSLT для этого.

Ответы на вопрос(3)

CEL, вы можете попытаться найти два драгоценных камня по отдельности.

Read/Write CSV(For reading CSV file) e.g. FasterCSV Read/Write EXCEL(For write EXCEL file) e.g. SpreadSheet
 12 апр. 2012 г., 14:44
Обратите внимание, что теперь FasterCSV встроен в Ruby 1.9 какrequire "csv" в стандартной библиотеке.

Open the CSV using your favorite text editor like Sublime Text. Notepad is okay Replace all , (comma) to a tab \t Save as it with extension .xls Open the file using Excel and TADA! Here you go!
Решение Вопроса

В соответствии сэта почта,таблица Драгоценный камень это возможность. Похоже, это очень популярная жемчужина. Проверьте это. Пример:

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)

В соответствии сэта почта, write_xlsx это возможность.

Я использовалApache POI библиотека с JRuby для экспорта файлов 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), but beware, if you're running in headless mode, you have to call java.lang.System.setProperty("java.awt.headless", "true")

Вы также можете использовать Win32ole в Windows, если у вас установлен Excel

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

Некоторые полезные методы для форматирования в Excel

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

Еще один вариант заключается в том, чтобы писать напрямую в Microsoft.XML Spreadsheet формат, как это делает Райан Бейтс на Railscasts.comв конце его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>

Этот драгоценный камень тоже выглядит многообещающе.

 12 апр. 2012 г., 09:22
Кажется, что если вы все равно используете win32ole, вы можете просто «открыть». CSV-файл в Excel и сохранить его как XLS. Я не уверен, каким будет код.
 Bhushan Lodha12 апр. 2012 г., 14:03
Есть еще одна жемчужина, которую я нашел, writeexcel сделал работу очень легко .. Еще раз спасибо.
 12 апр. 2012 г., 09:40
Хорошая точка зрения. Я надеялся просто сделать пример похожим на приведенный выше, но открыть CSV непосредственно в Excel - более разумная идея.

Ваш ответ на вопрос