gpt4 book ai didi

c# - 无法使用 EPPlus 删除表

转载 作者:行者123 更新时间:2023-11-30 17:38:41 26 4
gpt4 key购买 nike

我遇到了一个非常基本的问题。使用 EPPlus 删除表。我面临的问题是,从代码的角度来看(我已经调试了代码,并且在 Worksheet.Tables 集合中,我调用 Delete 的表格已经消失了。我继续保存 excel,当我尝试打开它时,Excel 告诉我“他们”发现了它的问题,如果我希望他们尽可能多地恢复。如果我选​​择是(因为否关闭文件)表我刚刚通过代码删除的内容又回来了。

如果我将 Delete() 方法中的 ClearRange 属性设置为 true,表格仍在电子表格中,但这次标题列消失了,Excel 使用一些默认名称(Column1、Column2 等,具体取决于原始表的列数)重新创建我的表。

我已经尝试操作表的 TableXml 属性,但它仍然无法正常工作。除此之外,我刚刚在互联网上阅读了大约 3 个小时,但没有找到解决我的问题的明显方法。

所以,如果有人想知道,代码是:

using (var package = new ExcelPackage(fileToWriteTo, templateToStartWith))
{
var workbook = package.Workbook;
var worksheet = workbook.Worksheets[WORKSHEET_NAME];
worksheet.Tables.Delete("dynamicTable", true);
//worksheet.Tables.Delete("dynamicTable");
package.Save();
}

如您所见,一个非常基本的操作有点失败。如果有人知道使用 EPPlus 从电子表格中删除表格的解决方案,请分享。将不胜感激。

最佳答案

我在使用 Delete 方法时也遇到了问题。引用一半时我什至无法编译。奇怪。

如果通过xml删除对表的引用怎么办。如果它是 ws 中唯一的表,或者您知道确切的顺序,则很容易做到:

[TestMethod]
public void Table_Delete_Test()
{
//http://stackoverflow.com/questions/36359047/unable-to-delete-table-using-epplus
//Throw in some data
var datatable = new DataTable("tblData");
datatable.Columns.AddRange(new[]
{
new DataColumn("Col1", typeof (int)), new DataColumn("Col2", typeof (int)), new DataColumn("Col3", typeof (object))
});

for (var i = 0; i < 10; i++)
{
var row = datatable.NewRow();
row[0] = i; row[1] = i * 10; row[2] = Path.GetRandomFileName();
datatable.Rows.Add(row);
}

var fi = new FileInfo(@"c:\temp\Table_Delete_Test.xlsx");
if (fi.Exists)
fi.Delete();

//Create a worksheet with tables to later open and look for tables (note that EPPlus does not create the table objects until save)
using (var pck = new ExcelPackage(fi))
{
var workbook = pck.Workbook;

var worksheet = workbook.Worksheets.Add("source");
worksheet.Cells["A1"].LoadFromDataTable(datatable, true);
worksheet.Cells["A12"].LoadFromDataTable(datatable, true);

var table1 = worksheet.Tables.Add(worksheet.Cells["A1:C11"], "TableTest1");
var table2 = worksheet.Tables.Add(worksheet.Cells["A12:C22"], "TableTest2");

pck.Save();
}

//Open the test workbook and delete the second table
using (var pck = new ExcelPackage(fi))
{
var workbook = pck.Workbook;
var worksheet = workbook.Worksheets.First();

var wsXml = worksheet.WorksheetXml;
var nsm = new XmlNamespaceManager(wsXml.NameTable);
var nsuri = wsXml.DocumentElement.NamespaceURI;
nsm.AddNamespace("m", nsuri);

//Remove reference to the second table which should be last
var tablePartsNode = wsXml.SelectSingleNode("m:worksheet/m:tableParts", nsm);
tablePartsNode.RemoveChild(tablePartsNode.LastChild);

pck.Save();
}
}

所以它是这样的:

enter image description here

为此:

enter image description here

但是如果你需要通过 Table.Name 来做,那就不是那么容易了。您必须获取 Epplus 标记为内部的 RelationshipID。 RID 基于 zip 包,因此您要么 fork 并修改 Epplus 以公开它,要么将 XLSX 作为 ZipArchive 打开并从中获取 RID - 有点痛苦。

关于c# - 无法使用 EPPlus 删除表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36359047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com