eng рус  
small_logo

Разработка приложений с помощью Ruby on Rails™


Экспорт данных в формате XLS

Регулярная задача — экспорт данных (профили пользователей, заказы, товары) из вашего приложения. В большинстве случаев для этого используется как “носитель” формат CSV.

Если задача требует формата с большими возможностями, чем CSV, а кроме того, чтобы файл открывался как “родной” в Microsoft Excel, можно использовать файл формата XML, со специальной разметкой.

Задача

Рассмотрим задачу: в панели управления, менеджер имеет кнопку “Экспортировать все заказы”. При нажатии на эту кнопку он должен получить файл со всеми заказами, сделанными в элекронном магазине. Файл должен легко открываться в Microsoft Excel.

И так, алгоритм генерации CSV понятен и прост:

  1. получаем набор информации из базы данных,
  2. выводим каждую запись из нашего набора, разделяя ее поля знаком табуляции и точкой с запятой.

При генерации требуемого XML изменяется второй этап. Рассмотрим примеры кода.

Код

Контроллер orders_controller.rb

def report
    headers['Content-Type'] = "application/vnd.ms-excel"
    headers['Content-Disposition'] = "attachment; filename=\"export.xls\""
    headers['Cache-Control'] = ''

    @columns = ["Дата", "Время", "Товар", "Количество", "Покупатель"]
    @orders = Order.find :all
    render :layout => false
  end

Представление report.xml.builder

xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
xml.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:html' => "http://www.w3.org/TR/REC-html40",
    'xmlns:ss'   => "urn:schemas-microsoft-com:office:spreadsheet" 
}) do

    xml.Styles do
        xml.Style 'ss:ID' => 'Default', 'ss:Name' => 'Normal' do
            xml.Alignment 'ss:Vertical' => 'Bottom'
            xml.Borders
            xml.Font 'ss:FontName' => 'Verdana'
            xml.Interior
            xml.NumberFormat
            xml.Protection
        end
        xml.Style 'ss:ID' => 's22' do
            xml.NumberFormat 'ss:Format' => 'General Date'
        end
    end

    xml.Worksheet 'ss:Name' => "Orders" do
        xml.Table do

            # Header
            xml.Row do
                for column in @columns do
                    xml.Cell do
                        xml.Data column, 'ss:Type' => 'String'
                    end
                end
            end

            # Rows
            for order in @orders
                xml.Row do
                    xml.Cell do xml.Data order.visit.strftime('%d.%m.%Y'), 'ss:Type' => 'String' end
                    xml.Cell do xml.Data order.visit.strftime('%H:%M'), 'ss:Type' => 'String' end
                    xml.Cell do xml.Data order.offer, 'ss:Type' => 'String' end
                    xml.Cell do xml.Data order.quantity, 'ss:Type' => 'String' end
                    xml.Cell do xml.Data order.customer, 'ss:Type' => 'String' end
                end
            end
        end
    end
end

Теперь, если вызвать orders/report браузер предложит сохранить сгенерированный файл.

Расширение .xls, у получаемого файла, позволит без проблем открыть его в Microsoft Excel (протестировано в версиях XP и 2007)

Дополнительно

Такой метод генерации позволяет не только получать файл с данными, но и применять некоторое форматирование эти данных.

Статья основана на опыте применения метода из материалов wiki.rubyonrails.org

Приятной работы вам!

5 комментариев к “Экспорт данных в формате XLS”

Оставьте свой комментарий

(не будет опубликовано)

О нас Проекты Блог Контакты
© 2008, команда hashtrain.com