2016-04-01 7 views
3

У меня проблема с очень простой вещью. Удаление таблицы с использованием EPPlus. Проблема, с которой я сталкиваюсь, заключается в том, что с кодовой точки зрения (я отлаживал код, а в коллекции Worksheet.Tables, наложенный мной, который я назвал Delete on, исчез. Я продолжаю сохранять excel и когда я пытаюсь чтобы открыть его, Excel сообщает мне, что «они» обнаружили проблему с ним, и если я хочу, чтобы они восстанавливались как можно больше. Если я выберу «Да» (потому что «Нет» закрывает файл), таблица, которую я просто удаляю с помощью кода, возвращается снова.Невозможно удалить таблицу с помощью EPPlus

Если я устанавливаю ClearRange свойства в методе Delete() в 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, поделитесь ею. Было бы очень признательно.

+0

Очевидно, что * нет * базовая вещь - таблица - это название диапазона, * не * диапазон или его содержимое. Удаление может привести к повреждению любых функций, которые его используют, подключений, которые заполняют его и т. Д. Если бы это было основополагающим, работа над изменением самого XML. Вы пробовали это с помощью простого листа, то есть только с одной таблицей, без форматирования, соединений и т. Д.? Используется ли таблица в любых формулах, заполненных соединениями? –

+0

Это ошибка. Удаление таблицы изменяет часть рабочего листа, но * не * удаляет часть таблицы либо для таблиц «папка», либо из файла «Content_Types» внутри пакета. К сожалению, EPPlus не раскрывает фактический пакет OpenXML или его части, поэтому нет возможности вручную удалить сирот. –

+0

Спасибо за ответ. По основному я имел в виду операцию, открытую epplus (простой «.Delete()»). Я попытался изменить xml, как указано в вопросе. Ничего не произошло. Он просто игнорирует это. –

ответ

1

У меня проблема с методом 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, это не так просто. Вам нужно будет получить RelationshipID, который Epplus обозначил как внутренний. RID основан на пакете zip, чтобы получить либо вилку, либо модифицировать Epplus, чтобы открыть ее, либо вы откроете XLSX как ZipArchive и получите RID от этого - вид боли.

+0

Привет, ваше решение делает трюк, и только одно можно упомянуть. Таблица действительно уходит, но если я попытаюсь поместить новую таблицу в ее место, я получаю сообщение об ошибке, указывающее, что столбец сталкивается. В дополнение к этому необходим вызов функции удаления. Довольно странно, функция, похоже, работает вдвойне. –

+0

Это делает только половину работы. «Xlsx» на самом деле представляет собой пакет zip, который содержит много частей, которые хранятся в виде отдельных XML-файлов. Изменение рабочего листа XML только удаляет * reference * в части таблицы, он фактически не удаляет файл 'table1.xml' или записи индекса. –

+0

. Удаление будет легко с помощью OpenXML SDK, который, к сожалению, недоступен как Пакет Nuget. Вот почему EPPlus не использует его. Без него пространство имен System.IO.Packaging может управлять пакетами * частей *, но для обновления связанных файлов потребуется непосредственно изменить соответствующие файлы XML. –