¿Hacer Merge de datos a Documentos EXCEL?

Buen día, sucede que necesito hacer una funcionalidad que modifique unos campos que estan definidos en un documento excel en JAVA al igual que lo estoy haciendo en este momento con documentos word (.docx), la verdad sé que hay una API pero no tengo idea de donde encontrarla ni como funciona, la idea es que haga lo siguiente, colocaré el ejemplo del Word ya que se quiere lo mismo pero en documentos excel:

El documento WORD, la plantilla está hecha de la siguiente manera, por ejemplo:

Buen día <item2> <item3>, su número de solicitud es el <item1>, cuando la evaluemos se le informará

Datos del solicitante:

    Nombre: <item2>
    Apellido: <item3>
    Cargo: <item4>
    Institución: <item5>

En el programa se ejecuta y digamos, hace una propuesta para que envien más juegos a su universidad, entonces generamos la solicitud y le creamos el documento y quedaria:

Buen día Fabian Montoya, su número de solicitud es el 123456789, cuando la evaluemos se le informará

Datos del solicitante:

    Nombre: Fabian
    Apellido: Montoya
    Cargo: Estudiante
    Institución: Universidad Nacional

Y listo, se le genera el documento y se le da para que descargue, así funciona el de documentos word, ahora necesito poder hacer lo mismo pero con plantillas de documentos que estan hechas en excel.

Con la misma estructura, cambiar que estén allí por datos que manejamos desde el programa, no sé si me hago entender, espero su ayuda, lo he buscaod durante dos horas y no consigo nada.

0
задан 04.11.2016, 22:46
2 ответа

Уже я это сделал, quedГі asГ-.

static String ruta1 = "D:/", document1 = "FOR_001_EXAMPLE", type1 = ".xlsx";
static String Documento = "", NewDocumento = "";

public static void XLSX(String Ubicacion) throws IOException {

        Ubicacion = Ubicacion.replace("\\", "/"); //Convierto todos los \ en / para congruir en direcciones
        try {
            File Fil = new File(Ubicacion); //Se crea un archivo File
            FileInputStream file = new FileInputStream(Fil); //Se crea archivo FileInput para la lectura
            // Crear el objeto que tendra el libro de Excel
            XSSFWorkbook workbook = new XSSFWorkbook(file);
            /*
         * Obtenemos la primera pestaña a la que se quiera procesar indicando el indice.
         * Una vez obtenida la hoja excel con las filas que se quieren leer obtenemos el iterator
         * que nos permite recorrer cada una de las filas que contiene.
             */
            XSSFSheet sheet = workbook.getSheetAt(0);
            Iterator<Row> rowIterator = sheet.iterator();
            Row row;
            // Recorremos todas las filas para mostrar el contenido de cada celda
            while (rowIterator.hasNext()) {
                row = rowIterator.next();
                // Obtenemos el iterator que permite recorres todas las celdas de una fila
                Iterator<Cell> cellIterator = row.cellIterator();
                Cell celda;
                while (cellIterator.hasNext()) {
                    celda = cellIterator.next();
                    // Dependiendo del formato de la celda el valor se debe mostrar como String, Fecha, boolean, entero...
                    switch (celda.getCellType()) {
                        case Cell.CELL_TYPE_NUMERIC:
                            if (DateUtil.isCellDateFormatted(celda)) {
                                // System.out.println(celda.getDateCellValue());
                            } else {
                                //System.out.println(celda.getNumericCellValue());
                            }
                            break;
                        case Cell.CELL_TYPE_STRING:
                            String item = "";
                            item = celda.getStringCellValue(); //Tomamos el valor de la celda
                            if (item.startsWith("<") && item.endsWith(">")) { //validamos que el contenido de la celda comience por < y termine en >
                                item = item.toLowerCase(); //Hago todo el item en minuscula
                                item = item.replace(">", "");
                                item = item.replace("<", "");
                                System.out.println("ITEM: "+item);
                                Merge(celda, item); //enviamos donde se le cambiará el item por el valor
                            }
                            break;
                        case Cell.CELL_TYPE_BOOLEAN:
                            System.out.println(celda.getBooleanCellValue());
                            break;
                    }
                }
            }
            // cerramos el libro excel
            file.close();
            //Se genera el nuevo archivo con los datos cambiados
            NewDocumento = "A01_" + "MergeFULL_" + document1 + "_SASPRUEBA_XLSX" + type1; //Creamos el nombre del documento
            NewDocumento = ruta1 + NewDocumento; //Agregamos el nombre del documento a la ruta donde se almacena
            FileOutputStream fileOut = new FileOutputStream(NewDocumento); //Doy la ruta y el nombre del archivo nuevo que se generará
            workbook.write(fileOut); //Escribo el nuevo archivo
            fileOut.close(); //Cierro el archivo

        } catch (Exception ex) {
            System.out.println("ERROR: " + ex);
        }
    }

    public static void Merge(Cell cell, String item) {
        if (item.equals("item1")) {
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue("Fabian Dario Montoya");
        } else if (item.equals("item3")) {
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue("Excel_GO");
        } else {
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue("Item_not_found");
        }
    }

    public static void main(String args[]) throws IOException, FileNotFoundException, InvalidFormatException {

        Documento = ruta1 + document1 + type1.toLowerCase();
        //Documento = ruta2+document2+type2;

        if (Documento.endsWith(".xlsx")) {
            XLSX(Documento);
            System.out.println("====??? GENERADO DOCUMENT XLSX ???======");
        } else if (Documento.endsWith(".xls")) {
            XLS(Documento);
            System.out.println("====??? GENERADO DOCUMENT XLS ???======");
        } else {
            System.out.println("Document not have the correct format!, please check it.");
        }

    }
0
ответ дан 24.11.2019, 12:44

Та же самая librerГ - позволяет тебе создавать документы в Excel и или изменять, одинокий ищи в Вебе "производить excel с индейцем-апачием poi в java" есть слишком много примеров, дело в том, что я не понимаю хорошо, что то, что ты хочешь сделать в Excel.

приходит в голову мне что-то asГ - было бы нужно приспосабливать это для того, чтобы он не пробежал весь excel...

    //Recorrido por filas
    Iterator<Row> rowIterator = sheet.iterator();
    while (rowIterator.hasNext()) {
        Row row = rowIterator.next();
        rowIndex = row.getRowNum();

       int rowIndex2 = rowIndex +1;
       Iterator<Cell> cellIterator = row.cellIterator();
       //Recorrido por columnas
       while (cellIterator.hasNext()) {
           String valorCelda = cell.getStringCellValue().trim();
           if(valorcelda.equals("<item9>")){
                //Cambiamos valor de la celda
           }
       }
    }
0
ответ дан 24.11.2019, 12:44
  • 1
    Я хочу изменить ячейки, где я имею, давайте говорить < item9> из-за стоимости item9, не sé давайте говорить мое имя, и я произвожу новый excel с этими измененными данными, где вместо того, чтобы говорить < item9> будешь говорить мое имя, ¿ если я заставляю понимать себя? –  Fabian Montoya 09.11.2016, 20:00
  • 2
    уже edité посмотрим он дает тебе идею, я это не попробовал, но с poi ты не можешь получать прямо ячейку, которую ты хочешь, если у тебя нет индекса, с rowIndex можешь граничить до тех пор, пока линия не делает равные поиски ты был бы должен получать ячейку и ограничивать это потому что, если он не сделает поездку во все ячейки, и смоги, что cicle. Я не сделал что-либо подобное, но это идея, которую я могу давать тебе. –  Alberto Rojas 10.11.2016, 00:31