Utilizzando OpenXML SDK 2.0:
- Crea il codice di macro e salvarlo in formato .xlsm, dicono snorehorse.xlsm.
- Aprire snorehorse.xlsm nel toolkit di produttività OpenXML e creare un codice Reflect nella radice dell'albero.
- Trova il codice binario della macro. È in un formato stringa e sembra un personaggio casuale.
- Nel proprio IDE, aggiungere un riferimento a OpenXML SDK e creare o aprire a livello di codice il file excel in cui si desidera iniettare il codice macro.
- Copia la stringa di macro trovata nel passaggio n. 3 nel codice.
- Aggiungere una nuova parte vba alla destinazione.
- Inserire i dati della stringa nella nuova parte vba.
- Salva ed esegui e sii contento di aver bypassato il Trust Center.
codice Esempio:
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
private string partData = "...";
public void vbaInjector{
[code to create/open spreadsheet using OpenXML omitted]
VbaProjectPart vbaProjectPart1 = snoreSpreadsheetDoc.WorkbookPart.AddNewPart<VbaProjectPart>("rId8");
System.IO.Stream data = GetBinaryDataStream(partData);
vbaProjectPart1.FeedData(data);
data.Close();
[code to close spreadsheet and cleanup omitted]
}
private System.IO.Stream GetBinaryDataStream(string base64String)
{
return new System.IO.MemoryStream(System.Convert.FromBase64String(base64String));
}
ho scelto di aggiungere il dll OpenXML SDK nella costruzione locale del progetto in modo gli utenti finali non dovranno installare l'SDK stessi.
Penso che questo possa essere fatto a un livello inferiore, lavorando con l'XML, senza usare l'SDK OpenXML, ma non ho tentato di imparare come farlo. Se qualcuno può pubblicare il codice, accetterò la risposta sul mio.
Inoltre, se si avesse un modo programmatico per convertire lo script VBA, in un file di risorse incorporato, in una stringa binaria del formato che Excel si aspetta, si potrebbe evitare di copiare e incollare una nuova stringa di dati binari ogni volta volevi cambiare il codice macro. Questa sarebbe una risposta superiore alla mia.
Grazie.
Funziona ancora? Lo proverò sicuramente adesso. –
Dopo 1 ora non riesco ancora a inserire alcun codice nel mio progetto senza corromperlo. Funziona solo se eseguo TUTTO il codice riflesso da OpenXML Toolkit. –
Girato nel buio ... forse "rId8" è già usato? Che ne dici di cambiarlo in qualcosa come "rId888"? – Snorex