将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()); }