繁体   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