Удаление vbaProject.bin в XML недостаточно для сохранения в формате xlsx - PullRequest
0 голосов
/ 10 июля 2019

После экспорта данных в книгу Excel с макросами (xlsm) я запускаю макрос, а затем удаляю макрос, чтобы иметь возможность сохранить книгу как xlsx. Для удаления макросов я открываю xlsm в виде zip-архива (через класс C # ZipFile), удаляю запись «xl / vbaProject.bin» и удаляю отношение в «xl / _rels / workbook.xml.rels». Затем я переименовываю файл из xlsm в xlsx. Пока это работает нормально, но когда я открываю файл xlsx в Excel, я получаю «Excel не может открыть файл, потому что формат файла или расширение файла недопустимо. Убедитесь, что файл не был поврежден и что расширение файла соответствует формату файла », так что, кажется, чего-то не хватает, чтобы полностью удалить код VBA в книге. Может ли кто-нибудь помочь мне здесь?

const string vbaProjectEntryName = "xl/vbaProject.bin"; // Contains the VBA code
const string relationsEntryName = "xl/_rels/workbook.xml.rels"; // Relation/Link to the vba project

using (var zip = ZipFile.Open(fileName, ZipArchiveMode.Update))
{
    var entry = zip.GetEntry(vbaProjectEntryName);
    if (entry != null)
    {
        entry.Delete();

        entry = zip.GetEntry(relationsEntryName);
        if (entry != null)
        {
            var contents = string.Empty;
            using (var streamReader = new StreamReader(entry.Open()))
            {
                contents = streamReader.ReadToEnd();
            }

            var relationText = "<Relationship Id=\"rId6\" Type=\"http://schemas.microsoft.com/office/2006/relationships/vbaProject\" Target=\"vbaProject.bin\"/>";
            contents = contents.Replace(relationText, string.Empty);
            entry.Delete();
            entry = zip.CreateEntry(relationsEntryName);

            using (var streamWriter = new StreamWriter(entry.Open()))
            {
                streamWriter.Write(contents);
            }
        }
    }
}
...