IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Import tableaux WORD vers Excel en OLE


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Import tableaux WORD vers Excel en OLE
    Bonjour à tous, voici mon problème. J'ai des documents WORD dans lesquels se trouvent des tableaux tous formatés à l’identique. J’ai créé une application Builder OLE pour importer tous ces tableaux vers Excel. Tout ce passe correctement à l’exception de l’import des images (BMP) qui se trouvent dans certaines cellules des tableaux WORD , elles disparaissent lors de l'import.
    Après de multiples essais et recherches sur le NET, rien trouvé, d’où ma question, est-il possible de réaliser cela via OLE car par macro VBA cela fonctionne très bien mais la rapidité n'y est pas.
    Merci de vos aides.

    OS : WIN WP ou WIN 7
    Miscrosoft Office 2003 ou 2010
    C++ Builder XE.

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Salut diouki
    Peut poster le code VBA et ce que tu a ecrit en Ole.
    Si en VBA le fait c'a doit etre possible
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Bonjour Blondelle, voici les codes.
    Tu verras que l’approche est un peu différente, dans le code C++ j’essaye de recréer un pseudo formatage du texte pour éviter que les textes de la cellule WORD ne se retrouvent dans plusieurs lignes sous Excel. Problème des paragraphes.
    Bien à toi.

    Macro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Sub NTT()
    Dim WordDoc As Object
    Dim i As Integer, j As Integer, x As Integer, ligne As Integer, xx As Integer, ligne_TB As Integer
    Dim Cible As Variant, Caract As Variant, largeur As Double
    Dim QuelFichier As Variant
    xx = 5
     
     
    QuelFichier = False
    QuelFichier = Application.GetOpenFilename("Fichiers Word(*.doc),*.doc", , "Sélection du fichier", , False)
    If QuelFichier = False Then
    ' MsgBox QuelFichier
    'Else
     MsgBox "Vous n'avez pas sélectionné de fichier"
     GoTo line1
    End If
     
    Set WordDoc = GetObject(QuelFichier)
    WordDoc.Application.Visible = True
     
    x = WordDoc.Tables.Count
     
    For k = 1 To x
     
     
     For i = 1 To WordDoc.Tables(k).Rows.Count
     ligne = Sheets("Feuil1").Range("A1").CurrentRegion.Rows.Count 'première ligne libre dans Excel
     ligne = ligne + 1
        WordDoc.Tables(k).Columns(1).Cells(i).Range.Copy 'Valeur de la cellule sélectionnée de la table Word
        Caract = WordDoc.Tables(k).Columns(1).Cells(i).Range.Font.Name
        Sheets(1).Range(Cells(ligne, 1), Cells(ligne, 1)).Select
        ActiveSheet.Paste
      For j = 2 To WordDoc.Tables(k).Columns.Count ' copie des autres colonnes
       Cible = WordDoc.Tables(k).Columns(j).Cells(i) 'Valeur de la cellule sélectionnée de la table Word
       Caract = WordDoc.Tables(k).Columns(1).Cells(i).Range.Font.Name 'récupération du type de caractère
       Sheets(1).Cells(ligne, j) = Application.WorksheetFunction.Substitute(Cible, vbCr, vbLf) ' remplace vbCr = Carriage return par vbLf = line feed
       Sheets(1).Cells(ligne, j) = Left(Sheets(1).Cells(ligne, j), Len(Sheets(1).Cells(ligne, j)) - 2) 'enlève les deux derniers caractères de la cellule Word
      Next j
     Next i
    Next k
    WordDoc.Close Savechanges:=False
    'Word.Application.Quit 'ferme l'application Word
    line1:
    End Sub

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    //Nombre de tables dans le DOC
      Nb_Tables = WD_Document.OlePropertyGet("Tables").OlePropertyGet("Count");
      for (Tb = 1; Tb <= Nb_Tables; Tb++)
      {
       //Table sélectionnée
       Tables =WD_Document.OlePropertyGet("Tables").OleFunction("Item", Tb); //sélection table 1
       //Nombre de lignes de la table sélectionnée
        Nb_Lignes = WD_Document.OlePropertyGet("Tables").OleFunction("Item", Tb).OlePropertyGet("Rows").
                    OlePropertyGet("Count");
        //Nombre de colonnes de la table sélectionnée
        Nb_Colonnes = WD_Document.OlePropertyGet("Tables").OleFunction("Item",Tb).OlePropertyGet("Columns").
                    OlePropertyGet("Count");
                for ( Lg = 1; Lg <= Nb_Lignes; Lg++)
                {
          for ( Cl = 1; Cl <= Nb_Colonnes; Cl++)
          {
     //Sélection du texte présent dans la cellule.
                            Cell_Contenu = WD_Document.OlePropertyGet("Tables").OleFunction("Item", Tb).OleFunction("Cell", Lg ,Cl).
                            OlePropertyGet("Range").OlePropertyGet("Text");
                            Texte_cellule = Cell_Contenu; // transtipage Variant --> String
                            Texte_cellule = Texte_cellule.SubString(1,(Texte_cellule.Length() -2));
     // Enlever les mauvais caractères et indenter les bullets sur trois niveaux
                            longueur = Texte_cellule.Length();
                            for(L = 1; L <= longueur; L++)
                            {
                              cara = Texte_cellule[L];
                              if(cara == '\t')
                              {
                                        Texte_cellule.Delete(L,1);
                                        Texte_cellule.Insert(" ", L);
                              }
                              if(cara == '\f')
                              {
                                        Texte_cellule.Delete(L,1);
                                        Texte_cellule.Insert(" ", L);
                              }
                              if(cara == '\r')
                              {
                                        Texte_cellule.Delete(L,1);
                                        Texte_cellule.Insert('\n', L);
                                        // Si numérique en début de ligne alors ajout de blancs
                                        numerique = Texte_cellule[L+1];
                                        if ( (numerique > '0')  &&  (numerique <='9') || (numerique =='-'))
                                        {
                                                    Texte_cellule.Insert("     ", L+1);
                                                    longueur = longueur + 5;
                                                    point = Texte_cellule[L+5+2];
                                                    if (point == '.')
                                                    {
                                                                Texte_cellule.Insert("     ", L+4+2);
                                                                longueur = longueur + 5;
                                                                point = Texte_cellule[L+10+4];
                                                                if (point == '.')
                                                                {
                                                                 Texte_cellule.Insert("     ", L+8+3);
                                                                 longueur = longueur + 5;
                                                                }
                                                    }
                                        }
                              }
                              if(cara == '\a')
                              {
                                        Texte_cellule.Delete(L,1);
                                        Texte_cellule.Insert("|", L);
                              }
                              if(cara == '\0')
                              {
                                        Texte_cellule.Delete(L,1);
                                        Texte_cellule.Insert('\b', L);
                              }
                            }
    // Placement du texte dans la cellule Excel
                            if( (CB1->Checked) && (Cl ==2)&& (Texte_cellule != ""))
                            {
                                        Texte_cellule =  Attribution + "_" + Texte_cellule;
                            }
                            EX_Feuille.OlePropertyGet("Cells").OlePropertyGet("Item", Num_ligne, Cl).
                            OlePropertySet("Value", Texte_cellule.c_str());
    //Formatage de la cellule.
                            EX_Feuille.OlePropertyGet("Cells",Num_ligne,1).OlePropertySet("WrapText", true);
                            EX_Feuille.OlePropertyGet("Cells", Num_ligne, Cl).
                                        OlePropertyGet("Font").OlePropertySet("Name", "Arial Narrow");
                            EX_Feuille.OlePropertyGet("Cells", Num_ligne, Cl).
                                        OlePropertyGet("Font").OlePropertySet("Size",10);
                            if (Cl > 1)
                            {
                               EX_Feuille.OlePropertyGet("Cells", Num_ligne, Cl).
                                        OlePropertyGet("Font").OlePropertySet("Size",7);
                            }
                            EX_Feuille.OlePropertyGet("Cells",Num_ligne, Cl).
                                        OlePropertyGet("Font").OlePropertySet("Bold",false);
                            EX_Feuille.OlePropertyGet("Cells",Num_ligne, Cl).
                                        OlePropertyGet("Font").OlePropertySet("Italic",false);
                            EX_Feuille.OlePropertyGet("Cells",Num_ligne, Cl).
                                        OlePropertyGet("Font").OlePropertySet("ColorIndex",0);
                            if(Cl ==2)
                            {
                                        EX_Feuille.OlePropertyGet("Cells",Num_ligne, 2).
                                        OlePropertyGet("Font").OlePropertySet("ColorIndex",3);
                                        if( Texte_cellule == "")
                                        {
                                                    EX_Feuille.OlePropertyGet("Cells",Num_ligne, Cl-1).
                                                    OlePropertyGet("Font").OlePropertySet("Bold",true);
                                        }
            }
                            EX_Feuille.OlePropertyGet("Cells",Num_ligne, Cl).
                                        OlePropertySet("HorizontalAlignment",1 );// xlGeneral
                            EX_Feuille.OlePropertyGet("Cells",Num_ligne, Cl).
                                        OlePropertySet("VerticalAlignment",-4160 );// xlTop
                            vBorders = EX_Feuille.OlePropertyGet("Cells",Num_ligne,Cl).OlePropertyGet("Borders");
                            vBorders.OlePropertySet("LineStyle", 1);
                   }//for Columns
                   Num_ligne = Num_ligne + 1;
                   EX_Feuille.OlePropertyGet("Rows", Cl).OleFunction("AutoFit");
                 }//for Rows
      }//for Tables
     // fermer fichier WORD
                 WD_Documents.OleFunction("Close", false, NULL);
                 ouverture = 0;
                 WD.OleFunction("Quit");
                 Edt_Titre_Word->Clear();
    //     WD = Unassigned;
     
    }

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Desole de repondre tardivement
    Je pense que le plus rapide est de selectionner la table, de la copier et de la coller dans Excel, de formater les cellules Excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include <utilcls.h>
    #include <vcl\Clipbrd.hpp>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    Variant vMSWord, vWDocuments, vWDocument;
    Variant vMSExcel, vXLWorkbook, vXLWorkbooks, vWorksheet;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
         : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    try
            {
        vMSWord = Variant::GetActiveObject("Word.Application");
            }
    catch(...)
            {
        vMSWord = Variant::CreateObject("Word.Application");
            }
    vMSWord.OlePropertySet("Visible", true);
    vWDocuments = vMSWord.OlePropertyGet("Documents");
    vWDocument = vWDocuments.OleFunction("Add");
    //-----------
    vWDocument.OlePropertyGet("Tables").OleFunction("Item",1).OleFunction("Select");
    vMSWord.OlePropertyGet("Selection").OleFunction("Copy");
    //-----------
    vMSExcel = Variant::CreateObject("Excel.Application");
            vMSExcel.OlePropertySet("Visible", true);
                    vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
                            vXLWorkbook = vXLWorkbooks.OleFunction("Add");
                    vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets", 1);
    vWorksheet.OleProcedure("Select");
    vWorksheet.OlePropertyGet("Range", "A1").OleFunction("Select"); //.OleProcedure("Paste");
    vMSExcel.OlePropertyGet("ActiveSheet").OleProcedure("Paste");
    }
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Bonjour Blondelle, pas de souci c’est déjà très gentil de répondre et de passer du temps sur les problèmes des autres.
    J’ai essayé ta proposition et effectivement les images sont bien exportées malheureusement je pers le formatage des cellules WORD lors de la copie dans les cellules Excel, texte d’une cellule WORD se retrouve dans plusieurs lignes suivant le nombre de paragraphes contenus dans la cellule WORD, mais bon je vais voir ce que je peux faire en me basant sur ton code.
    Grand merci.

    Je ne clôture pas encore la discussion au cas où j’aurai encore une question.

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    Par défaut
    Tu peut recuperer les dimensions des cellules Word pour redimensionner celles d'Excel, je t'ai juste donne une piste je vois que tu metrise Ole Word Excel, pense a la FAQ sur le site elle est assez complete
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Importer des données de word vers excel
    Par fifex dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/08/2013, 17h36
  2. copie de tableaux de Word vers Excel plante si gros fichiers
    Par Patnel dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/03/2011, 15h50
  3. Tableaux WORD vers HTML
    Par luxmen dans le forum VBA Word
    Réponses: 15
    Dernier message: 02/02/2009, 12h01
  4. Macro import du texte Word vers Excel
    Par Bernard6773 dans le forum VBA Word
    Réponses: 6
    Dernier message: 05/09/2007, 10h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo