1

System.IO.Packaging用来构建简单的 Excel 文件。我们的一位客户希望有一个自动运行宏来更新数据并重新计算工作表。

拆开现有的工作表,我可以看到您需要做的就是添加vbaProject.bin文件并更改 _rels 中的一些类型。所以我在一个文件中制作了宏,提取了vbaProject.bin.,然后将其复制到另一个文件中,然后,就有了宏。

我知道如何添加 XML 格式的包部件,例如工作表或工作簿本身,但我从未添加过二进制文件,我无法弄清楚。有没有人这样做过?

4

1 回答 1

1

好,我知道了。按照 TnTinMn 的建议:

  1. 打开一个新工作簿并输入您的宏。将扩展名更改为 zip,打开它,打开xl文件夹并将其复制vbaProject.bin 到容易找到的地方。

  2. 在您的 .Net 代码中,创建一个新部件并将其作为“xl/vbaProject.bin”添加到包中。vbaProject.bin从您上面提取的内容中逐字节复制 。它将在您添加字节时被压缩。

  3. 然后,您必须向指向新文件的工作簿添加关系。您可以在 中找到这些关系 xl/_rels/workbook.xml.rels

  4. 您还必须在文档的根目录添加一个内容类型条目,该条目进入[Content Types].xls. 当您使用 CreatePart 的 ContentType 参数时,这会自动发生

  5. 最后,将扩展名更改为 .xlsm 或 .xltm

我从代码中的许多地方提取以下内容,所以这是伪...

'the package...
Dim xlPackage As Package = Package.Open(WBStream, FileMode.Create)
'start with the workbook, we need the object before we physically insert it
Dim xlPartUri As URI = PackUriHelper.CreatePartUri(New Uri(GetAbsoluteTargetUri("/", "xl/workbook.xml"), UriKind.Relative)) 'the URI is relative to the outermost part of the package, /
Dim xlPart As PackagePart = xlPackage.CreatePart(xlPartUri, "application/vnd.ms-excel.sheet.macroEnabled.main+xml", CompressionOption.Normal)
'add an entry in the root _rels folder pointing to the workbook
xlPackage.CreateRelationship(xlPartUri, TargetMode.Internal, "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", "xlWorkbook") 'it turns out the ID can be anything unique
'now that we have the WB part, we can make our macro relative to it
Dim xlMacroUri As URI = PackUriHelper.CreatePartUri(New Uri(GetAbsoluteTargetUri("/xl/workbook.xml", "vbaProject.bin"), UriKind.Relative))
Dim xlMacroPart as PackagePart = xlPackage.CreatePart(xlPartUri, "application/vnd.ms-office.vbaProject", CompressionOption.Normal)
'time we link the vba to the workbook
xlParentPart.CreateRelationship(xlPartUri, TargetMode.Internal, "http://schemas.microsoft.com/office/2006/relationships/vbaProject", "rIdMacro") 'the ID on the macro can be anything as well
'copy over the data from the macro file
Using MacroStream As New FileStream("C:\yourdirectory\vbaProject.bin", FileMode.Open, FileAccess.Read)
    MacroStream.CopyTo(xlMacroPart.GetStream())
End Using
'
'now write data into the main workbook any way you like, likely using new Parts to add Sheets
于 2018-02-06T19:28:07.010 回答