Вопрос по xlsx, openxml, xlsm, c#, epplus – Конвертировать XLSM в XLSX

3

Я использую библиотеку EPPLUS для чтения данных из Excel и создания другого файла. К сожалению, он не поддерживает файл расширения .XLSM. Есть ли хороший способ конвертировать файлы .XLSM в файл .XLSX с целью чтения файла с помощью EPPLUS?

(было бы неплохо использовать EPPLUS для чтения, потому что весь мой код уже написан с его использованием :))

Чтобы уточнить, не спрашивая, могу ли я использовать EPPlus для чтения файла. Отвечая на вопрос, есть ли какие-либо методы / api 's / другие вещи, которые я могу использовать для преобразования файла xlsm в xlsx, чтобы я мог прочитать его с помощью EPPlus user1167650
Похоже, что это невозможно (пока):epplus.codeplex.com/discussions/282220 SeanC

Ваш Ответ

2   ответа
1

С использованиемOpen XML SDKкак в ответе амурры, но В дополнение к изменению типа документа должны быть удалены VbaDataPart и VbaProjectPart, в противном случае Excel покажет ошибку, если файл поврежден.

using (var inputStream = File.OpenRead("C:\\temp\\test.xlsm"))
using (var outStream = new MemoryStream()) {
    inputStream.CopyTo(outStream);
    using (var doc = SpreadsheetDocument.Open(outStream, true)) {
        doc.DeletePartsRecursivelyOfType<VbaDataPart>();
        doc.DeletePartsRecursivelyOfType<VbaProjectPart>();
        doc.ChangeDocumentType(DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook);
    }
    File.WriteAllBytes("C:\\temp\\test.xlsx", outStream.ToArray());
}
9

Для этого вам нужно будет использоватьOpen XML SDK 2.0, Ниже приведен фрагмент кода, который работал для меня, когда я его пробовал:

byte[] byteArray = File.ReadAllBytes("C:\\temp\\test.xlsm");
using (MemoryStream stream = new MemoryStream())
{
    stream.Write(byteArray, 0, (int)byteArray.Length);
    using (SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Open(stream, true))
    {
       // Change from template type to workbook type
       spreadsheetDoc.ChangeDocumentType(SpreadsheetDocumentType.Workbook);
    }
    File.WriteAllBytes("C:\\temp\\test.xlsx", stream.ToArray()); 
}

Что делает этот код, так это то, что он берет файл книги с поддержкой макросов и открывает его вSpreadsheetDocument объект. Тип этого объектаMacroEnabledWorkbook, но так как вы хотите это какWorkbook Вы называетеChangeDocumentType способ изменить его сMacroEnabledWorkbook кWorkbook, Это будет работать, так как базовый XML одинаков между файлами .xlsm и .xlsx.

Как мы можем конвертировать xls в xlsm, используя тот же материал, я получил ошибку "Файл с повреждением".
Просто для того, чтобы немного подробнее рассказать о людях, которые были потеряны, как я, нам нужно добавить оба:using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml;
извините, я знаю, что это старый пост, но я не могу заставить его работать. Я смог получить выходной файл (xlsx), но не смог открыть файл в Excel. & quot; файл не содержит макросов, но содержит содержимое с поддержкой макросов. & quot;
Кажется, это не работает для меня. Я получаю сообщение об ошибке, в котором говорится, что файл ... является файлом без макросов, но содержит содержимое с поддержкой макросов. & Quot; После конвертации данные не отображаются, только серый фон.
Я не думаю, что вы можете, так как xls - это офис старого формата, который использовался

Похожие вопросы