2009-07-02 4 views
8

Ich habe viele schöne Symbole von Microsoft Office 2007 gefunden. Haben Sie eine Idee für den Auszug & alle Symbole als PNG-Dateien mit VBA speichern?Wie kann ich das ImageMSO-Symbol von Microsoft Office 2007 speichern?

Partial ImageMSO http://rabu4g.bay.livefilestore.com/y1p2SF1q63YjDjPNmK4nYMW2644r9AO2aAsE__vBYznTeXD0b4SJUU0O07fxPD0r7aO_83gCJ-8OfcOQsFKG0fQMRnTEneBU1TI/Capture.PNG

Der folgende Code ist ein Code, der verwendet wird Bild von imageMso zu bekommen.

Application.CommandBars.GetImageMso([name], [width], [height]) 

Ich kann alle als Picture-Steuerelement anzeigen und Datei als Webseite speichern treffen. Allerdings hat jedes Icon eine sehr geringe Qualität.

Darüber hinaus versuche ich, C# Excel-Add-in-Projekt zum Exportieren als Bitmap-Objekt mit dem folgenden Code zu erstellen. Aber ich habe festgestellt, dass es nicht als halbtransparentes PNG exportieren kann.

stdole.IPictureDisp p = Application.CommandBars.GetImageMso(fileName, size, size); 
Bitmap b = Bitmap.FromHbitmap((IntPtr)p.Handle, (IntPtr)p.hPal); 

PS. Ich möchte alle Symbole als PNG-Format speichern, da ich die halbtransparente Funktion verwenden muss. Es erlaubt mir, alle Symbole auf den meisten Hintergrundfarbe mehr als weißen Hintergrund zu verwenden.

+0

@Soul_Master ein wenig Glück mit Extrahierung? –

+0

Nein. Ich gebe einfach auf. –

Antwort

1

Alle PNG-Dateien können gefunden werden here Diese sind alle im PNG-Format bereits. Gute Programmierung! (Ein schönes ZIP-Archiv ist ebenfalls verfügbar Here) Das ZIP-Archiv enthält alle 17 der Excel-Symbole.

Wenn Sie die GetImageMso-Methode verwenden, erhalten Sie am Ende eine IPicture-Schnittstelle zum Objekt. Die IPicture-Schnittstelle greift auf das Symbol zu, das für die Speicherung in einer Datei im ursprünglichen Format geeignet ist - eine .ICO-, .WMF- oder eine .BMP-Datei. Das PNG-Format wird nicht unterstützt. Die folgenden Links erklären, warum dies nicht direkt möglich ist:

http://msdn.microsoft.com/en-us/library/aa434604.aspx (msoGetImageMso Methode) http://msdn.microsoft.com/en-us/library/ms680761%28VS.85%29.aspx (IPicture Interface) http://msdn.microsoft.com/en-us/library/ms694504%28VS.85%29.aspx (Save As File-Methode)

jedoch eine komplexere Ansatz wird ergeben, was Sie wollen :

http://blogs.msdn.com/mshneer/archive/2007/10/10/preserving-transparency-when-rendering-office-icons.aspx

4

ich habe eine C# Utility-Klasse zum Extrahieren von Office2007 Galerie Icons Dateien .png verpackt, während ihre Transparenz prope Aufrechterhaltung rly. Der Hauptcode stammt aus einem großartigen Artikel von Andrew Whitechapel ( http://blogs.msdn.com/b/andreww/archive/2007/10/10/preserving-the-alpha-channel-when-converting-images.aspx). Ich habe dies in das Office 2007-Beispielsymbolblatt integriert, falls Sie alle diese Symbole in einen Zielordner extrahieren möchten.

Schritte sind:

1) bei http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=11675 die Office-Gallery-Tabelle herunterladen

2) Rufen Sie OfficeIcons.ExtractAllIcons() mit der Lage der Tabelle Office2007IconsGallery.xlsm Probe und der Zielordner, wo Sie wollen die Symbole extrahiert.

{code}

using System; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Runtime.InteropServices; 
using System.Xml.Linq; 
using ExcelDna.Integration; 
using ICSharpCode.SharpZipLib.Zip; 
using Microsoft.Office.Interop.Excel; 
using stdole; 

public class OfficeIconUtils 
{ 
    public static void ExtractAllIcons(string xlsmPath, string targetFolder) 
    { 
     // extract customUI.xml 
     var zf = new ZipFile(xlsmPath); 
     var entry = zf.GetEntry("customUI/customUI.xml"); 
     var zipStream = zf.GetInputStream(entry); 
     XNamespace ns = "http://schemas.microsoft.com/office/2006/01/customui"; 
     var root = XElement.Load(zipStream); 
     foreach (var gallery in root.Descendants(ns + "gallery")) 
     { 
      //create a sub-folder for the gallery 
      var subFolder = Path.Combine(targetFolder, 
       gallery.Attribute("label").Value); 
      var width = int.Parse(gallery.Attribute("itemWidth").Value); 
      var height = int.Parse(gallery.Attribute("itemHeight").Value); 
      Directory.CreateDirectory(subFolder); 
      foreach (var item in gallery.Descendants(ns + "item")) 
      { 
       SaveIcon(item.Attribute("imageMso").Value, 
        subFolder, width, height); 
      } 
     } 
    } 

    public static void SaveIcon(string msoName, string folder, 
     int width = 32, int height = 32) 
    { 
     ConvertPixelByPixel(
      ((Application)(ExcelDnaUtil.Application)) 
       .CommandBars.GetImageMso(msoName, width, height)) 
      .Save(Path.Combine(folder, string.Format("{0}.png", 
      msoName)), ImageFormat.Png); 
    } 


    public static Bitmap ConvertPixelByPixel(IPictureDisp ipd) 
    { 
     // get the info about the HBITMAP inside the IPictureDisp 
     var dibsection = new DIBSECTION(); 
     GetObjectDIBSection((IntPtr)ipd.Handle, Marshal.SizeOf(dibsection), ref dibsection); 
     var width = dibsection.dsBm.bmWidth; 
     var height = dibsection.dsBm.bmHeight; 

     // create the destination Bitmap object 
     var bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb); 

     unsafe 
     { 
      // get a pointer to the raw bits 
      var pBits = (RGBQUAD*)(void*)dibsection.dsBm.bmBits; 

      // copy each pixel manually 
      for (var x = 0; x < dibsection.dsBmih.biWidth; x++) 
       for (var y = 0; y < dibsection.dsBmih.biHeight; y++) 
       { 
        var offset = y * dibsection.dsBmih.biWidth + x; 
        if (pBits[offset].rgbReserved != 0) 
        { 
         bitmap.SetPixel(x, y, Color.FromArgb(pBits[offset].rgbReserved, pBits[offset].rgbRed, pBits[offset].rgbGreen, pBits[offset].rgbBlue)); 
        } 
       } 
     } 

     return bitmap; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    private struct RGBQUAD 
    { 
     public byte rgbBlue; 
     public byte rgbGreen; 
     public byte rgbRed; 
     public byte rgbReserved; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct BITMAP 
    { 
     public Int32 bmType; 
     public Int32 bmWidth; 
     public Int32 bmHeight; 
     public Int32 bmWidthBytes; 
     public Int16 bmPlanes; 
     public Int16 bmBitsPixel; 
     public IntPtr bmBits; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct BITMAPINFOHEADER 
    { 
     public int biSize; 
     public int biWidth; 
     public int biHeight; 
     public Int16 biPlanes; 
     public Int16 biBitCount; 
     public int biCompression; 
     public int biSizeImage; 
     public int biXPelsPerMeter; 
     public int biYPelsPerMeter; 
     public int biClrUsed; 
     public int bitClrImportant; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    public struct DIBSECTION 
    { 
     public BITMAP dsBm; 
     public BITMAPINFOHEADER dsBmih; 
     public int dsBitField1; 
     public int dsBitField2; 
     public int dsBitField3; 
     public IntPtr dshSection; 
     public int dsOffset; 
    } 

    [DllImport("gdi32.dll", EntryPoint = "GetObject")] 
    public static extern int GetObjectDIBSection(IntPtr hObject, int nCount, ref DIBSECTION lpObject); 

} 

{code}

+0

Wäre nett, wenn Sie die 500 Abhängigkeiten angeben, auf die sich das stützt, ganz zu schweigen davon, dass, sobald Sie sie gefunden haben, der gesamte Code nicht kompiliert wird. –

+0

Referenzen hinzugefügt, tut mir leid. Es kompiliert jedoch definitiv - –

0

Ich habe Ismail Antwort versucht, und es toll funktioniert. Es hat jedoch eine Weile gedauert, bis ich herausgefunden hatte, wie es funktioniert.Ich kann dieses Bit des Wissens teilen:

Die Lösung erfordert ExcelDna von Codeplex: link.

Wie ich Net 4.0 verwende ich habe nicht .zip Unterstützung so extrahierte ich zuerst die .xslm Dateien auf eine flache Verzeichnisstruktur dann änderte ich den Code direkt aus den Dateien zu lesen. Dann in Excel nenne ich die ExcelDna Erweiterungsmethode als

=ExtractIcons("Office2207IconsGallery";"folder_where_to_store_icons") 

Die using-Anweisungen für die Utility-Klasse (für mich):

using System.Xml.Linq; 

using System.IO; 

using System.Drawing; 

using System.Runtime.InteropServices; 

using System.Drawing.Imaging; 

using Application = Microsoft.Office.Interop.Excel.Application; 

using ExcelDna.Integration; 

using stdole; 

this helps .... Danke Ismail!

7

Ich benutze ImageMso ziemlich häufig in meiner Excel-Entwicklung. Nachdem ich über diesen Beitrag gestolpert bin, ging ich noch einen Schritt weiter und stellte ein Paket zusammen, um visuell Symbole aus Microsoft Excel als Datei zu suchen, zu extrahieren und zu speichern oder mit einer Alpha-Kanal-Transparenz in eine andere Anwendung zu kopieren und einzufügen. Ich habe auch eine Liste von 8.899 verschiedenen ImageMso-Namen aus den verschiedenen Quellen zusammengestellt. Ich hoffe, andere können das nützlich finden.

Microsoft Office Icons (ImageMSO) Gallery & Extraction

ImageMSO Gallery on Microsoft Excel 2013 running Windows 8

+0

Leider funktioniert es nicht in Excel 2013. –

+0

Ich kann Add-In zu meinem Excel 2013 auf Windows 8 laden. Aber es gibt keine neue Gruppe/Befehl in der Registerkarte Einfügen. –

+0

Ich verwende eine 32-Bit-Version von Excel 2013. Nach dem Laden dieses Add-Ins ist nichts passiert. –

Verwandte Themen