EPPlus

2016-04-01 15 views
3

kullanarak tablo silinemiyor Çok basit bir sorunla karşılaşıyorum. EPPlus kullanarak bir tabloyu silme. Karşılaştığım sorun şu ki, koddan hata ayıkladı (Worksheet.Tables koleksiyonunda), Sil (delete) olarak adlandırdığım tablonun gitmiş halidir. Excel'i kaydetmeye devam ediyorum ve denediğimde Excel bunu açmak için "onlar" ile bir sorun bulduğunu ve eğer mümkün olduğu kadar iyileşmek istiyorlarsa bunu söyler. Evet'i seçersem (Dosyayı kapatır çünkü) kodu sildiğim tablo geri döndü tekrar.EPPlus

Ben true için Delete() yöntemde ClearRange özelliği ayarlamak, tablo, hala, ama bu sefer başlık sütunları gitti ve bunun yerine Excel bazı varsayılan adlar (Sütun1'de, Sütun2 ile masamı yeniden oluşturur vb. orijinal tablonun sütun sayısına bağlı olarak)

Tablonun TableXml özelliğini değiştirmeye çalıştım ve hala çalışmıyor. Bunun dışında, sadece 3 saat boyunca interneti okudum ve problemime hiç bir çözüm getiremedim. Herkes merak eğer

Yani, bu kodudur:

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

Gördüğünüz gibi, tür başarısız bir çok temel çalışma. EPPlus ile bir tablodaki bir tabloyu kaldırmak için bir çözüm bilen varsa, lütfen paylaşın. Çok memnun olurum.

+0

Açıkçası * temel bir şey değil - tablo bir aralık için bir isim, * aralık veya içeriği. Bunu kaldırmak, onu kullanan tüm işlevleri, onu dolduran bağlantıları bozabilir. Basitse, XML'in kendisini değiştirmesi işe yarar. Bunu basit bir sayfa ile, yani sadece bir tablo, biçimlendirme, bağlantı vb. Ile denediniz mi? Tablo, herhangi bir formülde, bağlantılarla doldurulmuş mu? –

+0

Bu bir hata. Bir tabloyu silmek, çalışma sayfası kısmını değiştirir, ancak * tablodaki tabloyu "klasör" veya paketin içindeki "Content_Types" dosyası için * kaldırmaz. Ne yazık ki, EPPlus gerçek OpenXML paketini veya parçalarını göstermez, böylece yetimleri el ile kaldırmanın bir yolu yoktur. –

+0

Cevabınız için teşekkürler. Temel olarak epplus (basit bir '.Delete()') tarafından ifşa edilen operasyona atıfta bulundum. Soruda belirtildiği gibi xml değiştirmeye çalıştım. Hiçbir şey olmuyor. Sadece onu yok sayar. –

cevap

1

Delete yönteminde de sorun yaşıyorum. Yarim zaman referans ettigimde bile derleyemiyorum. Garip.

Tablonun referansını xml ile silerseniz. o ws sadece tablodur ya da bunu yapmak oldukça kolaydır kesin emri biliyorsanız:

[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(); 
    } 
} 

Yani bu gider:

enter image description here

Buna:

enter image description here

Ancak, Table.Name ile yapmanız gerekmiyorsa, o kadar kolay değil. Epplus'un dahili olarak işaretlenmiş olduğu RelationshipID'u almanız gerekir. RID, zip paketini temel alarak, Epplus'u ortaya çıkarmak için çatal ya da modifiye etmek ya da XLSX'i bir ZipArchive olarak açmak ve RID'yi bu tür bir acıdan almak.

+0

Merhaba, çözümünüz hile yapar, sadece bir şey söyler. Tablo gerçekten yok oluyor, ama eğer yerine yeni bir masa koymaya çalışırsam, tablonun çarpıştığını gösteren bir hata alıyorum. Buna ek olarak, silme işlevine bir çağrı gereklidir. Oldukça tuhaf, fonksiyon yarı iş gibi görünüyor. –

+0

Bu sadece işin yarısını yapıyor. Bir 'xlsx' aslında ayrı XML dosyaları olarak depolanan birçok parça içeren bir zip paketidir. Çalışma sayfasının XML'sini değiştirmek yalnızca * referansı * tablo kısmına kaldırır, aslında 'table1.xml' dosyasını ya da indeks girişlerini kaldırmaz. –

+0

Silinmesi maalesef OpenXML SDK kullanılarak kolayca kullanılabilir. Nuget paketi. Bu yüzden EPPlus bunu kullanmıyor. Bu olmadan System.IO.Packaging ad alanı paket * parçalarını * yönetebilir, ancak ilgili dosyaları güncellemek, ilgili XML dosyalarını doğrudan değiştirmeyi gerektirir –

İlgili konular