[JAVA] So erstellen Sie ein Excel-Formular mithilfe einer Vorlagendatei mit Spring MVC

1. Zuallererst

Dieses Mal werde ich erklären, wie ein Excel-Formular mithilfe einer Vorlagendatei mit Spring MVC = TERASOLUNA 5.x erstellt wird. Excel in der TERASOLUNA 5.x-Richtlinie "4.10.2.2. Excel-Datei herunterladen" Es gibt eine Erklärung des Formulars, aber dies ist eine Methode, um eine Excel-Datei programmgesteuert von Grund auf neu zu erstellen. Ich denke, beim Erstellen eines Excel-Formulars ist es üblich, eine Vorlagendatei im Voraus vorzubereiten und Daten darin zu gießen. Dieses Mal möchte ich das Excel-Formular ausgeben, indem ich die Daten in die folgende Vorlagendatei gieße.

excel_report_template.jpg

Das Referenzsystem ist "terasolunaorg / terasoluna-tourreservation-mybatis3".

2. Quellcode

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 zum Lesen von Formulardaten
     */
    @Inject
    ObjectMapper objectMapper;

    /**
     * [dummy]Json-Datei, in der Formulardaten gespeichert werden
     */
    @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", "Reservierungsdetails.xlsx");
        // 3. return excel view bean's name
        return "reservationExcelView";
    }

    /**
     * [dummy]Erstellen Sie Dummy-Reservierungsinformationen für die Ausgabe in das Formular
     * @Rückreservierung
     */
    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;
    }
}

Normalerweise werden zur Ausgabe eines Formulars die Zieldaten aus der Datenbank erfasst. In diesem Beispiel habe ich mich jedoch entschlossen, die Daten ohne Auslassung aus der JSON-Datei abzurufen. Andere sind die gleichen wie die normale "Controller" -Implementierung. Die folgenden zwei Punkte sind die Punkte.

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;

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

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

    /**
     *★ Punkt 2
     *Excel-Vorlage für die Registrierung von Tourreservierungen
     */
    @Value("${app.report.resevation.template:C:/temp/excel/reservation.xlsx}")
    private File excelTemplateFile;

    /**
     *★ Punkt 2
     *Passwort zum Lesen der Excel-Datei
     */
    @Value("${app.report.resevation.pass:locked}")
    private String excelOpenPass;

    /**
     *★ Punkt 3
     * <p>
     *Erstellen Sie eine Arbeitsmappe mit der in excelTemplateFile angegebenen Excel-Vorlage
     * <p>
     *Das von dieser Methode zurückgegebene Arbeitsmappenobjekt wird als Argument der buildExcelDocument-Methode übergeben.
     * @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);
            //Wenn die Datei eine Passwortsperre hat, jce_policy-8.Müssen Reißverschluss anwenden
        } catch (IOException | EncryptedDocumentException
                | InvalidFormatException e) {
            LOGGER.error("create workbook error", e);
        }
        return workbook;
    }

    /**
     *★ Punkt 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 {
        //★ Punkt 5
        // 1.Rufen Sie die in Model gespeicherten Formulardaten ab
        Reserve reserve = (Reserve) model.get("reserve");
        TourInfo tourInfo = reserve.getTourInfo();

        //★ Punkt 6
        // 2.Blattauswahl
        Sheet sheet = workbook.getSheet("Reservierung");

        //★ Punkt 7
        // 3.Daten in Zelle einstellen
        //Stellen Sie den Wert von "Reservierungsnummer" in Zeile 5 und Spalte F ein
        getCell(sheet, 4, 5).setCellValue(reserve.getReserveNo());

        //★ Punkt 8
        // 4.Legen Sie den Dateinamen im Antwortheader fest
        String fileName = (String) model.get("fileName");
        String encodedFilename = URLEncoder.encode(fileName, "UTF-8");
        response.setHeader("Content-Disposition","attachment; filename*=UTF-8''" + encodedFilename);

        //★ Punkt 7
        // 3.Daten in Zelle einstellen
        //Stellen Sie den Wert "Reservierungsdatum" in 5 Zeilen und AA-Spalten ein
        getCell(sheet, 4, 26).setCellValue(reserve.getReservedDay());
        //Tour name
        getCell(sheet, 5, 5).setCellValue(tourInfo.getTourName());
        //Abreisedatum
        getCell(sheet, 6, 5).setCellValue(tourInfo.getDepDay());
        //Tage
        getCell(sheet, 6, 26).setCellValue(tourInfo.getTourDays());
        //Abfahrtsort
        getCell(sheet, 7, 5).setCellValue(tourInfo.getDeparture().getDepName());
        //Ziel
        getCell(sheet, 7, 26).setCellValue(tourInfo.getArrival().getArrName());
        //Reiseleiter
        getCell(sheet, 8, 5).setCellValue(tourInfo.getConductor());
        //Hotel
        getCell(sheet, 9, 5)
                .setCellValue(tourInfo.getAccommodation().getAccomName());
        //Kontaktinformation
        getCell(sheet, 9, 26)
                .setCellValue(tourInfo.getAccommodation().getAccomTel());
        //Überblick
        getCell(sheet, 10, 5).setCellValue(tourInfo.getTourAbs());
        // omitted
    }

    /**
     * <p>
     *Ruft die durch die Zeilennummer und Spaltennummer des durch das Argument angegebene Blattes angegebene Zelle ab und gibt sie zurück.
     * <p>
     *Zeilennummer und Spaltennummer beginnen bei 0
     * <p>
     *NullPointerException, wenn die Zelle in der Excel-Vorlage nicht bearbeitet wird
     * @Param Sheet Sheet
     * @param rowIndex Zeilennummer
     * @param colIndex Spaltennummer
     * @Rückgabezelle
     */
    private Cell getCell(Sheet sheet, int rowIndex, int colIndex) {
        Row row = sheet.getRow(rowIndex);
        return row.getCell(colIndex);
    }

}

** ★ Punkt 1 ** Erweitern Sie "org.springframework.web.servlet.view.document.AbstractXlsxView", um Ihre eigene "View" -Klasse zu definieren. Da für die implementierte Ansicht eine Bean-Definition erforderlich ist, fügen Sie die Klassenanmerkung "@ Component" hinzu.

** ★ Punkt 2 ** Definieren Sie die Excel-Datei, die als Vorlage als Ressource verwendet werden soll. Obwohl es als "Datei" definiert ist, kann es im Frühjahr von "@ Value" gelesen werden. Wenn Sie ein Kennwort für Ihre Excel-Datei festgelegt haben, definieren Sie es ebenfalls. (Möglichkeit)

** ★ Punkt 3 ** Dies ist der Punkt dieses Artikels. Überschreiben Sie die Methode "createWorkbook", um ein Objekt für "Workbook" aus einer Excel-Vorlage zu erstellen. Dies ist einfach eine POI-Operation. Das Workbook-Objekt, das den Rückgabewert dieser Methode darstellt, wird als Argument an die buildExcelDocument-Methode übergeben.

**(Referenz) Sie können auch eine Excel-Datei mit einem Kennwort verwenden. In diesem Fall erstellt "WorkbookFactory.create (is" password ")" ein "Workbook" -Objekt. Zum Entsperren des Kennworts gibt es ein Problem mit der Verschlüsselungsbibliothek (für Benutzer mit hoher Verschlüsselungsstärke gelten Exportbeschränkungen) jce_policy-8.zip /downloads/jce8-download-2133166.html) muss angewendet werden. ** **.

** ★ Punkt 4 ** Überschreiben Sie die Methode "buildExcelDocument" und implementieren Sie den Prozess zum Erstellen eines Excel-Formulars.

** ★ Punkt 5 ** Holen Sie sich die Daten, die in das Formular eingegeben werden sollen, von Model. Die Datenverknüpfung mit dem Controller erfolgt über das Modell.

** ★ Punkt 6 ** Es ist eine POI-Operation. Wählen Sie zunächst das Zielblatt aus.

** ★ Punkt 7 ** Sie müssen eine Zelle auswählen, um die Daten festzulegen. Im Beispiel haben wir die getCell-Methode vorbereitet. Stellen Sie die Daten in der Zielzelle mit der POI-Methode setCellValue ein.

**(Hinweis) Bitte beachten Sie, dass die Zeilen und Spalten, die nicht in der Excel-Vorlagendatei gemäß den POI-Spezifikationen betrieben werden, "null" sind. Wenn Sie positiv denken und eine NullPointerException erhalten, haben Sie einen Fehler gefunden, bei dem Sie anstelle der von Ihnen festgelegten Zelle eine andere Zelle ausgewählt haben. ** **.

** ★ Punkt 8 ** Legen Sie den Dateinamen der Download-Datei im HTTP-Antwortheader fest. Wenn Sie den Dateinamen auf Japanisch festlegen möchten, codieren Sie ihn mit "utf-8". Wenn Sie keinen Dateinamen festlegen, ist der Name der Anforderungspfad mit der Erweiterung ".xlsx". Im Beispiel lautet der Pfad "report / excel", also "excel.xlsx".

xml:Bean-Definitionsdatei (TERASOLUNA5.Für x: Frühling-mvc.xml)


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

** ★ Punkt 9 ** Fügen Sie der Definition von <mvc: view-resolvers> in der Bean-Definitionsdatei <mvc: bean-name /> hinzu. Die Reihenfolge des Schreibens ist ebenfalls wichtig. Stellen Sie sicher, dass Sie es vor "<mvc: jsp>" definieren.

jsonData.json


{
  "reserveNo" : "12345678",
  "reservedDay" : "2018-01-10T07:02:15.919+0000",
  "adultCount" : 2,
  "childCount" : 1,
  "transfer" : 0,
  "sumPrice" : 75000,
  "remarks" : "Memo",
  "tourInfo" : {
    "tourCode" : "00000001",
    "plannedDay" : "2017-01-10T07:02:15.919+0000",
    "planNo" : "0101",
    "tourName" : "Terra Solna Paradise Tour",
    "tourDays" : 0,
    "depDay" : "2018-01-30",
    "avaRecMax" : 0,
    "basePrice" : 30000,
    "conductor" : 1,
    "tourAbs" : "Es gibt einen anderen Ort, zu einem Gasthaus, in dem Stille und Dampf warten ...\r\n Bitte kontaktieren Sie uns für weitere Informationen.",
    "departure" : {
      "depCode" : "01",
      "depName" : "Hokkaido"
    },
    "arrival" : {
      "arrCode" : "02",
      "arrName" : "Aomori"
    },
    "accommodation" : {
      "accomCode" : "0001",
      "accomName" : "TERASOLUNA Hotel 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" : "Der Umsatz",
    "customerMail" : "[email protected]",
    "customerTel" : "01-2345-6789",
    "customerPost" : "123-4567",
    "customerAdd" : "Toyosu, Koto-ku, Tokio"
  }
}

Dies sind die Daten, die in das Excel-Formular eingegeben werden sollen. Es ist nur für das Beispiel, aber es ist einfach, die Daten zu ändern, wenn Sie die Daten aus JSON lesen.

3. Schließlich

Dieses Mal habe ich erklärt, wie ein Excel-Formular mithilfe einer Vorlagendatei mit Spring MVC = TERASOLUNA 5.x erstellt wird. Der Punkt besteht darin, die Methode "createWorkbook" zu überschreiben, um ein "Workbook" -Objekt aus einer Excel-Vorlagendatei zu erstellen.

Recommended Posts

So erstellen Sie ein Excel-Formular mithilfe einer Vorlagendatei mit Spring MVC
Erstellen Sie eine Excel-Datei mit poi
So erstellen Sie eine JAR-Datei und eine War-Datei mit dem Befehl jar
[Rails 6] So erstellen Sie mit cocoon einen dynamischen Formular-Eingabebildschirm
Ich habe versucht, mithilfe von JDBC Template mit Spring MVC eine Verbindung zu MySQL herzustellen
[Rails] So erstellen Sie eine Teilvorlage
So erzielen Sie mit Rest Template of Spring einen großen Datei-Upload
Ich habe versucht, ein Formular mit Spring MVC und Jasper Reports 2/3 (Formularvorlagenerstellung) zu drucken.
Server mit Spring Gradle ausführbar So erstellen Sie JAR und WAR
[Rails] So erstellen Sie ein Diagramm mit lazy_high_charts
[Spring-Beispielcode enthalten] So erstellen Sie ein Formular und erhalten mehrere Datensätze
Ich habe versucht, das Hochladen von Dateien mit Spring MVC zu implementieren
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
[Einführung in Spring Boot] Senden Sie ein Formular mit thymeleaf
So erstellen Sie eine Methode
So fordern Sie mit jMeter eine CSV-Datei als JSON an
So erstellen Sie ein Formular zur Auswahl eines Datums aus dem Kalender
So erstellen Sie eine App mit Tensorflow mit Android Studio
So erhalten Sie eine leere Anfrage mit Spring Web MVC @RequestBody
So registrieren Sie sich mit Tomcat als Kunde in Square
Neuer Mitarbeiter hat versucht, mit Spring Security eine Authentifizierungs- / Autorisierungsfunktion von Grund auf neu zu erstellen
Erstellen Sie eine App mit Spring Boot 2
Erstellen Sie eine App mit Spring Boot
Ich habe versucht, ein Formular mit Spring MVC und Jasper Reports 1/3 (Jasper Reports-Einstellungen) zu drucken.
So erstellen Sie mit SPRING INITIALIZR einen Hinadan für ein Spring Boot-Projekt
So erstellen Sie eine JAR-Datei ohne Abhängigkeiten in Maven
Ich habe versucht, eine Spring MVC-Entwicklungsumgebung auf einem Mac zu erstellen
So erstellen Sie mit Spring Boot einen eigenen Controller, der / error entspricht
So laden Sie eine Spring-Upload-Datei und zeigen ihren Inhalt an
So öffnen Sie eine Skriptdatei von Ubuntu mit VS-Code
So erstellen Sie einen Webserver auf einer EC2-Instanz von AWS
So führen Sie einen Vertrag mit web3j aus
So sortieren Sie eine Liste mit Comparator
Erstellen Sie mit dem Befehl eine JAR-Datei
Erstellen Sie mit Spring Batch eine einfache On-Demand-Charge
[Java] So drehen Sie ein zweidimensionales Array mit einer erweiterten for-Anweisung
So erstellen Sie ein Maven-Repository für 2020
So erreichen Sie den Dateidownload mit Feign
[Swift5] So erstellen Sie einen Begrüßungsbildschirm
Schritte zum Erstellen einer einfachen Kamel-App mit Apache Camel Spring Boot-Startern
[Spring MVC] Übergeben von Pfadvariablen
So teilen Sie eine Spring Boot-Nachrichtendatei
So erreichen Sie das Hochladen von Dateien mit Feign
So erstellen Sie eine App mit einem Plug-In-Mechanismus [C # und Java]
So starten Sie einen Docker-Container mit einem in einer Batchdatei bereitgestellten Volume
Lassen Sie uns eine TODO-Anwendung mit Java 2 erstellen. Ich möchte eine Vorlage mit Spring Initializr erstellen und eine Hello-Welt erstellen
Ich möchte in der Lage sein, Dateien mit refile mit administrate [rails6] zu lesen.
[Swift] So generieren Sie eine ID, um eine bestimmte Sache eindeutig zu identifizieren (mithilfe der UUID)
So stellen Sie ein mit Java erstelltes System (Wicket-Spring-Boot) auf dem Campus-Server bereit
Ein Memo zum Erstellen eines einfachen Formulars, das nur HTML und CSS in Rails 6 verwendet
Ich habe versucht, ein Formular mit Spring MVC und Jasper Reports Extra Edition (Variables Edition) zu drucken.
So speichern Sie gleichzeitig Daten in einem Modell, das einem verschachtelten Formular zugeordnet ist (Rails 6.0.0)
So führen Sie UT mit Excel als Testdaten mit Spring Boot + JUnit5 + DBUnit durch
Ich habe versucht, ein Formular mit Spring MVC und Jasper Reports Extra Edition (Bildausgabe) zu drucken.
Vom Erstellen eines Spring Boot-Projekts bis zum Ausführen einer Anwendung mit VS Code