将XLSM转换为XLSX

我正在使用EPPLUS库从Excel读取数据以创建另一个文件。 不幸的是,它不支持.XLSM扩展文件。 有没有一种很好的方法将.XLSM文件转换为.XLSX文件,以便用EPPLUS读取文件?

(使用EPPLUS进行阅读会很好,因为我的所有代码都是用它编写的:))

为此,您需要使用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 。 这将起作用,因为.xlsm和.xlsx文件之间的基础XML是相同的。

使用Open XML SDK ,就像在amurra的答案中一样,但除了更改doc类型外,还应删除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(inputStream, true)) { doc.DeletePartsRecursivelyOfType(); doc.DeletePartsRecursivelyOfType(); doc.ChangeDocumentType(DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook); } File.WriteAllBytes("C:\\temp\\test.xlsx", outStream.ToArray()); }