From b8c1691bd781d347787610a1b43d71b745c2dfc9 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Wed, 9 Sep 2026 12:46:28 +0300 Subject: [PATCH] optimize xlsx export --- Gemfile | 3 ++- Gemfile.lock | 9 +++++---- config/initializers/autoload.rb | 2 +- lib/submissions/generate_export_files.rb | 19 ++++++++----------- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Gemfile b/Gemfile index e2d74068..99e771b9 100644 --- a/Gemfile +++ b/Gemfile @@ -36,7 +36,7 @@ gem 'rotp' gem 'rouge', require: false gem 'rqrcode', require: false gem 'ruby-vips' -gem 'rubyXL', require: false +gem 'rubyzip', require: false gem 'shakapacker' gem 'sidekiq' gem 'sqlite3', require: false @@ -45,6 +45,7 @@ gem 'trilogy', require: false gem 'turbo-rails' gem 'twitter_cldr', require: false gem 'tzinfo-data' +gem 'xlsxtream', require: false group :development, :test do gem 'better_html' diff --git a/Gemfile.lock b/Gemfile.lock index d320a892..5dc77e9f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -497,9 +497,6 @@ GEM ruby-vips (2.3.0) ffi (~> 1.12) logger - rubyXL (3.4.35) - nokogiri (>= 1.10.8) - rubyzip (>= 3.2.2) rubyzip (3.2.2) securerandom (0.4.1) semantic_range (3.1.1) @@ -575,10 +572,13 @@ GEM base64 websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) + xlsxtream (3.1.0) + zip_kit (>= 6.2, < 7) xpath (3.2.0) nokogiri (~> 1.8) yaml (0.4.0) zeitwerk (2.8.2) + zip_kit (6.3.4) PLATFORMS aarch64-linux @@ -638,7 +638,7 @@ DEPENDENCIES rubocop-rails rubocop-rspec ruby-vips - rubyXL + rubyzip shakapacker sidekiq simplecov @@ -650,6 +650,7 @@ DEPENDENCIES tzinfo-data web-console webmock + xlsxtream RUBY VERSION ruby 4.0.5 diff --git a/config/initializers/autoload.rb b/config/initializers/autoload.rb index 99dc4962..fd307b35 100644 --- a/config/initializers/autoload.rb +++ b/config/initializers/autoload.rb @@ -2,7 +2,7 @@ autoload :CSV, 'csv' autoload :CSVSafe, 'csv-safe' -autoload :RubyXL, 'rubyXL' +autoload :Xlsxtream, 'xlsxtream' autoload :Zip, 'zip' autoload :Numo, 'numo/narray' autoload :OnnxRuntime, 'onnxruntime' diff --git a/lib/submissions/generate_export_files.rb b/lib/submissions/generate_export_files.rb index f1096db2..57e751b4 100644 --- a/lib/submissions/generate_export_files.rb +++ b/lib/submissions/generate_export_files.rb @@ -19,22 +19,19 @@ module Submissions end def rows_to_xlsx(rows) - workbook = RubyXL::Workbook.new - worksheet = workbook[0] - worksheet.sheet_name = Time.current.to_date.to_s - headers = build_headers(rows) - headers.each_with_index do |column_name, column_index| - worksheet.add_cell(0, column_index, column_name) - end - rows.each.with_index(1) do |row, row_index| - extract_columns(row, headers).each_with_index do |value, column_index| - worksheet.add_cell(row_index, column_index, value) + io = StringIO.new + + Xlsxtream::Workbook.open(io) do |workbook| + workbook.write_worksheet(Time.current.to_date.to_s) do |sheet| + sheet << headers.to_a + + rows.each { |row| sheet << extract_columns(row, headers) } end end - workbook.stream.string + io.string end def rows_to_csv(rows)