首页 文章

将XLSM转换为XLSX

提问于
浏览
2

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

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

2 回答

  • 1

    为此,您需要使用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是相同的 .

  • 8

    使用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(outStream, true)) {
            doc.DeletePartsRecursivelyOfType<VbaDataPart>();
            doc.DeletePartsRecursivelyOfType<VbaProjectPart>();
            doc.ChangeDocumentType(DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook);
        }
        File.WriteAllBytes("C:\\temp\\test.xlsx", outStream.ToArray());
    }
    

相关问题