![](/img/trans.png)
[英]Azure Function : When Function AutoScale, function called multiple times
[英]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 和 SpreadsheetLight.Core 回滾到 .NET Framework 4.7.x 和 SpreadsheetLight。
上面問題中發布的代碼無需修改即可運行。
我相信這與 .NET Core 3.0 中的 System.IO.Packaging 中修復的 memory 泄漏有關。 這將需要進一步調查,並且可能需要對 SpreadsheetLight.Core 進行修復。
這是我解決它的方法。
下載了 SpreadsheetLight(3.5 版)的源代碼。 http://spreadsheetlight.com/downloads/SpreadsheetLight3.5.zip
創建了一個名為“SpreadsheetLight”的 .NET 核心庫項目,並向其中添加了必要的 NuGet 包(DocumentFormat.OpenXML 和 System.Drawing.Common)。 復制並粘貼該項目中所有下載的源代碼文件。
將項目“SpreadsheetLight”添加到我的解決方案中,並在現有項目之一中引用它。
在“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();
構建您的解決方案並進行測試。
聚會有點晚了,但遇到了這個問題。 我通過創建一個新的 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.