[RUBY] Speichern Sie Daten aus einer Excel-Datei mit Rails gem roo

Zweck

Wenn ein Benutzer mehrere Daten an die App senden möchte, möchte er in der Lage sein, eine Excel-Datei auszuwählen und in der Datenbank zu speichern.

Implementierung

Starten Sie die App

rails new sample_app -d postgresql
rails db:create

Erstellen Sie eine neue App mit neuen Schienen und erstellen Sie eine Datenbank.

Controller-Erstellung

rails g controller users index

Erstellen Sie einen Benutzercontroller mit einer Indexaktion. Der Router und die Ansicht werden ebenfalls zusammen erstellt.

Modellieren

rails g model user name:string email:string
rails db:migrate

Erstellen Sie den Namen des Zeichenfolgentyps und die E-Mail-Spalten in der Benutzertabelle.

Aussicht

html:app/views/users/index.html.erb


<h1>Benutzerliste</h1>

<table>
  <thead>
    <tr>
      <th>ID</th>
      <th>Name</th>
      <th>Email</th>
    </tr>
  </thead>
  <tbody>
    <% @users.each do |user| %>
      <tr>
        <td><%= user.id %></td>
        <td><%= user.name %></td>
        <td><%= user.email %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<%= form_with url: import_users_path, local: true do |form| %>
  <%= form.file_field :file %>
  <%= form.submit %>
<% end %>

Generierung nach dem Formular. Die Datei selbst wird nicht gespeichert, der Benutzer kann jedoch mit der Aktion: import registriert werden, die die Parameter [: file] gesendet hat.

Router

config/routes.rb


Rails.application.routes.draw do
  resources :users do
    collection do
      post :import
    end
  end
end

Fügen Sie dem Benutzer das Routing für die Aktion: import der Post-Methode hinzu.

Regler

app/controllers/users_controller.rb


class UsersController < ApplicationController
  def index
    @users = User.all
  end

  def import
    User.import(params[:file])
    redirect_to users_url
  end
end

Die Indexaktion ist dieselbe wie bei Verwendung von Scaffold. Rufen Sie alle Datensätze ab und weisen Sie sie @users zu. Die Importaktion verwendet params [: file] und verwendet die Importmethode, um einen Datensatz in der Benutzertabelle zu erstellen. Schreiben Sie die Definition der Importmethode in das Modell.

Modell-

app/models/user.rb


class User < ApplicationRecord
  def self.import(file)
    xlsx = Roo::Excelx.new(file.tempfile)
    xlsx.each_row_streaming(offset: 1) do |row|
      user = self.new(id: row[0].value, name: row[1].value, email: row[2].value)
      next if self.pluck(:id).include?(user.id)
      user.save
    end
  end
end

Da es sich um eine Modellmethode des Benutzermodells handelt, wird sie in Form von def self.import definiert. params [: file] .tempfile enthält den Pfad der gesendeten Datei. Lesen Sie die Datei mit Roo :: Excelx.new (file.tempfile) und weisen Sie sie der Variablen xlsx zu. Führt die Verarbeitung für jede Zeile der Datei aus, die von der Methode each_row_streaming gelesen wird. Mit der Option Versatz können Sie die Anzahl der Zeilen angeben, die die Verarbeitung überspringen sollen (das Elementfeld in der ersten Zeile überspringen). Wenn dieselbe ID in der Benutzertabelle in next if self.pluck (: id) .include? (User.id) vorhanden ist, wird der Prozess übersprungen.

Machen Sie sich bereit, Gem Roo zu verwenden.

Gebrauchsfertig gem roo

Gemfile


gem "roo" #Nachtrag

Bundle-Installation im Terminal. Fügen Sie außerdem require "roo" zu config / application.rb hinzu

config/application.rb


#Kürzung
require 'rails/all'
require "roo"
#Kürzung

Das ist in Ordnung.

Bestätigung

Starten Sie den Server, greifen Sie auf "http: // localhost: 3000 / users" zu und überprüfen Sie den Bildschirm.

test.png Sie können Daten aus den folgenden Excel-Dateien registrieren, indem Sie auf Datei auswählen klicken. エクセル.PNG Überprüfen Sie nach der Registrierung, ob sich der Bildschirm wie folgt geändert hat. test.png

Referenzartikel

https://qiita.com/seitarooodayo/items/c9d6955a12ca0b1fd1d4 https://qiita.com/guri3/items/f20487516311b2a3db37 Es war sehr hilfreich! Vielen Dank!

Nachtrag

Ich werde es anwenden und eine Funktion erstellen, um die Mitarbeiterliste sofort in der Anwendung zu registrieren.

Recommended Posts

Speichern Sie Daten aus einer Excel-Datei mit Rails gem roo
[Schienen] Speichern Sie Bilder mit Carrierwave
Hinzufügen und Speichern von Rails-Datenbankerstellung
[Schienen] Verwalten Sie mehrere Modelle mit einem Edelstein
Datenverarbeitung mit der Stream-API von Java 8
Fügen Sie Daten mithilfe der Yaml-Datei in die Datenbank ein
[Rails] Verwalten Sie Daten für jede Seed-Datei
Implementieren Sie eine Freigabeschaltfläche in Rails 6, ohne Gem zu verwenden
[Schienen] Anzeige von mehrstufigen Strukturdaten über das Auswahlfeld
[Rails] Erstellen einer Brotkrumenliste mit Gem gretel