Как я могу удалить макросы из книги Excel? - PullRequest
2 голосов
/ 31 июля 2011

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

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

Ответы [ 3 ]

1 голос
/ 02 августа 2011

У меня не было времени проверить тысячи страниц в документации 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-архива может быть полезной для понимания структуры файла.

1 голос
/ 02 августа 2011

Одна вещь, которую вы можете попробовать, это изменить тип документа файла, который вы получаете, как объяснено в предыдущем ответе . Доступные опции для передачи в метод ChangeDocumentType находятся здесь .

Я не совсем уверен, что это приведет к удалению всего содержимого макроса, но его стоит попробовать, если вы не можете получить файл .xlsx от своего пользователя.

0 голосов
/ 02 ноября 2012

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

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