Рубрики
Без рубрики

Загрузка и отображение файлов Excel с помощью Spring MVC

Краткое и практическое руководство по загрузке и отображению файлов Excel в приложении Spring MVC с использованием POI Apache.

Автор оригинала: baeldung.

1. введение

В этой статье мы продемонстрируем, как загружать файлы Excel и отображать их содержимое на веб-странице с помощью фреймворка Spring MVC .

2. Загрузка файлов Excel

Чтобы иметь возможность загружать файлы, мы сначала создадим сопоставление контроллера, которое получит MultipartFile и сохранит его в текущем местоположении:

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

Далее, давайте создадим файл JSP с формой, которая содержит


3. Чтение Файлов Excel

Для анализа загруженного файла excel мы будем использовать библиотеку Apache POI , которая может работать как с файлами .xls , так и с файлами .xlsx .

Давайте создадим вспомогательный класс под названием Моя ячейка , который будет содержать свойства ячейки Excel, связанные с содержимым и форматированием:

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
}

Мы прочитаем содержимое файла Excel в файл Map , содержащий списки объектов My Cell .

3.1. Анализ файла .xls

Файл .xls представлен в библиотеке Apache POI классом HSSFWorkbook |, который состоит из объектов HSSFSheet . Для открытия и чтения содержимого файла .xls вы можете просмотреть нашу статью о Работе с Microsoft Excel в Java .

Для анализа форматирования ячейки мы получим объект HSSFCellStyle , который может помочь нам определить такие свойства, как цвет фона и шрифт. Все свойства чтения будут заданы в атрибутах объекта Моя ячейка :

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

Цвета читаются в rgb(rVal, gVal, BVal) формат, чтобы упростить их отображение с помощью CSS в JSP страница.

Давайте также получим размер, вес и цвет шрифта:

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. Синтаксический анализ файла .xlsx

Для файлов в более новом формате .xlsx мы можем использовать класс XSSFWorkbook и аналогичные файлы для содержимого книги, также описанные в статье Работа с Microsoft Excel в Java .

Давайте подробнее рассмотрим чтение форматирования ячейки в формате .xlsx . Во-первых, мы получим XSSFCellStyle объект , связанный с ячейкой, и используем его для определения цвета фона и шрифта:

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

В этом случае RGB значения цвета будут подписанными байтами значениями, поэтому мы получим неподписанные значения, добавив 0xff к отрицательным значениям.

Давайте также определим свойства шрифта:

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. Обработка Пустых Строк

Описанные выше методы не учитывают пустые строки в файле Excel. Если нам нужно точное представление файла, в котором также отображаются пустые строки, нам нужно будет смоделировать их в нашей результирующей HashMap с помощью ArrayList объектов myCell , содержащих пустые Строки в качестве содержимого.

Первоначально, после чтения файла Excel, пустыми строками в файле будут объекты ArrayList с размером 0.

Чтобы определить, сколько пустых String объектов мы должны добавить, мы сначала определим самую длинную строку в файле Excel, используя переменную maxNrCols . Затем мы добавим это количество пустых String объектов ко всем спискам в нашей HashMap , которые имеют размер 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. Отображение файлов Excel

Для отображения файлов Excel , прочитанных с помощью Spring MVC , нам нужно будет определить отображение контроллера и JSP страницу.

4.1. Пружинный контроллер MVC

Давайте создадим метод @RequestMapping , который вызовет приведенный выше код для чтения содержимого загруженного файла, а затем добавим возвращенный Map в качестве атрибута Model :

@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

Для визуального отображения содержимого файла мы создадим HTML | таблицу и в атрибуте style каждой ячейки таблицы добавим свойства форматирования, соответствующие каждой ячейке из файла Excel:


    
            
                    
${cell.content}

5. Заключение

В этой статье мы показали пример проекта для загрузки файлов Excel и отображения их на веб-странице с использованием фреймворка Spring MVC .

Полный исходный код можно найти в проекте GitHub .