2015-10-12 58 views
14

Bazı verileri OpenXML kullanarak bir Excel dosyasına dışa aktaracağınız bir uygulama geliştiriyorum. Otomatik filtre dışında her şey iyi çalışıyor. Buradaki fikir, verilerin ana gövdesine bir otomatik filtrenin eklenmesidir, böylece kullanıcı otomatik olarak verileri filtrelemek ve sıralamak için kontrollere sahiptir. kodda Yani, böyle bir şey yapmak:Otomatik filtre ve sıralama eklemek Excel'in çökmesine neden oluyor

var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference) }; 
worksheet.AppendChild(filter); 

ihraç XLSX yılında böyle bir şey görünür:

<x:autoFilter ref="A4:L33" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" /> 

Ve sheetData ve mergeCells arasındaki çalışma sayfasına eklenir.

Bu filtreyi Excel'de açabilirim ve iyi çalışıyor. Bir sütunu sıralamaya çalıştığınızda bekliyorsanız, sütun sıralar ve sonra Excel çöker. Dosyayı kaydetme ve yeniden yükleme (Excel'in her şeyi temizlemeye zorlayan) sorunu çözmez. Ancak, önce bir filtre uygularsanız (bir sütunu > 10'a göre filtreleyin, sonra bu filtreyi kaldırın, artık çökmeden sıralayabilirsiniz. Bir filtre uyguladıktan ve çıkardıktan sonra bir dosya kaydettim ve şimdi bu dosya iyi görünüyor, ancak "Onarılan" dosyanın XML'si, bariz bir fark görmüyorum.

Sorunun sebebi ne olabilir? Herhangi bir şey var mı? çalışma eklemeden

Not:? Biz Excel 2010 kullanıyorsunuz (sürüm 14.0.7153.5000) İşte

bir örnek file var (indirme çift tıklayarak buolarak indirirsiniz. Excel'de açmak için .xlsx olarak yeniden adlandırın. Düzenlemeyi etkinleştir, sütunlardan birini seçin ve sıralamaya çalışın).

Düzenle: Bununla biraz daha fazla oynayın. Dosyayı Excel'de yeniden kaydederseniz, hala bozuk. Ancak, önce bir filtre uyguladığınızda (ve sonra temizledikten sonra) ve Excel'de yeniden kaydederseniz, bir çalışma dosyası alırsınız. eğer

<x:definedNames> 
    <x:definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'Sheet 1'!$A$1:$E$11</x:definedName> 
    </x:definedNames> 

emin değil: daha yakın iki dosyaları (hala kırık Yeniden kaydedilen dosya ve şimdi çalışıyor dosyası) baktığımızda, ben filtre uygulanmadan (ve temizlenmiş) sonra bu ekstra bit çalışma kitabına eklenen fark yok ...

+0

@mason: OpenXML, her zaman geçersiz Excel dosyaları yapmanıza olanak tanır. Geçerli bir Excel dosyası için kurallar geçerli bir OpenXML dosyası için kurallardan daha katı (ve tamamen belgelenmemiş) olduğundan (örneğin, standarttaki hiçbir şey çalışma sayfasının altındaki çocukların sırasını belirler), ancak Excel belirli çocukların nerede olduğu konusunda çok titizdir. Görünmelidir). Genellikle dosyayı ilk açtığınızda Excel (çok yardımcı olmayan bir hata mesajıyla) şikayet eder. Ancak bu dosya iyi açılır ve sorun bir sütun sıralamaya çalışırsanız açılır. –

+0

Öğelerinizin sırası doğru görünüyor (sipariş belgeleri için [autoFilter answer here] bölümüne bakın (http://stackoverflow.com/a/25410242/3791802). Üretkenlik aracı tarafından bildirilen tek sorun, bir 'Yazı' yanlış bir 'Renk 'elemanlarından biridir - [başka bir cevap] var (http://stackoverflow.com/questions/29989234/change-sheet-tab-color -of-excel-file-using-open-xml/29991215 # 29991215) '' Color's hakkında bilgi var ama bu konuda yardımcı olacağından kuşkuluyum. Ben ... – petelids

+0

@petelids bir göz atın ve bir şey anlamaya karar veririz: Teşekkür sırası gerçekte belirtilen yere kafaları için bir göz ve teşekkür yukarı çekmek için. Orada olduğunu fark etmemiştim ve beni çok üzdü. –

cevap

4

Tamam bir şey ya da olmamak, nedenle benim düzenleme önerildiği üzere burada sihirli formül DefinedNames bölümünü eklemektir görünüyor olabilir:

<x:definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1">'Sheet 1'!$A$1:$E$11</x:definedName> 

Görünüşe _xlmn._FilterDatabase için AutoFilter için gereklidir iş (en azından sıralama için). Eğer süzülürken orada olmasa, sanırım yaratılır, ama sıraladığınızda orada değilse, Excel'i patlatır. .

Filter & İleri:

Yani SHEETNAME ve bunu doldurmak için hücre başvurusu ihtiyaç

Açık XML standardına içinden bakıldığında, 18.2.5 definedName bölümünde, bunu gördüm Filtre

_xlnm Ölçüt: bu tanımlı ad, bir veri aralığına gelişmiş bir filtre uygulamak için kullanılacak kriterlerini içeren bir aralığı belirtir.

_xlnm ._FilterDatabase: Aşağıdaki

bir biri olabilir. Bu tanımlı ad, gelişmiş bir filtrenin uygulandığı bir aralığı belirtir. Bu, filtre uygulanmamış kaynak veri aralığını temsil eder.

b. Bu tanımlı ad, bir Otomatik Filtre'nin uygulandığı bir aralığı belirtir.

Yani bir filtre olan her sayfa için bir _xlnm._FilterDatabase eklemeniz gerekir anlaşılmaktadır (tek yaprağa birden fazla filtre için hiçbir yolu yoktur görünür). Ad, filtrelerle kaç sayfanız olduğuna bakılmaksızın _xlmn_FilterDatabase ile aynıdır, çünkü sadece isim ve localSheetId kombinasyonunun benzersiz olması gerekir. o Excel'de bir hata etrafında yarıyor gibi bu görünüyor

var filter = new AutoFilter() { Reference = string.Format("{0}:{1}", topLeftCellReference, bottomRightCellReference) }; 
worksheet.AppendChild(filter); 

workbookPart.Wookbook.DefinedNames.AppendChild(new DefinedName(string.Format("'{0}'!$A${1}:${2}${3}", 
    sheet.Name, 
    leftColumnLetter, 
    topRowIndex, 
    rightColumnLetter, 
    bottomRowIndex)) 
{ 
    Name = "_xlnm._FilterDatabase", 
    LocalSheetId = sheet.SheetId - 1, 
    Hidden = true 
}); 

:

Yani sonunda, böyle bir şey var. Excel, adın sıralamadan önce tanımlanıp tanımlanmadığını kontrol etmeli ve gerekirse otomatik olarak oluşturulmalıdır (sıralamadan ziyade filtrelenirseniz bu görünür).

+0

Çok teşekkürler! ExcelBuilder kitaplığı geliştirmeye çalışırken javascript bir Excel oluştururken aynı sorunu vardı. Bu hile yaptı! – nbeuchat

İlgili konular