Как удалить макросы из книги Excel?

В настоящее время я вынужден использовать Office Live / Skydrive (каково бы ни было собственное имя) для редактирования книг Excel. Skydrive не позволяет мне загружать книгу, содержащую макросы, и мне не нужны макросы, поэтому я хотел бы написать небольшое приложение для очистки на C #, которое просто удаляет все макросы. Как это сделать, используя документы Excel 2007 и более поздних версий (.xlsm)?

РЕДАКТИРОВАТЬ: В принципе, я хотел бы открыть документ xlsm и сохранить его как документ xlsx без необходимости установки Excel, то есть через OpenXML SDK или что-то в этом роде.


person ProfK    schedule 31.07.2011    source источник
comment
В документах .xlsx нет макросов   -  person David Heffernan    schedule 31.07.2011
comment
@ Дэвид, да, спасибо. В последнее время у меня мало экспозиции xlsx / m, у меня нет офиса. Может просто пользователю будет проще прислать мне xlsx doc, тогда в нем уже не будет макросов.   -  person ProfK    schedule 31.07.2011


Ответы (3)


У меня не было времени проверить тысячи страниц документации OpenXML SDK, но вы могли бы попробовать что-то вроде этого:

Файл .xlsm - это ZIP-архив, содержащий в основном файлы XML. Вам необходимо удалить ссылки на макросы из файла workbook.xml.rels в папке xl\_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-архив, все же может быть полезным для понимания структуры файла.

person Martin Liversage    schedule 02.08.2011

С openXML SDK 2.0 у меня сработало:

SpreadsheetDocument document = SpreadsheetDocument.Open("excelFile.xlsm", true);
document.WorkbookPart.DeletePart(document.WorkbookPart.VbaProjectPart);
document.Dispose();
person Dani Duran    schedule 02.11.2012