2011-07-31 38 views
2

我目前被迫使用Office Live/Skydrive(无论是否有正确的名称)来编辑Excel工作簿。 Skydrive不会让我上传包含宏的工作簿,而且我不需要这些宏,所以我想在C#中编写一个简洁的应用程序,它只是删除所有的宏。我如何使用Excel 2007及更高版本(.xlsm)文件解决此问题?如何从Excel工作簿中去除宏?

编辑:基本上,我想打开一个xlsm文档并将其保存为一个xlsx文档,而不需要安装Excel,即通过OpenXML SDK或其他东西。

+0

的.xlsx文件没有宏 –

+0

@大卫,是啊,谢谢。我最近没有太多的xlsx/m曝光,没有办公室。也许它会更容易为用户发送一个xlsx文档,然后它将不会有宏。 – ProfK

回答

1

我没有时间来检查的OpenXML的SDK文档中的网页成千上万,但你可以尝试这样的:

.xlsm文件为主要包含XML文件的ZIP压缩文件。您需要从xl\_rels文件夹中的workbook.xml.rels文件中删除对宏的引用。以下是一个示例:

<?xml version="1.0" encoding="UTF-8" standalone="true"?> 
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"> 
    <Relationship Target="worksheets/sheet3.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Id="rId3"/> 
    <Relationship Target="worksheets/sheet2.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Id="rId2"/> 
    <Relationship Target="worksheets/sheet1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet" Id="rId1"/> 
    <Relationship Target="vbaProject.bin" Type="http://schemas.microsoft.com/office/2006/relationships/vbaProject" Id="rId6"/> 
    <Relationship Target="styles.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Id="rId5"/> 
    <Relationship Target="theme/theme1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Id="rId4"/> 
</Relationships> 

这是您需要删除的类型http://schemas.microsoft.com/office/2006/relationships/vbaProject的关系。关系中引用的文件也应从ZIP存档中删除。在这种情况下,该文件被命名为vbaProject.bin,并放置在xl文件夹中。

使用OpenXML SDK,您应该能够浏览Excel文件的逻辑结构并执行这种清理,而无需了解ZIP归档的确切结构。但是,检查Excel文件就好像它是一个ZIP归档文件,仍然可以帮助您理解文件的结构。

1

您可以尝试的一件事是更改您正在接收的文件的文档类型,如前面的answer中所述。发现ChangeDocumentType方法的可用选项为here

我不完全确定这将删除所有的宏内容,但如果您无法从用户那里获得.xlsx文件,那么它值得一试。

+0

在WordDocuments中,我可以确认它不会删除宏。 Microsoft Word无法打开文件 –

0

随着openXML SDK 2.0,这个工作对我来说:

SpreadsheetDocument document = SpreadsheetDocument.Open("excelFile.xlsm", true); 
document.WorkbookPart.DeletePart(document.WorkbookPart.VbaProjectPart); 
document.Dispose(); 
相关问题