用C#生成的Excel文件已损坏(ExcelExportEngine&IExportEngine)

时间:2019-10-08 12:31:48

标签: c# excel export-to-excel

我有一个用C#编写的应用程序,它允许从列表(列表<>)中生成一个excel文件。

生成excel文件的代码可以正常工作,但是今天仍然使用Windows 7的用户已经表示已经生成了excel文件,但是当打开该文件时不可读。

生成excel的代码如下:

IExportEngine engine = new ExcelExportEngine();
engine.AddData(productListExport);
MemoryStream memory = engine.Export();
FileStream fileStream;

SaveFileDialog saveFileDialog1 = new SaveFileDialog();
saveFileDialog1.Filter = "Excel files (*.xls or .xlsx)|.xls;*.xlsx";
saveFileDialog1.Title = "Export product list to Excel";
saveFileDialog1.ShowDialog();
                
if (saveFileDialog1.FileName != "")
{
 String path = Path.GetFullPath(saveFileDialog1.FileName);
 fileStream = new FileStream(path, FileMode.OpenOrCreate,  FileAccess.Write, FileShare.ReadWrite);
 memory.WriteTo(fileStream);
 fileStream.Close();
}
                

打开excel文件时,出现一条消息,提示格式和扩展名不匹配,如果您选择打开无论如何都打开的选项,则如下图所示:

enter image description here

欢迎任何建议或评论。

更新:

关于ExcelExportEngine:

https://github.com/vvenegasv/exportable

1 个答案:

答案 0 :(得分:2)

该屏幕截图看起来像一个xlsx文件的内容。 xlsx文件是一个包含XML文件的zip包。其中的各种xml路径都有非常明显的指示。 PK个字节也是,但我首先看到了docProps.xml

代码本身存在严重问题-在 要求格式之前,它会生成Excel文件内容。鉴于xls格式在13年前就已过时,唯一明智的默认设置是使用xlsx。如果将xlsx文件另存为xls,Excel将会抱怨。但就我而言,它能够加载文件。

该代码似乎使用了Exportable包。 Github存储库中的示例显示了如何指定格式。但是,除了MemoryStream Export()之外,该库还有一个Export(string path)可以写入文件。源代码显示Export(string)根据扩展名选择格式,如果无效则抛出。

这意味着代码可以简化为:

IExportEngine engine = new ExcelExportEngine();
engine.AddData(productListExport);

var saveFileDialog1 = new SaveFileDialog(){
    Filter = "Excel files (*.xls or .xlsx)|.xls;*.xlsx",
    Title = "Export product list to Excel"
}
saveFileDialog1.ShowDialog();

if (saveFileDialog1.FileName != "")
{
    var path = Path.GetFullPath(saveFileDialog1.FileName);
    engine.Export(path);
}

我也建议您也不要使用xls选项。不仅仅是13年前被替换了。格式没有很好的开始定义,因此库在生成与Excel相同的输出时总是会遇到问题。 Google表格或Office Online之类的服务只能与xlsx一起使用。您必须付款才能获得xls支持。文件大小也小很多。