Основываясь на моих исследованиях, нет способа вставить данные части проекта в формат, которым вы можете манипулировать в C #. В формате OpenXML проект VBA по-прежнему хранится в двоичном формате. Однако копирование VbaProjectPart
из одного документа Excel в другой должно работать. В результате вам нужно будет заранее определить, что вы хотели сказать в части проекта.
Если вы согласны с этим, вы можете добавить следующий код в файл шаблона Excel в объекте Microsoft Excel «ThisWorkbook» вместе с соответствующим кодом макроса:
Private Sub Workbook_Open()
Run "Module1.SomeMacroName()"
End Sub
Чтобы скопировать объект VbaProjectPart
из одного файла в другой, вы должны использовать следующий код:
public static void InsertVbaPart()
{
using(SpreadsheetDocument ssDoc = SpreadsheetDocument.Open("file1.xlsm", false))
{
WorkbookPart wbPart = ssDoc.WorkbookPart;
MemoryStream ms;
CopyStream(ssDoc.WorkbookPart.VbaProjectPart.GetStream(), ms);
using(SpreadsheetDocument ssDoc2 = SpreadsheetDocument.Open("file2.xlsm", true))
{
Stream stream = ssDoc2.WorkbookPart.VbaProjectPart.GetStream();
ms.WriteTo(stream);
}
}
}
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[short.MaxValue + 1];
while (true)
{
int read = input.Read(buffer, 0, buffer.Length);
if (read <= 0)
return;
output.Write(buffer, 0, read);
}
}
Надеюсь, это поможет.