UNO et OpenOffice

cs_tenthor Messages postés 55 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 29 juin 2007 - 22 mai 2007 à 16:12
cs_tenthor Messages postés 55 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 29 juin 2007 - 29 juin 2007 à 09:25
Bonjour,

Je développe en java avec UNO pour manipuler les fichers openOffice.

Voici mon problème : j'ai un document OpenOffice.org. J'aimerais pourvoir localiser une phrase dans ce texte, et récupérer le XTextRange de cette phrase.  Vous savez si c'est possible ? Et si oui comment faire ? Je cherche depuis ce matin et je ne trouve pas de solution.

Merci de votre attention,
Tenthor.

5 réponses

Newobsorder Messages postés 2 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 28 juin 2007
28 juin 2007 à 09:07
Est-ce que quelqu'un t'as répondu? as-tu trouvé une solution? car Je suis confronté au même problème actuellement.
merci!
0
cs_tenthor Messages postés 55 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 29 juin 2007 1
28 juin 2007 à 09:20
Bonjour,

Non personne ne m'a repondu ! Mais j'ai trouver des solution sur le forum d'openOffice : http://www.oooforum.org/forum/ section Macro and API.

Voici un code permettant de remplacer du texte dans un document :

/**
     * Cette méthode permet de remplacer un texte par un autre dans le document.
     *
     * @param document le document où il faut remplacer le texte.
     * @param oldValue l'ancienne valeur qui se trouve dans le document.
     * @param newValue la nouvelle valeur à placer dans le document.
     *
     * @author pierre.magnaud@crosstalk.fr
     */
    private void remplacerTexte(XTextDocument document, String oldValue, String newValue)
    {
        XReplaceable xReplaceable = (XReplaceable) UnoRuntime.queryInterface(XReplaceable.class, document);
        XReplaceDescriptor xReplaceDescr = (XReplaceDescriptor) xReplaceable.createReplaceDescriptor();
        /* Définie la valeur qui sera recherchée. */
        xReplaceDescr.setSearchString(oldValue);
        /* Indique la valeur de remplacement. */
        xReplaceDescr.setReplaceString(newValue);
        /* Remplace toutes les occurences de oldValue par newValue. */
        xReplaceable.replaceAll( xReplaceDescr );
    }

Bon courrage !

Au fait sur le forum, un personne appelé DannyB à fait entre autre deux classes très utils pour utiliser OOo : http://www.oooforum.org/forum/viewtopic.phtml?p=50058#50058
0
Newobsorder Messages postés 2 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 28 juin 2007
28 juin 2007 à 14:49
Effectivement ca marche merci beaucoup!
Mais je tombe sur plus compliqué cette fois... :

Saurais-tu comment localiser un tableau cette fois au lieu d'un simple texte et le remplacer par un tableau créé soi-même?
0
cs_tenthor Messages postés 55 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 29 juin 2007 1
29 juin 2007 à 09:24
Salut !

Je suis pas sûr de bien comprendre ta question. Tu veux localiser un tableau ??

Moi ce que je peux te conseiller, c'est de parcourrir les tableaux de ton document, regarder ce qu'il y a dedans, si ca te semble être ce tableau, tu vide le contenu de chaque case et tu met ce que tu veux dedans a la place (tu rajoute des lignes et des colonne au besoin).

Pour parcourrir un tableau, tu commence par récupérer un index sur les tableau du document :

/**
     * Permet de récupérer un index, sur les tables du document.
     *
     * @param document le document.
     * @return l'index sur les tables, ou <code>null</> en cas d'échec.
     *
     * @author pierre.magnaud@crosstalk.fr
     */
    private XIndexAccess getIndexTables(XTextDocument document)
    {
        XIndexAccess xIndexedTables = null;
        /* Index sur des tables contenu dans le document. Il y a trois étapes. */   
        /* 1. Récupérer l'interface XTextTablesSupplier du document. */
        XTextTablesSupplier xTablesSupplier = (XTextTablesSupplier) UnoRuntime.queryInterface(XTextTablesSupplier.class, document );
        /* 2. Récupérer la collection de tables. */
        XNameAccess xNamedTables = xTablesSupplier.getTextTables();
        /* 3. Demande l'interface XIndexAccess de la collection des tables. */
        xIndexedTables = (XIndexAccess) UnoRuntime.queryInterface( XIndexAccess.class, xNamedTables);
        return xIndexedTables;
    }

Ensuite tu parcours les table une par une et tu fais ton traitement (ici je change les couleur d'une ligne sur deux) :

/**
     * Permet de changer la couleur des lignes des tableau.
     * Les lignes paires sont d'une couleurs, les lignes impaires d'une autre.
     * L'en-tête de colonne, à sa propre couleur.
     *
     * Attention, pour que le changement de couleur s'effectue, les lignes du
     * tableau dans le modèle de document ne doivent pas être colorées (aucun remplissage).
     *
     * @param document le document.
     *
     * @author pierre.magnaud@crosstalk.fr
     */
private void changerCouleurLigne(XTextDocument document)
    {
        /* On récupère un index sur les tables du document. */
        XIndexAccess xIndexedTables = getIndexTables(document);
        if (xIndexedTables != null)
        {
            /* On parcours les tables. */
            try
            {
                /* Pour chaque tables. */
                for (int i = 0 ; i < xIndexedTables.getCount() ; i++)
                {
                    /* On récupère le service TextTable. */
                    Object table;
                    table = xIndexedTables.getByIndex(i);
                    /* On demande l'interface XTextTable correspondant au service TextTable. */
                    XTextTable xTextTable = (XTextTable) UnoRuntime.queryInterface(XTextTable.class, table);
                    /* On récupère un index sur les lignes. */
                    XIndexAccess xRowsIndex = xTextTable.getRows();
                    /* Pour la ligne d'en-tête. */
                    /* On récupère les propriétés de la ligne. */
                    XPropertySet xFirstRowProperties = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowsIndex.getByIndex(0));
                    /* On affiche le fond (background). */
                    xFirstRowProperties.setPropertyValue("BackTransparent", new Boolean(false));
                    /* On change la couleur de fond de la ligne. */
                    xFirstRowProperties.setPropertyValue("BackColor", new Integer(0xFF6666));
                    /* Pour chaque ligne paire. */
                    for (int j = 2 ; j < xRowsIndex.getCount() ; j=j+2)
                    {
                        /* On récupère les propriétés de la ligne. */
                        XPropertySet xRowProperties = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowsIndex.getByIndex(j));
                        /* On affiche le fond (background). */
                        xRowProperties.setPropertyValue("BackTransparent", new Boolean(false));
                        /* On change la couleur de fond de la ligne. */
                        xRowProperties.setPropertyValue("BackColor", new Integer(0xCCFFCC));
                    }
                    /* Pour chaque ligne impaire. */
                    for (int j = 1 ; j < xRowsIndex.getCount() ; j=j+2)
                    {
                        /* On récupère les propriétés de la ligne. */
                        XPropertySet xRowProperties = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowsIndex.getByIndex(j));
                        /* On affiche le fond (background). */
                        xRowProperties.setPropertyValue("BackTransparent", new Boolean(false));
                        /* On change la couleur de fond de la ligne. */
                        xRowProperties.setPropertyValue("BackColor", new Integer(0xCCCCFF));
                    }
                }
            } catch (IndexOutOfBoundsException e)
            {
                e.printStackTrace();
            } catch (WrappedTargetException e)
            {
                e.printStackTrace();
            }catch (UnknownPropertyException e)
            {
                e.printStackTrace();
            } catch (PropertyVetoException e)
            {
                e.printStackTrace();
            } catch (IllegalArgumentException e)
            {
                e.printStackTrace();
            }
        }
    }

Si tu veut récupérer le texte d'une case tu fais :

/* On parcours les cellules de la table, à partir du nom de celle-ci. */
                    /* Pour chaque cellules. */
                    for (int j = 0 ; j < cellsNames.length ; j++)
                    {
                        /* Récupérer le conteneur de texte de la cellule à partir du nom de celle-ci. */
                        XText xCellText = (XText) UnoRuntime.queryInterface(XText.class, xTextTable.getCellByName(cellsNames[j]));
                        /* On récupère le contenu du conteneur (le texte proprement dit cette fois-ci !), sous forme d'une String. */
                        String text = xCellText.getString();
                        /* Si le texte correspond au champs que l'on veut remplacer (le code). */
                        if (text.compareTo(oldValue) == 0)
                        {
                            /* On indique que le code est dans la table. */
                            dansTableau = true;
                            /* On récupère un index sur les lignes. */
                            XIndexAccess xIndexRows = xTextTable.getRows();
                           
                            int nbLig = xIndexRows.getCount()-1;
                            int nbRes = resultats.size();
                            int nbAjout = nbRes-nbLig;
                            /* On rajoute le nombre de lignes nécessaire. */
                            if (nbLig < nbRes)
                                xTextTable.getRows().insertByIndex(xIndexRows.getCount(), nbAjout);
                           
                            /* On créé un curseur sur cette cellule qui contient le code. */
                            XTextTableCursor xTableCursor = xTextTable.createCursorByCellName(cellsNames[j]);
                         ... etc ...

Voilà !
Bonne journée.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_tenthor Messages postés 55 Date d'inscription dimanche 13 novembre 2005 Statut Membre Dernière intervention 29 juin 2007 1
29 juin 2007 à 09:25
Au fait pour mettre du texte dans une case :
    xCellText.setString(" coucou ");
0
Rejoignez-nous