From a9d5755886470e5a909d06460f29e30a886eb39e Mon Sep 17 00:00:00 2001 From: Nicolas Bally Date: Fri, 18 Sep 2020 08:59:28 +0200 Subject: [PATCH] Export XLSX --- .../admin/p_customers_controller.rb | 85 +++++++++++++------ 1 file changed, 57 insertions(+), 28 deletions(-) diff --git a/app/controllers/admin/p_customers_controller.rb b/app/controllers/admin/p_customers_controller.rb index 3d7b44a..50ade6e 100644 --- a/app/controllers/admin/p_customers_controller.rb +++ b/app/controllers/admin/p_customers_controller.rb @@ -402,42 +402,47 @@ class Admin::PCustomersController < ApplicationController end - - - @csv = CSV.generate(:headers => true, :col_sep => ";") do |csv| - csv << @headers - - @p_customers.each do |p_customer| - line = [] - - @columns.each do |column| + + + xlsx_package = Axlsx::Package.new + wb = xlsx_package.workbook + wb.add_worksheet(name: "import") do |sheet| + sheet.add_row @headers - if (p_customer.respond_to?("csv_"+column.to_s)) - line << p_customer.send("csv_"+column.to_s) - elsif (p_customer.respond_to?(column)) - if p_customer.send(column.to_s).class.to_s == "BigDecimal" - line << p_customer.send(column.to_s).to_s.gsub('.', ',') + @p_customers.each do |p_customer| + line = [] + + @columns.each do |column| + + if (p_customer.respond_to?("csv_"+column.to_s)) + line << p_customer.send("csv_"+column.to_s) + elsif (p_customer.respond_to?(column)) + if p_customer.send(column.to_s).class.to_s == "BigDecimal" + line << p_customer.send(column.to_s).to_s.gsub('.', ',') + else + line << p_customer.send(column.to_s) + end else - line << p_customer.send(column.to_s) + line << column.to_s end - else - line << column.to_s - end - end + end - csv << line + + sheet.add_row line, types: line.map{|t| self.cell_type_from_value(t)} + end + + end - - - end - - - @data_to_send = @csv + + @final_file = "#{Rails.root}/private_medias/export-inscrits-#{Time.now.to_s.to_slug}.xlsx" - send_data @data_to_send.to_s, :filename => "export-csv.csv", :type => :csv #, :type => 'text/csv; charset=iso-8859-1; header=present' - #"\uFEFF" + + + xlsx_package.serialize(@final_file) + + send_file @final_file + } @@ -447,6 +452,30 @@ class Admin::PCustomersController < ApplicationController end end + + + def cell_type_from_value(v) + if v.is_a?(Date) + :date + elsif v.is_a?(String) + :string + elsif v.is_a?(Time) + :time + elsif v.is_a?(TrueClass) || v.is_a?(FalseClass) + :boolean + elsif v.to_s =~ /\A[+-]?\d+?\Z/ #numeric + :integer + elsif v.to_s =~ /\A[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?\Z/ #float + :float + # \A(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[0-1]|0[1-9]|[1-2][0-9]) + # T(2[0-3]|[0-1][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)? + # (Z|[+-](?:2[0-3]|[0-1][0-9]):[0-5][0-9])?\Z + elsif v.to_s =~/\A(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[0-1]|0[1-9]|[1-2][0-9])T(2[0-3]|[0-1][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?(Z|[+-](?:2[0-3]|[0-1][0-9]):[0-5][0-9])?\Z/ + :iso_8601 + else + :string + end + end def show @p_customer = PCustomer.find(params[:id])