Open XML SpreadsheetDocument SaveAs () дает ошибку при использовании файла - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь создать электронную таблицу Excel динамически, используя OpenXMLPowerTools v4.5.3.2, DocumentFormat.Open XML v2.9.1, вызываемую из ASP. Net Core веб-приложения.

Я подтвердил, что могу сгенерировать электронную таблицу ОК.

Проблема в том, что мне нужно сгенерировать электронную таблицу ... и вернуть ее как ПОТОК ПАМЯТИ (так что ASP. Net Основной веб-контроллер

HCExcelReport.cs:

   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;

Я пробовал бесчисленное количество вещей ...

... Но если я использую PowerTools, я не вижу альтернатив doc.SaveAs() ...

... И если я использую doc.SaveAs(), файл, похоже, остается «используемым» до тех пор, пока мое веб-приложение не закроется.

В: Есть предложения?

1 Ответ

1 голос
/ 21 июля 2020

Пожалуйста, посмотрите этот пост Как скопировать файл, пока он используется другим процессом

// 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;

касается Марселя

...