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.
Das Referenzsystem ist "terasolunaorg / terasoluna-tourreservation-mybatis3".
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.
Model
gespeichert und auf die gleiche Weise wie die Bildschirmanzeige von JSP verknüpft.View
zurückzugeben, der später implementiert werden soll.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.
Map <String, Object> model
: Modelldatensatz in ControllerHttpServletResponse response)
: HTTP-Antwort. Bedienung beim Setzen des Antwortheaders** ★ 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.
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