2009-07-02 14 views
8

Ho trovato molte belle icone di Microsoft Office 2007. Avete qualche idea per estrarre & salvare tutte le icone come file PNG usando VBA?Come salvare l'icona di ImageMSO da Microsoft Office 2007?

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

Il seguente codice è un codice che viene utilizzato per ottenere l'immagine da ImageMSO.

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

Posso visualizzare tutto come controllo PictureBox e salvare il file excel come pagina web. Tuttavia, ogni icona ha una qualità molto bassa.

Inoltre, provo a creare il progetto aggiuntivo C# in Excel per l'esportazione come oggetto Bitmap utilizzando il seguente codice. Ma ho scoperto che non può esportare come PNG semitrasparente.

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

PS. Voglio salvare tutte le icone in formato PNG perché ho bisogno di usare una funzione semi-trasparente di esso. Mi consente di utilizzare tutte le icone sulla maggior parte del colore di sfondo più dello sfondo bianco.

+0

@Soul_Master fortuna con estrazione? –

+0

No. Mi arrendo solo per questo. –

risposta

1

Tutti i file PNG possono essere trovati here Questi sono già tutti in formato PNG. Buona programmazione! (è disponibile anche un bel archivio ZIP Here) L'archivio ZIP contiene tutte le 17 icone di Excel.

Quando si utilizza il metodo GetImageMso, si ottiene un'interfaccia IPicture per l'oggetto. L'interfaccia IPicture accede all'icona adatta per il salvataggio in un file nel formato originale: un .ICO, .WMF o .BMP Il formato PNG non è supportato. I seguenti link spiegano perché questo non è direttamente possibile:

http://msdn.microsoft.com/en-us/library/aa434604.aspx (metodo msoGetImageMso) 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 (salvo quanto metodo di file)

Tuttavia, utilizzando un approccio più complesso produrrà ciò che si vuole :

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

4

ho avvolto una classe C# Utility per estrarre Office2007 galleria icone per i file .png, pur mantenendo la loro prope trasparenza rly. Il codice principale è tratto da un grande articolo scritto da Andrew Whitechapel ( http://blogs.msdn.com/b/andreww/archive/2007/10/10/preserving-the-alpha-channel-when-converting-images.aspx). L'ho integrato con la scheda dell'icona di esempio di Office 2007, nel caso in cui desideri estrarre tutte queste icone in una cartella di destinazione.

I passaggi sono:

1) Scaricare il foglio di calcolo Gallery Ufficio a http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=11675

2) Chiamata OfficeIcons.ExtractAllIcons() con la posizione del foglio di calcolo di esempio Office2007IconsGallery.xlsm, e la cartella di destinazione in cui si desidera le icone estratte.

{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

Sarebbe bello se si specificassero le 500 dipendenze su cui si basa, per non parlare del fatto che una volta trovato tutto il codice non viene compilato. –

+0

Riferimenti aggiunti, mi dispiace per quello. Tuttavia compila sicuramente - –

0

ho cercato la risposta di Ismail e lo ha fatto grande lavoro. Tuttavia mi ci è voluto un po 'per capire come farlo funzionare.Potrei condividere questo po 'di conoscenza:

La soluzione richiede ExcelDna da codeplex: link.

Come sto utilizzando Net 4.0 Non ho .zip supporto così ho estratto i file .xslm ad una struttura di directory piatta poi ho cambiato il codice per leggere direttamente i file. Poi in Excel che io chiamo il metodo di estensione ExcelDna come

=ExtractIcons("Office2207IconsGallery";"folder_where_to_store_icons") 

I utilizzando le istruzioni per la classe di utilità (per me):

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; 

Spero che questo aiuti .... Grazie Ismail!

7

Uso ImageMso abbastanza frequentemente nel mio sviluppo Excel. Avendo imbattuto in questo post, ho fatto un ulteriore passo avanti e ho messo insieme un pacchetto per cercare visivamente, estrarre e salvare icone da Microsoft Excel come un file o copiare e incollare (con trasparenza del canale alfa) su un'altra applicazione. Ho anche compilato un elenco di 8.899 nomi ImageMso distinti dalle varie fonti. Spero che altri possano trovare questo utile.

Microsoft Office Icons (ImageMSO) Gallery & Extraction

ImageMSO Gallery on Microsoft Excel 2013 running Windows 8

+0

Purtroppo, non funziona in Excel 2013. –

+0

Sono in grado di caricare il componente aggiuntivo in Excel 2013 su Windows 8. Ma non c'è un nuovo gruppo/comando nella scheda Inserisci. –

+0

Uso la versione a 32 bit di Excel 2013. Non è successo niente dopo aver caricato questo componente aggiuntivo. –

Problemi correlati