Spring повреждает файл Excel (xlsx, xls) при загрузке на сервер (org.apache.poi) - PullRequest
0 голосов
/ 08 мая 2018

Я загружаю файл Excel, используя spring, но apache POI не может прочитать файл, потому что он поврежден или имеет другой формат. но это происходит только когда я загружаю файл Excel. файл Excel открывается задолго до его загрузки. Я использую POI версии 3.17

Вот мой код.

HTML

<form method="post" action="/uploadExcelFile" enctype="multipart/form-data">
    <div id="categoriesForMessages" class="row">
        <div class="col-sm-12">
            <label>Upload File</label>
            <input id="form-control-9" name="file" type="file" accept=".xls,.xlsx">
            <p class="help-block">
                <small>Upload Excel types .xls .xlsx</small>
            </p>
        </div>
</form>

Контроллер

public class XController {

    @PostMapping("/uploadExcelFile")
    public String uploadFile(Model model, MultipartFile file) throws IOException {

        File currDir = new File(".");
        String path = currDir.getAbsolutePath();
        fileLocation = path.substring(0, path.length() - 1) + file.getOriginalFilename();
        System.out.println(fileLocation);
        FileOutputStream f = new FileOutputStream(fileLocation);

        try {
            FileInputStream fis = new FileInputStream(fileLocation);
            Workbook workbook = WorkbookFactory.create(fis);
            fis.close();

            Sheet sheet = workbook.getSheetAt(0);
            Row row = sheet.getRow(0);

            System.out.println(row.getCell(0).getStringCellValue());

        } catch (InvalidFormatException e) {
            e.printStackTrace();
        }

        return "redirect:/home";
    }
}

1 Ответ

0 голосов
/ 08 мая 2018

Проблема с вашим кодом в том, что вы пытаетесь прочитать пустой файл, который вы только что создали. Но вы должны были прочитать multipart-file, чтобы создать рабочую книгу.

       FileInputStream fis = new FileInputStream(fileLocation); // fis created with new file location 
        Workbook workbook = WorkbookFactory.create(fis); //creating a workbook with an empty file

Если вы пытаетесь читать из рабочей книги, вы можете напрямую использовать объект MultipartFile и покончить с ним. Нет необходимости создавать новый File.

Сделай что-нибудь подобное.

  Workbook workbook = WorkbookFactory.create(file.getInputStream());

, а затем продолжайте работать с файлом. Если вы хотите сохранить файл где-нибудь, вы можете сделать это, как,

try (FileOutputStream outputStream = new FileOutputStream("/path/to/your/file/hello.xlsx")) {
            workbook.write(outputStream);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...