[RUBY] Enregistrer les données d'un fichier Excel à l'aide de Rails Gem Roo

Objectif

Lorsqu'un utilisateur souhaite publier plusieurs données sur l'application, il souhaite pouvoir sélectionner un fichier Excel et l'enregistrer dans la base de données.

la mise en oeuvre

Lancez l'appli

rails new sample_app -d postgresql
rails db:create

Créez une nouvelle application avec des rails new et créez une base de données.

Création de contrôleur

rails g controller users index

Créez un contrôleur utilisateur avec une action d'index. Le routeur et la vue sont également créés ensemble.

La modélisation

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

Créez des colonnes de nom de type chaîne et d'e-mail dans la table des utilisateurs.

Vue

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


<h1>Liste d'utilisateur</h1>

<table>
  <thead>
    <tr>
      <th>ID</th>
      <th>Nom</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 %>

Post-génération du formulaire. Il n'enregistre pas le fichier lui-même, mais permet à l'utilisateur d'être enregistré avec l'action: importer qui a envoyé les paramètres [: fichier].

routeur

config/routes.rb


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

Ajoutez le routage pour l'action: import de la méthode Post à l'utilisateur.

manette

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

L'action d'indexation est la même que lors de l'utilisation de l'échafaudage, obtenez tous les enregistrements et attribuez-les à @users. L'action d'importation prend les paramètres [: fichier] et utilise la méthode d'importation pour créer un enregistrement dans la table des utilisateurs. Écrivez la définition de la méthode d'importation dans le modèle.

modèle

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

Puisqu'il s'agit d'une méthode modèle du modèle User, elle est définie sous la forme def self.import. params [: file] .tempfile contient le chemin du fichier envoyé. Lisez le fichier avec Roo :: Excelx.new (file.tempfile) et affectez-le à la variable xlsx. Exécute le traitement pour chaque ligne du fichier lu par la méthode each_row_streaming. Avec l'option de décalage, vous pouvez spécifier le nombre de lignes à ignorer le traitement (ignorer le champ d'élément sur la première ligne). Si le même identifiant existe dans la table des utilisateurs dans next if self.pluck (: id) .include? (User.id), le processus est ignoré.

Préparez-vous à utiliser gem roo.

Gem Roo prêt à l'emploi

Gemfile


gem "roo" #Postscript

Installation groupée dans le terminal. Ajoutez également require "roo" à config / application.rb

config/application.rb


#réduction
require 'rails/all'
require "roo"
#réduction

C'est acceptable.

Vérification

Démarrez le serveur, accédez à "http: // localhost: 3000 / users" et vérifiez l'écran.

test.png Vous pouvez enregistrer des données à partir des fichiers Excel suivants en appuyant sur Sélectionner un fichier. エクセル.PNG Après l'enregistrement, vérifiez que l'écran a changé comme suit. test.png

Article de référence

https://qiita.com/seitarooodayo/items/c9d6955a12ca0b1fd1d4 https://qiita.com/guri3/items/f20487516311b2a3db37 C'était vraiment utile! Je vous remercie!

Postscript

Je vais l'appliquer et créer une fonction pour enregistrer la liste des employés à la fois dans l'application.

Recommended Posts

Enregistrer les données d'un fichier Excel à l'aide de Rails Gem Roo
[Rails] Enregistrez des images à l'aide de carrierwave
Ajouter et enregistrer à partir de la création d'une base de données de rails
[Rails] Gérez plusieurs modèles à l'aide de la gemme de devise
Traitement des données à l'aide de l'API de flux de Java 8
Insérer des données dans la base de données à l'aide du fichier Yaml
[Rails] Gérez les données de chaque fichier de départ
Implémenter un bouton de partage dans Rails 6 sans utiliser Gem
[Rails] Affichage des données de structure à plusieurs niveaux à l'aide de la boîte de sélection
[Rails] Création d'une liste de miettes de pain à l'aide de Gem gretel