Excel-Dateien mit Spring MVC hochladen und anzeigen

Hochladen und Anzeigen von Excel-Dateien mit Spring MVC

1. Einführung

In diesem Artikel zeigen wir, wieupload Excel files and display their content in a web page mit demSpring MVC-Framework erstellt werden.

2. Hochladen von Excel-Dateien

Um Dateien hochladen zu können, erstellen wir zunächst eine Controller-Zuordnung, dieMultipartFile empfängt und am aktuellen Speicherort speichert:

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";
}

Als Nächstes erstellen wir eineJSP-Datei mit einem Formular, dasinput vontype file enthält, wobei das Attributaccept so festgelegt ist, dass nur Excel-Dateien zulässig sind:


3. Excel-Dateien lesen

Um die hochgeladene Excel-Datei zu analysieren, verwenden wir dieApache POI-Bibliothek, die sowohl mit.xls- als auch mit.xlsx-Dateien arbeiten kann.

Erstellen wir eine Hilfsklasse mit dem NamenMyCell, die Eigenschaften einer Excel-Zelle in Bezug auf Inhalt und Formatierung enthält:

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
}

Wir werden den Inhalt der Excel-Datei in einMap lesen, das Listen vonMyCell Objekten enthält.

3.1. Analysieren einer XLS-Datei

A .xls file is represented in the Apache POI library by an HSSFWorkbookclass, das ausHSSFSheet Objekten besteht. Zum Öffnen und Lesen des Inhalts einer.xls-Datei können Sie unseren Artikel zuWorking with Microsoft Excel in Java lesen.

For parsing the formatting of a cell, we will obtain the HSSFCellStyleobject,, mit deren Hilfe wir Eigenschaften wie Hintergrundfarbe und Schriftart bestimmen können. Alle Leseeigenschaften werden in den Attributen desMyCell-Objekts festgelegt:

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);

Die Farben werden imrgb(rVal, gVal, bVal)-Format gelesen, um die Anzeige mitCSS auf einerJSP-Seite zu vereinfachen.

Erhalten Sie auch die Schriftgröße, das Gewicht und die Farbe:

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. Analysieren einer XLSX-Datei

For files in the newer .xlsx format, we can use the XSSFWorkbook class und ähnliche für den Inhalt einer Arbeitsmappe, ebenfalls dokumentiert im ArtikelWorking with Microsoft Excel in Java.

Schauen wir uns die Formatierung einer Zelle im Format.xlsxgenauer an. Zunächst werdenwe will retrieve the XSSFCellStyle objecteiner Zelle zugeordnet und verwenden sie, um die Hintergrundfarbe und die Schriftart zu bestimmen:

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();

In diesem Fall sind dieRGB-Werte der Farbesigned byte-Werte, sodass wir dieunsigned-Werte erhalten, indem wir0xff zu den negativen Werten addieren.

Lassen Sie uns auch die Eigenschaften der Schriftart bestimmen:

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. Umgang mit leeren Zeilen

The methods described above do not account for empty rows in an Excel file. Wenn wir eine getreue Wiedergabe der Datei wünschen, in der auch die leeren Zeilen angezeigt werden, müssen wir diese in unseren resultierendenHashMap mitArrayList vonMyCell Objekten simulieren mit leerenStrings als Inhalt.

Nach dem Lesen der Excel-Datei sind die leeren Zeilen in der Datei zunächstArrayList Objekte mit einer Größe von 0.

Um zu bestimmen, wie viele leereString-Objekte hinzugefügt werden sollen, ermitteln wir zunächst die längste Zeile in der Excel-Datei mithilfe der VariablenmaxNrCols. Dann fügen wir diese Anzahl leererString-Objekte zu allen Listen in unserenHashMap hinzu, die eine Größe von 0 haben:

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. Anzeigen von Excel-Dateien

Um die mitSpring MVC gelesenen Excel-Dateien anzuzeigen, müssen Sie eine Controller-Zuordnung und eineJSP-Seite definieren.

4.1. Spring MVC Controller

Erstellen Sie eine@RequestMapping-Methode, die den obigen Code aufruft, um den Inhalt der hochgeladenen Datei zu lesen, und fügen Sie dann das zurückgegebeneMap alsModel-Attribut hinzu:

@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

Zur visuellen Anzeige des Inhalts der Datei erstellen wirHTMLtable und fügen im Attributstyle jeder Tabellenzelle die Formatierungseigenschaften hinzu, die jeder Zelle aus der Excel-Datei entsprechen ::


    
            
                    
${cell.content}

5. Fazit

In diesem Artikel haben wir ein Beispielprojekt zum Hochladen von Excel-Dateien und zum Anzeigen dieser Dateien auf einer Webseite unter Verwendung des FrameworksSpring MVCgezeigt.

Der vollständige Quellcode befindet sich inGitHub project.