Ruby: работа с Excel (xls) и CSV

Для работы с Excel использовал gem Spreadsheet. Для работы с CSV достаточно системной библиотеки CSV.

Гем  Spreadsheet самый популярный, но не сказать что функциональный – нет поддержки xlsx, нельзя включить autofilter поля, нет создания caviat table (сводные отчеты). Первые два есть в PHPExcel, поэтому гему “не зачет”. Если все это (и другое) необходимо – есть gem Axlsx, который явно больше прокачан по функционалу.

 

Установка

sudo gem install spreadsheet

 

Работа с CSV

# открываем файл, каждая строка является массивом, каждая ячейкам – элементом массива

csv.foreach("csv.csv") do |line|
puts line.inspect
end

# если нам нужно сохранить весь файл в двумерный массив (array, в нем строки в виде отдельных array) – просто вызываем read. В последующем с ним можно работать как с обычным array – делать поиск в нем/модифицировать и т.д.

arr = CSV.read("csv.csv")

# Добавляем данные в конец array.

CSV.open("csv.csv", "a"| do |arr|
add = [ "1", "2" ]
arr.add_row(add)
end

 

Код конвертации с CSV в XLS

Сделал консольный скрипт csv_to_xls.rb по конвертации CSV в XLS с настройками форматирования столбцов.

Usage:

csv_to_xls.rb test.csv test.xls

Код, основа отсюда:

#!/usr/bin/env ruby 
#coding: utf-8

require 'spreadsheet' 
require 'csv' # Встроенная библиотека, установка не обязательна

csv_path = ARGV[0] 
xls_path = ARGV[1] 
book = Spreadsheet::Workbook.new 
sheet1 = book.create_worksheet(:name => 'Sheet1') # Можно имя и не указывать

# Построчно ковертируем CSV в XLS 
CSV.open('/home/user/test.csv', 'r', {:col_sep => ";"}) do |csv| 
 csv.each_with_index do |row, i| 
  sheet1.row(i).replace(row) 
 end 
end

# sheet2[1,4] = Spreadsheet::Link.new 'www.google.com', '2017-03-13' # <чтобы не потерять> Можно сделать линк, указав [строку, ряд] ячейки

# Делаем шаблон для форматирования header
header_format = Spreadsheet::Format.new( 
 :weight => :bold, 
 :horizontal_align => :center, 
 :locked => true, 
 :text_wrap => true # Перенос по словам
 :pattern_fg_color => :silver, :pattern => 1 # Серый цвет
 #:number_format => 'YYYY.MM.DD' # Формат даты
)

# Для форматирования остальных столбцов
other_format = Spreadsheet::Format.new( 
 :text_wrap => true # perenos po slovam!
)

# Применяем формат к столбцам
sheet1.row(0).default_format = header_format 
sheet1.column(0).default_format = other_format 
sheet1.column(1).default_format = other_format 
sheet1.column(2).default_format = other_format 
sheet1.column(3).default_format = other_format 
sheet1.column(4).default_format = other_format 
sheet1.column(5).default_format = other_format 
sheet1.column(6).default_format = other_format 
sheet1.column(7).default_format = other_format 
sheet1.column(8).default_format = other_format

# Выставляем ширину столбцов
 sheet1.column(0).width = 20 
 sheet1.column(1).width = 40 
 sheet1.column(2).width = 15 
 sheet1.column(3).width = 5 
 sheet1.column(4).width = 10 
 sheet1.column(5).width = 10 
 sheet1.column(6).width = 40 

# Создаем файл
book.write('/home/user/test.xls')

Leave a Reply

Your email address will not be published. Required fields are marked *