.net core 错误消息";无法在更新模式下多次打开条目。”;在电子表格Lite中保存为函数

.net core 错误消息";无法在更新模式下多次打开条目。”;在电子表格Lite中保存为函数,.net-core,spreadsheetlight,.net Core,Spreadsheetlight,在执行dbsheet.SaveAs(xlsFileSpec)时,在下面的代码中,我看到一个异常: “在更新模式下无法多次打开条目。” SLDocument dBWorksheet=new SLDocument(); TimeSpan间隔=新的TimeSpan(0,0,2); dBWorksheet.SetCellValue(2,1,“小时”); dBWorksheet.SetCellValue(3,1,“时间”); int行=3; //创建小时和时间列。 for(TimeSpan dBTime=

在执行
dbsheet.SaveAs(xlsFileSpec)
时,在下面的代码中,我看到一个异常:

“在更新模式下无法多次打开条目。”

SLDocument dBWorksheet=new SLDocument();
TimeSpan间隔=新的TimeSpan(0,0,2);
dBWorksheet.SetCellValue(2,1,“小时”);
dBWorksheet.SetCellValue(3,1,“时间”);
int行=3;
//创建小时和时间列。
for(TimeSpan dBTime=newtimespan(0,0,0);dBTime.TotalHours<24;dBTime=dBTime.Add(interval))
{
dBWorksheet.SetCellValue(行,1,dBTime.Hours);
SetCellValue(第2行,dBTime.ToString());
行++;
}
//保存新工作表。
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中修复的内存泄漏有关。这将需要进一步的调查,可能还需要对SpreadsheetLight.Core进行修复。

派对迟到了一点,但突然遇到了这个问题。 我通过创建一个新的SLDocument并从旧的SLDocument中逐单元复制来解决这个问题。可能无法100%工作,但到目前为止,它已经涵盖了我的报告

代码

扩展方法:

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));
                }
            }
        }
    }
public static void CopyFromTemplate(此SLDocument文件,字符串路径ToOrgFile,int?maxCols=null,int?maxRows=null)
{
使用(var orgFile=new SLDocument(pathToOrgFile))
{
var page=orgFile.GetPageSettings();
文件.SetPageSettings(第页);
foreach(orgFile.GetWorksheetMergeCells()中的var单元格)
{
文件.MergeWorksheetCells(cell.StartRowIndex、cell.StartColumnIndex、cell.EndRowIndex、cell.EndColumnIndex);
}
var stats=orgFile.GetWorksheetStatistics();
var endCol=stats.EndColumnIndex;
if(maxCols.HasValue&&maxCols对于(int col=stats.StartColumnIndex;col这似乎是真的。我尝试了不同类型的流,并将其保存到一个文件名。所有这些都会在.SpreadSheetLight.Core中产生相同的错误消息。但是,如果您真的想移动到.NET Core,EPPlus工作得很好。用法类似,也同样简单。不过,有一个真正的LGPL版本t最新版本要求付费许可用于商业用途。用于跟踪
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));
                }
            }
        }
    }