簡體   English   中英

錯誤消息“在更新模式下無法多次打開條目。” 在電子表格精簡版 SaveAs function

[英]Error message "entries cannot be opened multiple times in update mode." in Spreadsheet Lite SaveAs function

在執行dBWorksheet.SaveAs(xlsFileSpec)后,在下面的代碼中,我看到了一個異常:

“條目不能在更新模式下多次打開。”

        SLDocument dBWorksheet = new SLDocument();
        TimeSpan interval = new TimeSpan(0, 0, 2);

        dBWorksheet.SetCellValue(2, 1, "Hour");
        dBWorksheet.SetCellValue(3, 1, "Time");

        int Row = 3;

        // Create the hour and time of day columns.
        for(TimeSpan dBTime = new TimeSpan(0, 0, 0); dBTime.TotalHours < 24; dBTime = dBTime.Add(interval)) 
        {
            dBWorksheet.SetCellValue(Row, 1, dBTime.Hours);
            dBWorksheet.SetCellValue(Row, 2, dBTime.ToString());

            Row++;
        }

        // Save the new worksheet.
        dBWorksheet.SaveAs(xlsFileSpec);

從 .NET Core 3.0 回滾到 .NET Framework 4.7.x

這顯然不是最理想的解決方案。

但是,我發現的唯一解決方案是將應用程序從 .NET Core 3.0 和 SpreadsheetLight.Core 回滾到 .NET Framework 4.7.x 和 SpreadsheetLight。

上面問題中發布的代碼無需修改即可運行。

我相信這與 .NET Core 3.0 中的 System.IO.Packaging 中修復的 memory 泄漏有關。 這將需要進一步調查,並且可能需要對 SpreadsheetLight.Core 進行修復。

這是我解決它的方法。

  1. 下載了 SpreadsheetLight(3.5 版)的源代碼。 http://spreadsheetlight.com/downloads/SpreadsheetLight3.5.zip

  2. 創建了一個名為“SpreadsheetLight”的 .NET 核心庫項目,並向其中添加了必要的 NuGet 包(DocumentFormat.OpenXML 和 System.Drawing.Common)。 復制並粘貼該項目中所有下載的源代碼文件。

  3. 將項目“SpreadsheetLight”添加到我的解決方案中,並在現有項目之一中引用它。

  4. 在“SLDocument.cs”文件中,對“LoadDocumentProperties()”方法進行以下更改,使代碼如下所示:

    // XDocument xdoc = XDocument.Load(XmlReader.Create(xl.CoreFilePropertiesPart.GetStream()));

    Stream stream = xl.CoreFilePropertiesPart.GetStream(); XDocument xdoc = XDocument.Load(XmlReader.Create(stream));

    foreach (XElement xelem in xdoc.Descendants()) { // 代碼省略。 }

    stream.Close();

  5. 構建您的解決方案並進行測試。

聚會有點晚了,但遇到了這個問題。 我通過創建一個新的 SLDocument 並從舊的 SLDocument 中逐個單元格地復制來解決了這個問題。 可能無法 100% 工作,但到目前為止它已經涵蓋了我的報告。

代碼

using (var file = new SLDocument())
            {
                file.CopyFromTemplate(Path.Combine("ReportTemplates\\Tackningsbidrag_budget.xlsx"), maxCols: 20, maxRows: 10);

                // code

                using (var ms = new MemoryStream())
                {
                    file.SaveAs(ms);
                }
            }

擴展方法:

public static void CopyFromTemplate(this SLDocument file, string pathToOrgFile, int? maxCols = null, int? maxRows = null)
    {
        using (var orgFile = new SLDocument(pathToOrgFile))
        {
            var page = orgFile.GetPageSettings();
            file.SetPageSettings(page);

            foreach (var cell in orgFile.GetWorksheetMergeCells())
            {
                file.MergeWorksheetCells(cell.StartRowIndex, cell.StartColumnIndex, cell.EndRowIndex, cell.EndColumnIndex);
            }

            var stats = orgFile.GetWorksheetStatistics();
            var endCol = stats.EndColumnIndex;
            if (maxCols.HasValue && maxCols < endCol)
            {
                endCol = maxCols.Value;
            }

            var endRow = stats.EndRowIndex;
            if (maxRows.HasValue && maxRows < endRow)
            {
                endRow = maxRows.Value;
            }
            for (int col = stats.StartColumnIndex; col <= endCol; col++)
            {
                file.SetColumnStyle(col, orgFile.GetColumnStyle(col));
                file.SetColumnWidth(col, orgFile.GetColumnWidth(col));

            }

            for (int row = stats.StartRowIndex; row <= endRow; row++)
            {
                file.SetRowStyle(row, orgFile.GetRowStyle(row));
                file.SetRowHeight(row, orgFile.GetRowHeight(row));
            }


            for (int row = stats.StartRowIndex; row <= endRow; row++)
            {
                for (int col = stats.StartColumnIndex; col <= endCol; col++)
                {
                    var formula = orgFile.GetCellFormula(row, col);
                    var stringValue = orgFile.GetCellValueAsString(row, col);
                    file.SetCellValue(row, col, !string.IsNullOrWhiteSpace(formula) ? ("=" + formula) : stringValue);

                    file.SetCellStyle(row, col, orgFile.GetCellStyle(row, col));
                }
            }
        }
    }

當我打開(通過SpreadsheetLight)以“Excel 2007-365”格式保存(通過LibreOffice Calc)的.xlsx文件時出現此錯誤,然后我嘗試使用SaveAs function。 當我(通過 LibreOffice Calc)將 .xlsx 文件保存為“Office Open XML”時,我可以毫無問題地打開和另存為(通過 SpreadsheetLight)a.xlsx 文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM