[JAVA] Comment créer un formulaire Excel à l'aide d'un fichier modèle avec Spring MVC

1.Tout d'abord

Cette fois, je vais vous expliquer comment créer un formulaire Excel à l'aide d'un fichier modèle avec Spring MVC = TERASOLUNA 5.x. Excel dans la directive TERASOLUNA 5.x "4.10.2.2. Télécharger le fichier Excel" Il existe une explication du formulaire, mais il s'agit d'une méthode pour créer un fichier Excel à partir de zéro par programme. Lors de la création d'un formulaire Excel, je pense qu'il est courant de préparer un fichier modèle à l'avance et d'y verser des données. Cette fois, je voudrais sortir le formulaire Excel en versant les données dans le fichier modèle suivant.

excel_report_template.jpg

Le système de référence est "terasolunaorg / terasoluna-tourreservation-mybatis3".

2. Code source

ExcelReportController.java


package com.example.reportdemo.app.report;

import java.io.File;
import java.io.IOException;
import javax.inject.Inject;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.example.reportdemo.domain.model.Reserve;
import com.fasterxml.jackson.databind.ObjectMapper;

@Controller
public class ExcelReportController {

    /**
     * [dummy]ObjectMapper pour lire les données de formulaire
     */
    @Inject
    ObjectMapper objectMapper;

    /**
     * [dummy]Fichier Json qui stocke les données du formulaire
     */
    @Value("${app.sample.jsonFile:C:/temp/excel/jsonData.json}")
    private File jsonDataFile;

    @RequestMapping(value = "report/excel", method = RequestMethod.GET)
    public String excelReport(Model model) {
        
        // 1. [dummy] get report data
        Reserve reserve = this.findReserve();
        // 2. set report data to model
        model.addAttribute(reserve);
        model.addAttribute("fileName", "Détails de la réservation.xlsx");
        // 3. return excel view bean's name
        return "reservationExcelView";
    }

    /**
     * [dummy]Créer des informations de réservation factices pour la sortie dans le formulaire
     * @réservation de retour
     */
    private Reserve findReserve() {
        Reserve reserve = null;
        try {
            reserve = objectMapper.readValue(jsonDataFile, Reserve.class);
            System.out.println(objectMapper.writeValueAsString(reserve));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return reserve;
    }
}

Normalement, pour sortir un formulaire, les données cibles sont acquises à partir de la base de données, mais dans cet exemple, j'ai décidé d'acquérir les données du fichier json sans omission. D'autres sont identiques à l'implémentation normale de "Controller". Les deux points suivants sont les points.

ReservationExcelView.java


package com.example.reportdemo.app.report;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.document.AbstractXlsxView;

import com.example.reportdemo.domain.model.Reserve;
import com.example.reportdemo.domain.model.TourInfo;

/**
 *★ Point 1
 */
@Component
public class ReservationExcelView extends AbstractXlsxView {

    private static final Logger LOGGER = LoggerFactory
            .getLogger(ReservationExcelView.class);

    /**
     *★ Point 2
     *Modèle Excel pour l'enregistrement des réservations de visites
     */
    @Value("${app.report.resevation.template:C:/temp/excel/reservation.xlsx}")
    private File excelTemplateFile;

    /**
     *★ Point 2
     *Mot de passe de lecture de fichier Excel
     */
    @Value("${app.report.resevation.pass:locked}")
    private String excelOpenPass;

    /**
     *★ Point 3
     * <p>
     *Créer un classeur à l'aide du modèle Excel spécifié dans excelTemplateFile
     * <p>
     *L'objet Workbook retourné par cette méthode est passé en tant qu'argument de la méthode buildExcelDocument.
     * @see org.springframework.web.servlet.view.document.AbstractXlsxView#createWorkbook(java.util.Map,
     *      javax.servlet.http.HttpServletRequest)
     */
    @Override
    protected Workbook createWorkbook(Map<String, Object> model,
            HttpServletRequest request) {
        Workbook workbook = null;
        try (InputStream is = new ByteArrayInputStream(
                Files.readAllBytes(excelTemplateFile.toPath()));) {
            workbook = WorkbookFactory.create(is);
            // workbook = WorkbookFactory.create(is, excelOpenPass);
            //Si le fichier est verrouillé par mot de passe, jce_policy-8.Besoin d'appliquer un zip
        } catch (IOException | EncryptedDocumentException
                | InvalidFormatException e) {
            LOGGER.error("create workbook error", e);
        }
        return workbook;
    }

    /**
     *★ Point 4
     * @see org.springframework.web.servlet.view.document.AbstractXlsView#buildExcelDocument(java.util.Map,
     *      org.apache.poi.ss.usermodel.Workbook, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    @Override
    protected void buildExcelDocument(Map<String, Object> model,
            Workbook workbook, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        //★ Point 5
        // 1.Obtenir les données de formulaire stockées dans Model
        Reserve reserve = (Reserve) model.get("reserve");
        TourInfo tourInfo = reserve.getTourInfo();

        //★ Point 6
        // 2.Sélection de feuilles
        Sheet sheet = workbook.getSheet("Réservation");

        //★ Point 7
        // 3.Définir les données dans la cellule
        //Définissez la valeur de "Numéro de réservation" dans la ligne 5 et la colonne F
        getCell(sheet, 4, 5).setCellValue(reserve.getReserveNo());

        //★ Point 8
        // 4.Définissez le nom du fichier dans l'en-tête de la réponse
        String fileName = (String) model.get("fileName");
        String encodedFilename = URLEncoder.encode(fileName, "UTF-8");
        response.setHeader("Content-Disposition","attachment; filename*=UTF-8''" + encodedFilename);

        //★ Point 7
        // 3.Définir les données dans la cellule
        //Définissez la valeur de "Date de réservation" sur 5 lignes et colonnes AA
        getCell(sheet, 4, 26).setCellValue(reserve.getReservedDay());
        //Nom de la tournée
        getCell(sheet, 5, 5).setCellValue(tourInfo.getTourName());
        //date de départ
        getCell(sheet, 6, 5).setCellValue(tourInfo.getDepDay());
        //Journées
        getCell(sheet, 6, 26).setCellValue(tourInfo.getTourDays());
        //Point de départ
        getCell(sheet, 7, 5).setCellValue(tourInfo.getDeparture().getDepName());
        //Destination
        getCell(sheet, 7, 26).setCellValue(tourInfo.getArrival().getArrName());
        //Chef de tournée
        getCell(sheet, 8, 5).setCellValue(tourInfo.getConductor());
        //Hôtel
        getCell(sheet, 9, 5)
                .setCellValue(tourInfo.getAccommodation().getAccomName());
        //Informations de contact
        getCell(sheet, 9, 26)
                .setCellValue(tourInfo.getAccommodation().getAccomTel());
        //Aperçu
        getCell(sheet, 10, 5).setCellValue(tourInfo.getTourAbs());
        // omitted
    }

    /**
     * <p>
     *Obtient et retourne la cellule spécifiée par le numéro de ligne et le numéro de colonne de la feuille spécifiée par l'argument.
     * <p>
     *Le numéro de ligne et le numéro de colonne commencent à 0
     * <p>
     *NullPointerException si la cellule n'est pas manipulée dans le modèle Excel
     * @feuille de paramétrage
     * @param rowIndex Numéro de ligne
     * @param colIndex Numéro de colonne
     * @cellule de retour
     */
    private Cell getCell(Sheet sheet, int rowIndex, int colIndex) {
        Row row = sheet.getRow(rowIndex);
        return row.getCell(colIndex);
    }

}

** ★ Point 1 ** ʻOrg.springframework.web.servlet.view.document.AbstractXlsxViews'étend pour définir votre propre classeView. Puisque la View implémentée nécessite une définition de Bean, ajoutez l'annotation de classe @ Component`.

** ★ Point 2 ** Définissez le fichier Excel à utiliser comme modèle en tant que ressource. Bien qu'il soit défini comme «Fichier», il peut être lu par «@ Value» au printemps. Si vous avez défini un mot de passe pour votre fichier Excel, définissez-le également. (option)

** ★ Point 3 ** Tel est le but de cet article. Remplacez la méthode createWorkbook pour créer un objet pour Workbook à partir d'un modèle Excel. Il s'agit simplement d'une opération POI. L'objet Workbook qui est la valeur de retour de cette méthode est passé comme argument à la méthode buildExcelDocument.

**(référence) Vous pouvez également utiliser un fichier Excel avec un mot de passe. Dans ce cas, WorkbookFactory.create (is," password ") créera un objet Workbook. Pour déverrouiller le mot de passe, il y a un problème avec la bibliothèque de cryptage (ceux avec un niveau de cryptage élevé sont soumis à des restrictions d'exportation) jce_policy-8.zip /downloads/jce8-download-2133166.html) doit être appliqué. ** **

** ★ Point 4 ** Remplacez la méthode buildExcelDocument et implémentez le processus pour créer un formulaire Excel.

** ★ Point 5 ** Récupérez les données à verser dans le formulaire à partir de Model. La liaison des données avec le contrôleur est effectuée via Model.

** ★ Point 6 ** C'est une opération POI. Tout d'abord, sélectionnez la feuille cible.

** ★ Point 7 ** Vous devez sélectionner une cellule pour définir les données. Dans l'exemple, nous avons préparé la méthode getCell. Définissez les données dans la cellule cible avec la méthode de POI setCellValue.

**(Mise en garde) Veuillez noter que les lignes et colonnes qui ne sont pas exploitées dans le fichier modèle Excel selon les spécifications du POI seront «nulles». Si vous pensez positivement, si vous obtenez une NullPointerException, vous avez trouvé un bug où vous avez sélectionné une autre cellule au lieu de celle que vous devriez définir. ** **

** ★ Point 8 ** Définissez le nom de fichier du fichier téléchargé dans l'en-tête de la réponse HTTP. Lorsque vous définissez le nom du fichier en japonais, encodez-le avec ʻutf-8. Si vous ne définissez pas de nom de fichier, le nom sera le chemin de la requête avec l'extension .xlsx. Dans l'exemple, le chemin est report / excel, donc ce sera ʻexcel.xlsx.

xml:Fichier de définition de bean (TERASOLUNA5.Pour x: printemps-mvc.xml)


    <!-- Settings View Resolver. -->
    <mvc:view-resolvers>
        <!--★ Point 9-->
        <mvc:bean-name />
        <mvc:jsp prefix="/WEB-INF/views/" />
    </mvc:view-resolvers>

** ★ Point 9 ** Ajoutez «<mvc: bean-name />» à la définition de «<mvc: view-resolvers>» dans le fichier de définition du bean. L'ordre d'écriture est également important. Assurez-vous de le définir avant <mvc: jsp>.

jsonData.json


{
  "reserveNo" : "12345678",
  "reservedDay" : "2018-01-10T07:02:15.919+0000",
  "adultCount" : 2,
  "childCount" : 1,
  "transfer" : 0,
  "sumPrice" : 75000,
  "remarks" : "Note",
  "tourInfo" : {
    "tourCode" : "00000001",
    "plannedDay" : "2017-01-10T07:02:15.919+0000",
    "planNo" : "0101",
    "tourName" : "Visite du paradis de Terra Solna",
    "tourDays" : 0,
    "depDay" : "2018-01-30",
    "avaRecMax" : 0,
    "basePrice" : 30000,
    "conductor" : 1,
    "tourAbs" : "Il y a un autre endroit, dans une auberge où le silence et la vapeur vous attendent ...\r\n Veuillez nous contacter pour plus d'informations.",
    "departure" : {
      "depCode" : "01",
      "depName" : "Hokkaido"
    },
    "arrival" : {
      "arrCode" : "02",
      "arrName" : "Aomori"
    },
    "accommodation" : {
      "accomCode" : "0001",
      "accomName" : "Hôtel TERASOLUNA à Daiichiso",
      "accomTel" : "018-123-4567"
    },
    "paymentLimit" : "2018-01-23"
  },
  "customer" : {
    "customerCode" : "00001234",
    "customerName" : "Yamada Taro",
    "customerKana" : "Yamada Taro",
    "customerPass" : null,
    "customerBirth" : "2000-07-07",
    "customerJob" : "Ventes",
    "customerMail" : "[email protected]",
    "customerTel" : "01-2345-6789",
    "customerPost" : "123-4567",
    "customerAdd" : "Toyosu, Koto-ku, Tokyo"
  }
}

Ce sont les données à verser dans le formulaire Excel. Ce n'est qu'un exemple, mais il est plus facile de modifier les données si vous lisez les données à partir de JSON.

3. Enfin

Cette fois, j'ai expliqué comment créer un formulaire Excel à l'aide d'un fichier modèle avec Spring MVC = TERASOLUNA 5.x. Le but est de remplacer la méthode createWorkbook pour créer un objetWorkbook à partir d'un fichier de modèle Excel.

Recommended Posts

Comment créer un formulaire Excel à l'aide d'un fichier modèle avec Spring MVC
Créer un fichier Excel avec POI
Comment créer un fichier jar et un fichier war à l'aide de la commande jar
[Rails 6] Comment créer un écran de saisie de formulaire dynamique à l'aide de cocoon
J'ai essayé de me connecter à MySQL en utilisant le modèle JDBC avec Spring MVC
[rails] Comment créer un modèle partiel
Comment réaliser un téléchargement de fichiers volumineux avec Rest Template of Spring
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 2/3 (création de modèle de formulaire)
Exécutable serveur avec Spring gradle Comment créer JAR et WAR
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
[Exemple de code Spring inclus] Comment créer un formulaire et comment obtenir plusieurs enregistrements
J'ai essayé d'implémenter le téléchargement de fichiers avec Spring MVC
Comment créer un projet Spring Boot dans IntelliJ
[Spring Boot] Comment créer un projet (pour les débutants)
[Introduction à Spring Boot] Soumettez un formulaire à l'aide de thymeleaf
Comment créer une méthode
Comment demander un fichier CSV au format JSON avec jMeter
Comment créer un formulaire pour sélectionner une date dans le calendrier
Comment créer une application à l'aide de Tensorflow avec Android Studio
Pour recevoir une demande vide avec Spring Web MVC @RequestBody
Comment s'inscrire en tant que client dans Square à l'aide de Tomcat
Un nouvel employé a tenté de créer une fonction d'authentification / autorisation à partir de zéro avec Spring Security
Créez une application avec Spring Boot 2
Créez une application avec Spring Boot
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports 1/3 (paramètres Jasper Reports)
Comment créer un hinadan pour un projet Spring Boot à l'aide de SPRING INITIALIZR
Comment créer un fichier jar sans dépendances dans Maven
J'ai essayé de créer un environnement de développement Spring MVC sur Mac
Comment créer votre propre contrôleur correspondant à / error avec Spring Boot
Comment charger un fichier de téléchargement Spring et afficher son contenu
Comment ouvrir un fichier de script à partir d'Ubuntu avec du code VS
Comment créer un serveur Web sur une instance EC2 d'AWS
Comment exécuter un contrat avec web3j
Comment trier une liste à l'aide du comparateur
Créez un fichier jar avec la commande
Créez un lot à la demande simple avec Spring Batch
[Java] Comment transformer un tableau à deux dimensions avec une instruction for étendue
Comment créer un référentiel Maven pour 2020
Comment réaliser le téléchargement de fichiers avec Feign
[Swift5] Comment créer un écran de démarrage
Étapes pour créer une application chameau simple avec les démarreurs Apache Camel Spring Boot
[Spring MVC] Comment transmettre des variables de chemin
Comment diviser un fichier de message Spring Boot
Comment réaliser le téléchargement de fichiers avec Feign
Comment créer une application avec un mécanisme de plug-in [C # et Java]
Comment démarrer un conteneur Docker avec un volume monté dans un fichier de commandes
Faisons une application TODO avec Java 2 Je veux créer un modèle avec Spring Initializr et créer Hello world
Je souhaite pouvoir lire des fichiers en utilisant refile avec administrate [rails6]
[Swift] Comment générer un identifiant pour identifier de manière unique une certaine chose (en utilisant UUID)
Comment déployer un système réalisé avec Java (démarrage Wicket-Spring) sur le serveur du campus
Un mémo pour créer un formulaire simple en utilisant uniquement HTML et CSS dans Rails 6
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports Extra (édition Variables)
Comment stocker simultanément des données dans un modèle associé à une forme imbriquée (Rails 6.0.0)
Comment effectuer UT avec Excel en tant que données de test avec Spring Boot + JUnit5 + DBUnit
J'ai essayé d'imprimer un formulaire avec Spring MVC et Jasper Reports Extra Edition (édition d'image)
De la création d'un projet Spring Boot à l'exécution d'une application avec VS Code