无法使用 EPPlus 删除 table

Unable to delete table using EPPlus

我遇到了一个非常基本的问题。使用 EPPlus 删除 table。 我面临的问题是,从代码的角度来看(我已经调试了代码,在 Worksheet.Tables collection 中,我调用 Delete 的 tabled 是走了。我继续保存 excel,当我尝试打开它时,Excel 告诉我 "they" 发现了它的问题,如果我希望它们尽可能恢复. 如果我 select Yes (因为 No 关闭文件) 我刚刚通过代码删除的 table 又回来了.

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

我已经尝试操纵 table 的 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 从电子表格中删除 table 的解决方案,请分享。将不胜感激。

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

如果通过 xml 删除对 table 的引用会怎样?如果它是 ws 中唯一的 table 或者你知道确切的顺序,那么很容易做到:

[TestMethod]
public void Table_Delete_Test()
{
    //
    //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();
    }
}

所以它是这样的:

对此:

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