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.
Le système de référence est "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 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.
Model
et liées de la même manière que l'affichage à l'écran de JSP.View
à implémenter plus tard.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 classe
View. 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.
Map <String, Object> model
: jeu de données du modèle dans ControllerWorkbook workbook
: objet Workbook
créé par la méthode createWorkbook
HttpServletRequest request
: requête HTTPHttpServletResponse response)
: réponse HTTP. Opérer lors de la définition de l'en-tête de réponse** ★ 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.
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.