我有以下代码打开Excel模板文件并将其另存为.xlsx文件,当我尝试打开新文件时,我收到以下错误。请帮忙解决这个问题。
Excel无法打开文件“sa123.xlsx”,因为文件格式或扩展名无效。验证文件是否已损坏,文件扩展名是否与文件格式匹配。
string templateName = "C:\\temp\\sa123.xltx";
byte[] docAsArray = File.ReadAllBytes(templateName);
using (MemoryStream stream = new MemoryStream())
{
stream.Write(docAsArray, 0, docAsArray.Length); // THIS performs doc copy
File.WriteAllBytes("C:\\temp\\sa123.xlsx", stream.ToArray());
}
答案 0 :(得分:7)
为此,您需要使用Open XML SDK 2.0。下面是我尝试时为我工作的一段代码:
byte[] byteArray = File.ReadAllBytes("C:\\temp\\sa123.xltx");
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\\sa123.xlsx", stream.ToArray());
}
此代码的作用是将您的模板文件打开并将其打开到SpreadsheetDocument
对象中。此对象的类型为Template
,但由于您希望将其作为Workbook
,因此请调用ChangeDocumentType
方法将其从Template
更改为Workbook
。这将起作用,因为.xltx和.xlsx文件之间的基础XML是相同的,并且它只是导致您出现问题的类型。
答案 1 :(得分:1)
Excel会看到.xlsx扩展名并尝试将其作为工作表文件打开。但事实并非如此。这是一个模板文件。在Excel中打开模板并将其另存为.xlsx文件时,会将其转换为工作表格式。您正在做的与更改文件名中的扩展名相同。在Windows资源管理器中尝试它,您将得到相同的结果。
我相信你应该能够使用Excel Object Model来完成你想要的任务。我没有用过这个。