C# OpenXML SpreadsheetDocument SaveAs()提供文件正在使用错误
我正在尝试使用OpenXMLPowerTools v4.5.3.2、DocumentFormat.OpenXML v2.9.1动态生成Excel电子表格,该电子表格是从ASP.Net核心web应用程序调用的 我已验证是否能够生成电子表格 问题是我需要生成电子表格。。。并将其作为内存流返回(因此ASP.Net核心web控制器 HCExcelReport.cs:C# OpenXML SpreadsheetDocument SaveAs()提供文件正在使用错误,c#,excel,openxml,openxml-powertools,C#,Excel,Openxml,Openxml Powertools,我正在尝试使用OpenXMLPowerTools v4.5.3.2、DocumentFormat.OpenXML v2.9.1动态生成Excel电子表格,该电子表格是从ASP.Net核心web应用程序调用的 我已验证是否能够生成电子表格 问题是我需要生成电子表格。。。并将其作为内存流返回(因此ASP.Net核心web控制器 HCExcelReport.cs: class HCExcelReport { protected SpreadsheetDocument do
class HCExcelReport
{
protected SpreadsheetDocument doc;
protected MemorySpreadsheet ms;
protected string tmpFile = System.IO.Path.GetTempFileName();
public MemoryStream Generate(List<CandidateRecords> candidateRecords)
{
MemoryStream memoryStream = null;
using (OpenXmlMemoryStreamDocument streamDoc = OpenXmlMemoryStreamDocument.CreateSpreadsheetDocument())
{
doc = streamDoc.GetSpreadsheetDocument();
ms = new MemorySpreadsheet();
...
// Save to disk=
doc.SaveAs(tmpFile); // <-- Successfully writes .. but file remains open
doc.Dispose(); // <-- file *STILL* remains open
}
// Copy to memory stream
using (FileStream fileStream = new FileStream(tmpFile, FileMode.Open, FileAccess.Read)) // <-- Exception: the file is in use by another process!!!!
{
memoryStream = new MemoryStream();
fileStream.CopyTo(memoryStream);
memoryStream.Position = 0;
}
return memoryStream;
class报告
{
受保护的电子表格文件;
受保护的内存分发表ms;
受保护的字符串tmpFile=System.IO.Path.GetTempFileName();
公共内存流生成(列出候选记录)
{
MemoryStream MemoryStream=null;
使用(OpenXmlMemoryStreamDocument streamDoc=OpenXmlMemoryStreamDocument.CreateSpeedsheetDocument())
{
doc=streamDoc.GetSpreadsheetDocument();
ms=新的内存分发表();
...
//保存到磁盘=
SaveAs(tmpFile);//请看这篇文章
关于marcel请看这篇文章,在文件被另一个进程使用时复制它。marcelThank you,但我最终放弃了OpenXMLPowerTools。它不应该不必要地将文件“锁定”,我也不应该采取“极端措施”(如链接中引用的使用卷影复制服务(VSS))。您的解决方案(fs.CopyTo())没有那么激烈…但它仍然没有必要。无论如何,谢谢您。让我“接受”您的答复:)
// Copy to memory stream
using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
memoryStream = new MemoryStream();
fs.CopyTo(memoryStream );
fs.Close();
}
return memoryStream;