我使用的EPPLUS库来读取Excel中的数据创建另一个文件。 遗憾的是它不支持扩展.XLSM文件。 是否有.XLSM文件转换为.xlsx文件的读取与EPPLUS该文件的目的的好办法?
(使用EPPLUS阅读将是很好的,因为我所有的代码是用吧:)已经写好)
我使用的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
。 这将工作,因为底层的XML是一种.XLSM和.xlsx文件之间的相同。
使用开放XML SDK ,就像amurra的答案,但除了改变文档类型,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());
}