Java POI — преобразовать рабочую книгу в файл

#java #excel #file #apache-poi

#java #excel #файл #apache-poi

Вопрос:

Мне нужно вернуть рабочую книгу, но преобразованную в File объект Java. На данный момент я знаю только, как записать рабочую книгу на диск workbook.write(outputStream) . Однако я хочу вернуть File объект, чтобы использовать его непосредственно для дальнейшей обработки (загрузки на Amazon).

Мой код:

 public File addErrorColumnToExcel(MultipartFile file, HashMap<Integer, String> errors, int newColumnIndex) throws IOException {
    Workbook workbook = null;
    Sheet sheet = null;
    Row row;
    Cell newErrorCell;
    String errorText;

    try {
      workbook = new XSSFWorkbook(new BufferedInputStream(file.getInputStream()));
      sheet = workbook.getSheetAt(FIRST_SHEET_INDEX);
    } catch (IOException e) {
      logger.error("cannot get the file: "   file.getOriginalFilename()   e);
    }

    //do some logic

    return workbook; //but I need to convert this to a java File
  }
 

Комментарии:

1. Почему вы хотите вернуть a MultipartFile ? Этот тип обычно представляет загруженный файл (Spring Web)… Вероятно, было бы полезно узнать, что вы хотите сделать с выводом позже.

2. Приветствую, мне действительно нужен файл, я изменил сообщение. Мне нужен этот файл, чтобы загрузить его на Amazon, мне нужны его метаданные для создания этого объекта: PutObjectRequest(String bucketName, String key, ввод InputStream, метаданные ObjectMetadata)

Ответ №1:

Вы можете создать временный файл и записать данные в этот файл перед его возвратом. Не забудьте удалить файл после обработки. Вот упрощенный фрагмент:

 public File getEmptyExcelFile() throws IOException {
    try (Workbook workbook = new XSSFWorkbook()) {

        workbook.createSheet("test"); // do some logic

        File outputFile = File.createTempFile("temp", ".xlsx");
        try (FileOutputStream fos = new FileOutputStream(outputFile)) {
            workbook.write(fos);
        }
        return outputFile;
    }
}
 

Обратите внимание, что я использую try-with-resources для XSSFWorkbook и FileOutputStream .


Другой идеей было бы вернуть массив байтов byte[] вместо File . Это несколько более чистое решение и не записывает файл на диск.

 public byte[] getEmptyExcelFileAsBytes() throws IOException {
    try (Workbook workbook = new XSSFWorkbook()) {

        workbook.createSheet("test"); // do some logic

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        workbook.write(baos);
        return baos.toByteArray();
    }
}
 

Комментарии:

1. Спасибо, я использовал аналогичную идею для byte[], но вместо этого использовал InputStreamFile, я преобразовал рабочую книгу в InputStreamFile, а затем извлек некоторые метаданные из исходного файла (оригинальный Excel без изменений) и с помощью этого я могу загрузить этот входной поток в S3. Спасибо!