【发布时间】:2018-11-04 18:49:21
【问题描述】:
我有一个数据表 (dt) 和一个用于将数据导出到 excel 的按钮。
我正在使用 ClosedXML 完成工作。
但是,当我单击导出按钮时,我得到了第一个 saveFileDialog,然后单击 OK 后,我得到了第二个 saveFileDialog。在此之后,文件被正确导出。
所以,代码...
这是按钮导出操作的主要代码。我正在使用 saveFileDIalog 来允许用户选择保存文件目录。
private void exportarToolStripMenuItem_Click(object sender, EventArgs e)
{
if(saveFileDialog.ShowDialog() == DialogResult.OK)
{
FileInfo fileInfo = new FileInfo(saveFileDialog.FileName);
SaveToExcel(dt, fileInfo);
}
}
然后,方法
public static void SaveToExcel(System.Data.DataTable dt, FileInfo outputFile)
{
XLWorkbook wb = new XLWorkbook();
var worksheet = wb.Worksheets.Add(dt, "ResultTable");
using (MemoryStream memoryStream = GetStream(wb))
{
File.WriteAllBytes(outputFile.FullName, memoryStream.ToArray());
}
}
还有内存流
public static MemoryStream GetStream(XLWorkbook excelWorkbook)
{
using (MemoryStream stream = new MemoryStream())
{
excelWorkbook.SaveAs(stream, new SaveOptions { EvaluateFormulasBeforeSaving = false, GenerateCalculationChain = false, ValidatePackage = false, });
return stream;
}
}
请有人帮我看看为什么我得到 2 个 saveFileDialog 吗?
谢谢。
【问题讨论】:
-
你调试过这个吗?您有多确定该事件没有被触发两次?请注意,如果是这种情况,您将看不到两个文件,因为一次会覆盖其他文件。对话框是唯一明显多次触发效果的效果。
-
在向用户显示对话框之前读取文件名也很奇怪。用户是否无法指定文件名?因为如果他们能够做到,那么他们可能已经更改了对话框中的文件名。
-
在SaveToExcel函数中,为什么要调用两次GetStream?
-
另外..为什么要在退货时处理
MemoryStream?你应该在使用它的函数中处理它(就像你正在做的那样)。 -
标准原因是不小心订阅了两次 Click 事件。
标签: c# memorystream savefiledialog