Télécharger et afficher des fichiers Excel avec Spring MVC

Télécharger et afficher des fichiers Excel avec Spring MVC

1. introduction

Dans cet article, nous allons montrer commentupload Excel files and display their content in a web page en utilisant le frameworkSpring MVC.

2. Téléchargement de fichiers Excel

Afin de pouvoir télécharger des fichiers, nous allons d'abord créer un mappage de contrôleur qui reçoit unMultipartFile et l'enregistre à l'emplacement actuel:

private String fileLocation;

@PostMapping("/uploadExcelFile")
public String uploadFile(Model model, MultipartFile file) throws IOException {
    InputStream in = file.getInputStream();
    File currDir = new File(".");
    String path = currDir.getAbsolutePath();
    fileLocation = path.substring(0, path.length() - 1) + file.getOriginalFilename();
    FileOutputStream f = new FileOutputStream(fileLocation);
    int ch = 0;
    while ((ch = in.read()) != -1) {
        f.write(ch);
    }
    f.flush();
    f.close();
    model.addAttribute("message", "File: " + file.getOriginalFilename()
      + " has been uploaded successfully!");
    return "excel";
}

Ensuite, créons un fichierJSP avec un formulaire qui contient uninput detype file dont l'attributaccept est défini pour n'autoriser que les fichiers Excel:


3. Lire des fichiers Excel

Afin d'analyser le fichier Excel téléchargé, nous utiliserons la bibliothèqueApache POI, qui peut fonctionner avec les fichiers.xls et.xlsx.

Créons une classe d'assistance appeléeMyCell qui contiendra les propriétés d'une cellule Excel liées au contenu et à la mise en forme:

public class MyCell {
    private String content;
    private String textColor;
    private String bgColor;
    private String textSize;
    private String textWeight;

    public MyCell(String content) {
        this.content = content;
    }

    //standard constructor, getters, setters
}

Nous allons lire le contenu du fichier Excel dans unMap qui contient des listes d'objetsMyCell.

3.1. Analyse d'un fichier .xls

A .xls file is represented in the Apache POI library by an HSSFWorkbookclass, qui est composé d'objetsHSSFSheet. Pour ouvrir et lire le contenu d'un fichier.xls, vous pouvez consulter notre article surWorking with Microsoft Excel in Java.

For parsing the formatting of a cell, we will obtain the HSSFCellStyleobject, qui peut nous aider à déterminer des propriétés comme la couleur et la police d'arrière-plan. Toutes les propriétés de lecture seront définies dans les attributs de l'objetMyCell:

HSSFCellStyle cellStyle = cell.getCellStyle();

MyCell myCell = new MyCell();

HSSFColor bgColor = cellStyle.getFillForegroundColorColor();
if (bgColor != null) {
    short[] rgbColor = bgColor.getTriplet();
    myCell.setBgColor("rgb(" + rgbColor[0] + ","
      + rgbColor[1] + "," + rgbColor[2] + ")");
    }
HSSFFont font = cell.getCellStyle().getFont(workbook);

Les couleurs sont lues au formatrgb(rVal, gVal, bVal) pour faciliter leur affichage en utilisantCSS dans une pageJSP.

Obtenons également la taille, l'épaisseur et la couleur de la police:

myCell.setTextSize(font.getFontHeightInPoints() + "");
if (font.getBold()) {
    myCell.setTextWeight("bold");
}
HSSFColor textColor = font.getHSSFColor(workbook);
if (textColor != null) {
    short[] rgbColor = textColor.getTriplet();
    myCell.setTextColor("rgb(" + rgbColor[0] + ","
      + rgbColor[1] + "," + rgbColor[2] + ")");
}

3.2. Analyse d'un fichier .xlsx

For files in the newer .xlsx format, we can use the XSSFWorkbook class et similaires pour le contenu d'un classeur, également documentés dans l'articleWorking with Microsoft Excel in Java.

Examinons de plus près la lecture de la mise en forme d'une cellule au format.xlsx. Tout d'abord,we will retrieve the XSSFCellStyle object est associé à une cellule et utilisez-le pour déterminer la couleur et la police d'arrière-plan:

XSSFCellStyle cellStyle = cell.getCellStyle();

MyCell myCell = new MyCell();
XSSFColor bgColor = cellStyle.getFillForegroundColorColor();
if (bgColor != null) {
    byte[] rgbColor = bgColor.getRGB();
    myCell.setBgColor("rgb("
      + (rgbColor[0] < 0 ? (rgbColor[0] + 0xff) : rgbColor[0]) + ","
      + (rgbColor[1] < 0 ? (rgbColor[1] + 0xff) : rgbColor[1]) + ","
      + (rgbColor[2] < 0 ? (rgbColor[2] + 0xff) : rgbColor[2]) + ")");
}
XSSFFont font = cellStyle.getFont();

Dans ce cas, les valeursRGB de la couleur seront des valeurssigned byte, donc nous obtiendrons les valeursunsigned en ajoutant0xff aux valeurs négatives.

Déterminons également les propriétés de la police:

myCell.setTextSize(font.getFontHeightInPoints() + "");
if (font.getBold()) {
    myCell.setTextWeight("bold");
}
XSSFColor textColor = font.getXSSFColor();
if (textColor != null) {
    byte[] rgbColor = textColor.getRGB();
    myCell.setTextColor("rgb("
      + (rgbColor[0] < 0 ? (rgbColor[0] + 0xff) : rgbColor[0]) + ","
      + (rgbColor[1] < 0 ? (rgbColor[1] + 0xff) : rgbColor[1]) + ","
      + (rgbColor[2] < 0 ? (rgbColor[2] + 0xff) : rgbColor[2]) + ")");
}

3.3. Gestion des lignes vides

The methods described above do not account for empty rows in an Excel file. Si nous voulons un rendu fidèle du fichier qui affiche également les lignes vides, nous devrons les simuler dans notreHashMap résultant avec unArrayList d'objetsMyCell contenant desStrings vides comme contenu.

Initialement, après la lecture du fichier Excel, les lignes vides du fichier seront des objetsArrayList avec une taille de 0.

Afin de déterminer le nombre d'objetsString vides à ajouter, nous allons d'abord déterminer la ligne la plus longue du fichier Excel, en utilisant la variablemaxNrCols. Ensuite, nous ajouterons ce nombre d'objetsString vides à toutes les listes de nosHashMap qui ont une taille de 0:

int maxNrCols = data.values().stream()
  .mapToInt(List::size)
  .max()
  .orElse(0);

data.values().stream()
  .filter(ls -> ls.size() < maxNrCols)
  .forEach(ls -> {
      IntStream.range(ls.size(), maxNrCols)
        .forEach(i -> ls.add(new MyCell("")));
  });

4. Affichage des fichiers Excel

Pour afficher les fichiers Excel lus à l'aide deSpring MVC, nous devrons définir un mappage de contrôleur et une page deJSP.

4.1. Contrôleur Spring MVC

Créons une méthode@RequestMapping qui appellera le code ci-dessus pour lire le contenu du fichier téléchargé, puis ajoutons leMap renvoyé comme attributModel:

@Resource(name = "excelPOIHelper")
private ExcelPOIHelper excelPOIHelper;

@RequestMapping(method = RequestMethod.GET, value = "/readPOI")
public String readPOI(Model model) throws IOException {

  if (fileLocation != null) {
      if (fileLocation.endsWith(".xlsx") || fileLocation.endsWith(".xls")) {
          Map> data
            = excelPOIHelper.readExcel(fileLocation);
          model.addAttribute("data", data);
      } else {
          model.addAttribute("message", "Not a valid excel file!");
      }
  } else {
      model.addAttribute("message", "File missing! Please upload an excel file.");
  }
  return "excel";
}

4.2. JSP

Pour afficher visuellement le contenu du fichier, nous allons créer unHTMLtable et, dans l'attributstyle de chaque cellule du tableau, ajouter les propriétés de mise en forme correspondant à chaque cellule du fichier Excel :


    
            
                    
${cell.content}

5. Conclusion

Dans cet article, nous avons montré un exemple de projet pour télécharger des fichiers Excel et les afficher dans une page Web à l'aide du frameworkSpring MVC.

Le code source complet peut être trouvé dans lesGitHub project.