Réduire la taille du fichier pour les graphiques collés d'excel à word

j'ai créé des rapports en copiant des graphiques et des données d'un document excel dans un document word. Je colle dans un contrôle de contenu, donc j'utilise ChartObject.CopyPicture en excel et ContentControl.Range.Paste dans word. Ceci est fait dans une boucle:

Set ws = ThisWorkbook.Worksheets("Charts")
With ws
For Each cc In wordDocument.ContentControls

    If cc.Range.InlineShapes.Count > 0 Then
        scaleHeight = cc.Range.InlineShapes(1).scaleHeight
        scaleWidth = cc.Range.InlineShapes(1).scaleWidth
        cc.Range.InlineShapes(1).Delete
        .ChartObjects(cc.Tag).CopyPicture Appearance:=xlScreen, Format:=xlPicture
        cc.Range.Paste
        cc.Range.InlineShapes(1).scaleHeight = scaleHeight
        cc.Range.InlineShapes(1).scaleWidth = scaleWidth
    ElseIf ...
Next cc
End With

la création de ces rapports à L'aide D'Office 2007 a donné des fichiers d'environ 6 Mo, mais leur création (à l'aide de la même feuille de travail et du même document) dans Office 2010 donne un fichier qui est environ 10 fois plus gros.

après avoir déballé le docx, Je trouvé que la taille supplémentaire vient de fichiers emf qui correspondent à des graphiques qui sont collés en utilisant VBA. Là où ils vont de 360 à 900 KB avant, ils sont 5-18 MB. Et les graphismes ne sont pas visiblement mieux.

Encore plus loin, il semble être lié au Style Graphique. J'ai créé une nouvelle feuille de calcul et inséré 7 points de données et un diagramme à secteurs 2D correspondant. Avec le style par défaut, il a copié comme un emf de 79 KO, et avec le style 26 Il copie comme un emf de 10 Mo. Lorsque J'utilisais Office 2007, le le diagramme serait copié comme un CEM de 700 KB. C'est le code:

Sub CopyAndPaste()
    ThisWorkbook.Worksheets("Charts").ChartObjects("Chart 1").CopyPicture Appearance:=xlScreen, Format:=xlPicture
    GetObject(, Class:="Word.Application").ActiveDocument.Range.Paste
End Sub

je suis en mesure de CopyPicture avec le format xlBitmap, et bien que ce soit un peu plus petit, il est plus grand que le CEM généré par Office 2007 et de qualité nettement moins bonne. Existe-il d'autres options pour réduire la taille du fichier? Idéalement, je voudrais produire un fichier avec la même résolution pour les graphiques que J'ai utilisé Office 2007. Y a-t-il un moyen qui utilise VBA seulement (sans modifier les graphiques dans le tableur)? Est-ce que je peux facilement copier en tant qu'objet sans lier les documents?

18
demandé sur Kazimierz Jawor 2014-05-22 16:54:27

3 réponses

"C'est un vieux code, monsieur, mais il vérifie."

c'est une vieille question et j'ai une solution encore plus ancienne (possible): vous pouvez compresser votre .EMF files as .EMZ par gzipping. Cela réduira la taille de votre fichier tout en conservant la qualité de l'image.

sur VB6 j'ai utilisé zlib.dll et le code ci-dessous. J'ai renommé les noms des fonctions en anglais mais j'ai gardé tous les commentaires en portugais:

Option Explicit

' Declaração das interfaces com a ZLIB
Private Declare Function gzopen     Lib "zlib.dll" (ByVal file As String, ByVal mode As String) As Long
Private Declare Function gzwrite    Lib "zlib.dll" (ByVal file As Long, ByRef uncompr As Byte, ByVal uncomprLen As Long) As Long
Private Declare Function gzclose    Lib "zlib.dll" (ByVal file As Long) As Long
Private Declare Function Compress   Lib "zlib.dll" Alias "compress" (ByRef dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long) As Long
Private Declare Function Uncompress Lib "zlib.dll" Alias "uncompress" (ByRef dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long) As Long

' Ler o conteúdo de um arquivo
Public Function FileRead(ByVal strNomeArquivo As String) As Byte()

    Dim intHandle     As Integer
    Dim lngTamanho    As Long
    Dim bytConteudo() As Byte

    On Error GoTo FileReadError

    ' Abrir o documento indicado
    intHandle = FreeFile
    Open strNomeArquivo For Binary Access Read As intHandle

    ' Obter o tamanho do arquivo
    lngTamanho = LOF(intHandle)
    ReDim bytConteudo(lngTamanho)

    ' Obter o conteúdo e liberar o arquivo
    Get intHandle, , bytConteudo()
    Close intHandle

    FileRead = bytConteudo

    On Error GoTo 0
    Exit Function

FileReadError:

    objLogger.GravarEvento "modZLib.FileRead: " & Err.Description & " (" & Err.Number & " - " & Err.Source & ")", logTipoEvento.Erro

End Function

'Compactar um arquivo com o padrão gzip
Public Sub FileCompress(ByVal strArquivoOrigem As String, ByVal strArquivoDestino As String)

    Dim gzFile        As Long
    Dim bytConteudo() As Byte

    On Error GoTo FileCompressError

    ' Ler o conteúdo do arquivo
    bytConteudo = FileRead(strArquivoOrigem)

    ' Compactar o conteúdo
    gzFile = gzopen(strArquivoDestino, "wb")
    gzwrite gzFile, bytConteudo(0), UBound(bytConteudo)
    gzclose gzFile

    On Error GoTo 0
    Exit Sub

FileCompressError:

    objLogger.GravarEvento "modZLib.FileCompress:" & Err.Description & " (" & Err.Number & " - " & Err.Source & ")", logTipoEvento.Erro

End Sub
1
répondu Rubens Farias 2015-04-24 18:51:43

j'ai eu quelque chose comme ça avant

au Lieu d'utiliser

Document.Range.Paste

Essayez D'Utiliser

Document.Range.PasteSpecial DataType:= wdPasteMetafilePicture

ou

Document.Range.PasteSpecial DataType:= wdPasteShape

cela va coller le graphique comme une image ou un dessin par opposition à un objet excel intégré

Equivelant à l'aide de "collage Spécial..."à partir du menu.

les autres types de données sont disponible

http://msdn.microsoft.com/en-us/library/office/aa220339(v=office.11).aspx

1
répondu Tom Page 2014-08-22 22:53:44

cela se produit peut-être parce que le .les fichiers emf sont mis à l'échelle incorrectement. Utiliser PNG peut résoudre le problème de taille (tel que mentionné dans les commentaires ci-dessus), mais restera un problème car il ne s'agit pas d'images vectorielles.

si vous utilisez AddPicture pour ajouter des images à votre fichier, alors la page suivante montre une solution dans laquelle vous pouvez changer l'échelle et réduire filesize de quelque défaut est utilisé. Donc, il pourrait résoudre votre question.

http://social.msdn.microsoft.com/Forums/en-US/f1c9c753-77fd-4c17-9ca8-02908debca5d/emf-file-added-using-the-addpicture-method-looks-bigger-in-excel-20072010-vs-excel-2003?forum=exceldev

0
répondu hnk 2014-07-01 23:02:56