Apache POI 3.17 Custom Propiedades a nivel de hoja

  OPCPackage opcpackage = sheet.getWorkbook().getPackage();
  int i = opcpackage.getUnusedPartIndex("/customProperty#.bin");

Estoy usando Apache poi -3.17 y ooxml-schemas-1.3.jar y quiero escribir propiedades personalizadas en el juego e Im Stuck con este Error.

The method getUnusedPartIndex(String) is undefined for the type Object

Nota: sin usar El método PartIndex es compatible con la última versión de Poi i.e apache poi 4.1.2

Por favor, sugiera una alternativa Método para conseguirUnusedPartIndex para obtener un índice de parte no utilizado basado en el nombrePattern, que todavía no existe y tiene el índice positivo más bajo en Apache Poi 3.17

Pregunta hecha hace 3 años, 4 meses, 13 días - Por webweaverx


2 Respuestas:

  • En versiones anteriores de Apache POI, como la 3.17, la clase OPCPackage no tiene un método directo para obtener un índice de parte no utilizado basado en un patrón de nombre. Sin embargo, puedes lograr el mismo resultado recorriendo todas las partes del paquete y verificando los nombres para encontrar el índice más bajo que aún no se ha utilizado.

    Aquí te muestro un ejemplo de cómo podrías hacerlo:

    java
    OPCPackage opcpackage = sheet.getWorkbook().getPackage();
    int lowestUnusedIndex = 0;
    
    try {
        for (int i = 1; i < Integer.MAX_VALUE; i++) {
            String partName = "/customProperty" + i + ".bin";
            if (opcpackage.getPart(partName) == null) {
                lowestUnusedIndex = i;
                break;
            }
        }
    } catch (InvalidFormatException | IOException e) {
        e.printStackTrace();
    }
    
    System.out.println("Lowest unused index: " + lowestUnusedIndex);
    

    En este código, se itera sobre una serie de nombres de partes concatenando un número basado en el índice hasta encontrar el primer nombre de parte que aún no se ha utilizado.

    Recuerda manejar adecuadamente cualquier excepción que pueda generarse al trabajar con partes del paquete.

    Respondida el Dec 18, 2020 a las 11:33 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para obtener un índice de parte no utilizado basado en un nombrePattern en Apache POI 3.17, puedes utilizar el siguiente enfoque:

    • Obtener todas las partes del paquete OPC:
    java
    OPCPackage opcpackage = sheet.getWorkbook().getPackage();
    List parts = opcpackage.getParts();
    
    • Buscar un índice de parte no utilizado que coincida con el nombrePattern:
    java
    int unusedPartIndex = -1;
    for (int i = 0; i < parts.size(); i++) {
        PackagePart part = parts.get(i);
        if (part.getPartName().getName().matches(namePattern)) {
            unusedPartIndex = i;
            break;
        }
    }
    
    • Si no se encuentra ningún índice de parte no utilizado, devolver el índice de la última parte más uno:
    java
    if (unusedPartIndex == -1) {
        unusedPartIndex = parts.size();
    }
    

    Ten en cuenta que este enfoque no es tan eficiente como el método getUnusedPartIndex disponible en Apache POI 4.1.2, pero funcionará para Apache POI 3.17.

    Ejemplo:

    Para obtener un índice de parte no utilizado para una propiedad personalizada con el nombre "customProp", puedes utilizar el siguiente código:

    java
    int unusedPartIndex = -1;
    OPCPackage opcpackage = sheet.getWorkbook().getPackage();
    List parts = opcpackage.getParts();
    for (int i = 0; i < parts.size(); i++) {
        PackagePart part = parts.get(i);
        if (part.getPartName().getName().matches("/customProperty.bin")) {        unusedPartIndex = i;
            break;
        }
    }
    
    if (unusedPartIndex == -1) {
        unusedPartIndex = parts.size();
    }
    

    Respondida el Dec 18, 2020 a las 11:41 - por Gemini

    Votos positivos: 0 | Votos negativos: 0