Les Snippets

Connexion

Visualiser un fichier word contenu dans un champ OLE ACCESS

Niveau requis pour utiliser/comprendre cette source : 1 ( Débutant )
Créé le 01/02/2009 20:12:35 et initié par PCPT [Liste]
Date de mise à jour : 01/02/2009 20:17:24
Vue : 3570
Catégorie(s) : Base de données, API, Trucs & Astuces
Langages dispo pour ce code :
- VBA



Langage : VBA
Date ajout : 01/02/2009
Posté par PCPT [Liste]
DateMAJ : 01/02/2009
Private Type  PT
    Width       As Integer
    Height      As Integer
End Type
Private Type OBJECTHEADER
    Signature   As Integer
    HeaderSize  As Integer
    ObjectType  As Long
    NameLen     As Integer
    ClassLen    As Integer
    NameOffset  As Integer
    ObjectSize  As PT
    OleInfo     As String 256
End Type
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As AnyByVal cbCopy As Long)
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As LongByVal lpBuffer As String) As Long
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As LongByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As  Long
'
'    adaptation depuis  http://www.tech-archive.net/Archive/VB/microsoft.public.vb.general.discussion/2005-10/msg01640.html
Function GetOLEWordDoc2File(ByRef vLookUpResult As Variant) As String
'   nécessite les 3 fonctions suivantes
'   GetTempDirectory :  http://www.codyx.org/snippet_recuperer-chemin-temp_772.aspx#2291
'   CreateFileFromBytes :  http://www.codyx.org/snippet_enregistrer-tableau-bytes-dans-fichier_5.aspx#1367
'   StartProcess :  http://www.codyx.org/snippet_ouvrir-document-lancer-executable_25.aspx#1548
    Dim abArr()          As Byte
    Dim sDest            As String
    Dim ObjHeader        As OBJECTHEADER
    Dim ObjectOffset     As Long
    Dim Buffer           As String
    Dim i                As Long
    Dim FileOffset       As Long
    Dim FileHeaderOffset As Integer
    Dim FileStream()     As Byte
    
    
'   tableau  de bytes
    On Local Error GoTo Err_Handler
    abArr = vLookUpResult
    On Error GoTo 0
'   chemin  d'extraction
    sDest = GetTempDirectory & "ExtractionOLE_" Format$(Now"MMDDHHNNSS") & ".doc"
    'Copy the first 19  bytes into a variable of the defined type OBJECTHEADER
'   copie le header du champ
    CopyMemory ObjHeader, abArr(0), 19
    'Determine where the  header ends
'   position de la fin du  header
    ObjectOffset = ObjHeader.HeaderSize +  1
    'Grab enough  bytes after the OLE header to get file header
'    récupère le header string du fichier sans le header du ole
    Buffer = ""
    For i = ObjectOffset To ObjectOffset + 512
        Buffer = Buffer & Chr$(abArr(i))
    Next i
    
    'Make sure the class  of the object is Word Document
'   le header  informe bien d'un doc word?
    If Mid$(Buffer, 1213) = "Word.Document" Then
'       récupère la  position de la fin de la première partie du header
        FileHeaderOffset = InStr(Buffer, "ÐÏ")
        If FileHeaderOffset > Then
            'Calculate the  beginning of the document
'           fin du  header => début du document
            FileOffset = ObjectOffset + FileHeaderOffset - 1
            
            'Move  document into its own array
'           2e tableau sans le header parasite
            ReDim FileStream(UBound(abArr) -  FileOffset)
            CopyMemory FileStream(0), abArr(FileOffset), UBound(abArr) - FileOffset +  1
            'Document file path
'           enregistrement du tableau dans le doc  temp
            Call CreateFileFromBytes(sDest,  FileStream)
            
'            retour
            GetOLEWordDoc2File = sDest
        End If
    End If
Err_Handler:
    Erase FileStream
    Erase abArr
End Function

Remarque :
Private Sub  test()
    Dim sPathRet As String
    sPathRet = GetOLEWordDoc2File(DLookup("[Nom du champ OLE]", "[Nom de la table]", "filtre approprié"))

    If Len(sPathRet) Then
        StartProcess sPathRet
    Else
        MsgBox "Erreur lors de l'extraction du champ OLE", vbExclamation
    End If
End Sub

Snippets en rapport avec : Fichier, Database, Word, Ole, Binary



Codes sources en rapport avec : Fichier, Database, Word, Ole, Binary

{Visual Basic, VB6, VB.NET, VB 2005} WORD : OUVERTURE (AVEC OU SANS PASSWORD) ET PROPRIÉTÉES D'UN DOCUMENT WORD
Ce code a pour but d'ouvrir les doc. word (avec ou sans mot de passe, cependant si avec il le faut.....

{Visual Basic, VB6, VB.NET, VB 2005} PERMET DE RETROUVER DES FICHIERS WORD CONTENANT UN GROUPE DE MOTS
Lecture des fichiers (.DOC) d'un répertoire choisi et visualisation de l'aperçu des fichiers contena...

{ASP / ASP.NET} ENREGISTRER DES FICHIERS DANS UNE BASE DE DONNÉES ET LES RESTITUER
J'ai fait cette source suite à pas mal de questions sur le forum, pour par exemple comment afficher ...

{Visual Basic, VB6, VB.NET, VB 2005} PILOTAGE OLE DE EXCEL OU WORD
Cette DLL va cous permettre d'executer à peu prés toutes les manipulations possibles depuis Excel ou...

{Visual Basic, VB6, VB.NET, VB 2005} RÉCUPÉRER / D'ASSIGNER LA VALEUR D'UNE IMAGE OU UN FICHIER COMPLET
Dans une DB, on peut trouver des champs Image, OLE, Text, NText, ... Bref, tout ce qu'il faut pour s...

{Visual Basic, VB6, VB.NET, VB 2005} PILOTER WORD PAR OLE AVEC ACCESS OU VB
Ces routines offrent une palette assez complète des choses qu'on peut demander à Word. Vous copie...

{Visual Basic, VB6, VB.NET, VB 2005} MANIPULATION DES FICHIERS WORD PROTÉGÉS
cette source vous montre comment attribuer un mot de passe à un document microsoft word ouvert puis ...

{C / C++ / C++.NET} EDITER UN FICHIER BIT PAR BIT
Bonjout, J'ai récemment eu besoin d'éditer un fichier bit à bit mais ne trouvant pas de moyen de ...

{PHP} CHARGER DES DONNÉES DEPUIS UN FICHIER TXT DANS UNE BASE DE DONNÉE
le titre dit tout dejàs ce script utilise une base de données Mysql les requêtes pour la création ...

{Visual Basic, VB6, VB.NET, VB 2005} INSERER TOUT TYPE DE FICHIERS DANS ORACLE EN VB.NET
Ce petit code permet d'ajouter tout type de fichiers dans oracle et par la suite de les récupérer, l...