Как прочитать содержимое файла Excel из ввода HTML? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть вход (type = "file"), где клиент может прикрепить документ Excel.Проблема в том, что я не знаю, как читать его, чтобы получить нужную мне информацию.

Если я создаю файл с путем к Excel, я могу прочитать нужную мне информацию из документа:

@Override
public String obtenerTelefono(File excelFile) throws IOException {
    File file = new File("C:\\Users\\usuario\\Desktop\\Cosas\\tlf.xls");
    FileInputStream iFile = new FileInputStream(file);
    HSSFWorkbook workbook = new HSSFWorkbook(iFile);
    HSSFSheet sheet = workbook.getSheetAt(0);
    workbook.close();
    return obtenerTelefono(sheet);
}

public String obtenerTelefono(HSSFSheet sheet) {
    HSSFRow row = sheet.getRow(0);
    int telefono = (int) row.getCell(1).getNumericCellValue();
    return String.valueOf(telefono);
}

Проблема в том, что я не знаю, как сделать то же самое, когда мне нужно работать с приложенным документом (файл excelFile) вместо пути.У меня есть пример метода, но я не могу заставить его работать в моей ситуации:

public void importarFichero() throws IOException, IcaException {
    boolean validado = validarFichero();
    if (validado) {
        prefijo = fichero.getFileName().split("\\.")[0];
        String sufijo = fichero.getFileName().split("\\.")[1];
        File file = File.createTempFile(prefijo + "_", "." + sufijo, new File(System.getProperty("java.io.tmpdir")));
        OutputStream outputStream = new FileOutputStream(file);
        org.apache.poi.util.IOUtils.copy(fichero.getInputstream(), outputStream);
        FileInputStream inputStream = new FileInputStream(file);
        HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
        HSSFSheet sheet = workbook.getSheetAt(0);
        List<UnidadPoblacion> unidadPoblacionImportadas = obtenerUnidadesPoblacionExcel(sheet, this.anyoEjercicio);
        if (service.guardaUnidadPoblacionImportadas(unidadPoblacionImportadas)) {
            if (this.getListado() != null) {
                try {
                    loadListadoFromDDBB();
                } catch (IcaException e) {
                    addMessageError("actualizar_multiple_error");
                }
            }
            int resultado = service.actualizaPoblacionEjercicioBonificacion(this.anyoEjercicio.intValue(),Integer.parseInt(unidadPoblacionImportadas.get(0).getProvincia().getCodigoProvincia()));
            if(resultado >= 0) {
                addMessageInfo("importar_fichero_ok", (Object) fichero.getFileName());
            } else {
                addMessageError("importar_fichero_ok_actualizar_poblacion_error", fichero.getFileName());
            }
            fichero = null;
            anyoEjercicio = null;

        } else {
            addMessageError("importar_fichero_error", fichero.getFileName());
        }
    }
}

Я думаю, что не могу использовать это повторно, потому что fichero является экземпляром класса с именемUploadedFile, и я работаю с File, поэтому у меня нет метода getInputStream () , и я не могу найти аналогичный метод File.

Знаете ли вы, как я могу его создать?временный файл с информацией из исходного документа, а затем прочитать этот файл?Может быть, входную информацию, которую я получаю из HTML, не следует хранить как экземпляр файла?

На стороне сервера я использую SpringMVC.

Это часть HTML:

<div class="form-group form-inline form-xtra required">
    <label>Seleccionar archivo:</label>
    <div required="true">
        <input type="file" id="destinatarioExcel" name="destinatarioExcel" disabled="disabled"/>
    </div>
</div>

Это часть контроллера:

@RequestMapping(value = "/guardarMensaje", method = RequestMethod.POST)
public String guardarMensaje(@Valid @ModelAttribute("mensaje") MensajeDto mensaje, @RequestParam("destinatarioExcel") File excelFile, BindingResult errors,
        final RedirectAttributes attr,
        final ModelMap model) throws IOException {

    if (errors.hasErrors()) {
        attr.addFlashAttribute("org.springframework.validation.BindingResult.mensaje", errors);
        attr.addFlashAttribute("mensaje", mensaje);
    }

    Calendar fechaActual = Calendar.getInstance();
    Date fechaSql = new Date((fechaActual.getTime()).getTime());
    String hora = Integer.valueOf(fechaActual.get(Calendar.HOUR_OF_DAY)).toString();

    mensaje.setIdLatiniaSMS("Prueba");
    mensaje.setIdUsuario(new Long(1));
    mensaje.setEstadoSMS("E");
    mensaje.setFechaSMS(fechaSql);
    mensaje.setHoraSMS(hora);
    mensaje.setResEnvio("Prue");
    mensaje.setResEnvioDec("Prue");
    mensaje.setEstadoEnvio("Est");

    if (mensaje.getTelfLibreta() != null) {
        mensaje.setNumTlfn(mensaje.getTelfLibreta());
    } else if (mensaje.getTelfManual() != null) {
        mensaje.setNumTlfn(mensaje.getTelfManual());
    } else if (excelFile != null) {
        mensaje.setNumTlfn(this.mensajeProvider.obtenerTelefono(excelFile));
    }

    Boolean res;
    res = this.mensajeProvider.guardarMensaje(mensaje);
    if (res) {
        attr.addFlashAttribute("feedback", new MensajeDto(false, "Mensaje guardado correctamente"));

    } else {
        attr.addFlashAttribute("feedback", new MensajeDto(true, "Error al guardar el mensaje"));

    }
    model.clear();
    return "redirect:/mensajes";

}

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете использовать что-то вроде этого:

@PostMapping("/image/tmp")
open fun saveMediaContentTmp(file: MultipartFile): ResponseEntity<Map<String, String>> {

    val endPath = Path(PATH_TO_TMP_FILE)
    Files.copy(file.inputStream, endPath, StandardCopyOption.REPLACE_EXISTING)

    importarFichero(endPath.toFile())

    return ResponseEntity.ok(mapOf(
            "name" to file.originalFilename
    ))
}

это язык котлина, но я надеюсь, что все будет ясно.

0 голосов
/ 16 октября 2018

Используйте расширение apachePOI (библиотека), и вы можете делать все, что пожелаете, с помощью Excel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...