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
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    14
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    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
    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

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    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
    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");
    }

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 14
    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
    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

+ 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