无法使用EPPlus删除表格

我有一个非常基本的问题。 使用EPPlus删除表。 我面对的问题是,从代码的angular度来看(我已经debugging了代码,在Worksheet.Tables集合中,我调用Delete的Worksheet.Tables已经不存在了,我继续保存excel,当我尝试打开它,Excel告诉我,他们发现了一个问题,如果我想让他们尽可能地恢复,如果我select是(因为否closures文件),我刚刚通过代码删除的表是再次回来。

如果将Delete()方法中的ClearRange属性设置为true ,表格仍然在电子表格中,但是这次标题列已经消失,而Excel将使用一些默认名称(Column1,Column2等等)重新创build我的表格原始表格的列数)。

我试图操纵表的TableXml属性,它仍然无法正常工作。 除此之外,我刚刚阅读了大约3小时的互联网,没有明显的解决scheme,我的问题。

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

 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从电子表格中删除表格的解决scheme,请分享。 将不胜感激。

我也有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(); } } 

所以它从这个:

在这里输入图像描述

对此:

在这里输入图像描述

但是,如果你需要通过Table.Name来做到这一点并不那么容易。 你必须得到Epplus标记为内部的RelationshipID 。 RID是基于压缩包的,所以为了让你分叉和修改Epplus来暴露它,或者你打开XLSX作为一个ZipArchive并从中获取RID – 这有点痛苦。