我有一个用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文件时,出现一条消息,提示格式和扩展名不匹配,如果您选择打开无论如何都打开的选项,则如下图所示:
欢迎任何建议或评论。
更新:
关于ExcelExportEngine:
屏幕快照看起来像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
。您必须pay才能获得xls
支持。文件大小也小很多。