2010-04-14 9 views
5

Bir web sitesinden bir PowerPoint sunusuna vermek ve Open XML SDK 2.0 kullanarak gerçekleştirmek için kullanmam gereken bir sürü veri var bu görev. Ben ihracat yeniden oluşturmak için kullanabileceğiniz şablon kodu oluşturmak için Açık XML SDK 2.0 Verimlilik Aracı ile koyarak bir PowerPoint sunum var.Açık XML SDK 2.0 kullanarak mevcut slayt kapalı olduğunda tablo yeni PowerPoint slayd nasıl bölünür?

Bu slaytlardan birinde bir tablom var ve bu tabloya tablo eklemek ve tablo slaytın altını aşarsa bu tabloyu birden çok slaytta kırmak. Benim çektiğim yaklaşım tablonun yüksekliğini belirlemek ve slaydın yüksekliğini aşarsa, bu yeni içeriği bir sonraki slayta taşıyın. Bir PowerPoint slaydına yinelenen veri eklemekle ilgili Bryan and Jones blogunu okudum, ancak senaryom biraz farklı. Bunlar aşağıdaki kodu kullanın: onlar resmin yüksekliği olacağından hiç tablo satırını ayarlamak ne yükseklik biliyorum ama beri

A.Table tbl = current.Slide.Descendants<A.Table>().First(); 
A.TableRow tr = new A.TableRow(); 
tr.Height = heightInEmu; 
tr.Append(CreateDrawingCell(imageRel + imageRelId)); 
tr.Append(CreateTextCell(category)); 
tr.Append(CreateTextCell(subcategory)); 
tr.Append(CreateTextCell(model)); 
tr.Append(CreateTextCell(price.ToString())); 
tbl.Append(tr); 
imageRelId++; 

Bu benim için işe yaramaz metin I değişik miktarlarda eklerken Önceden yüksekliği bilmiyorum, bu yüzden tr.Height değerini varsayılan değere ayarlıyorum. Ben denemek ve aldığımda

public static A.TableCell CreateTextCell(string text) 
{ 
    A.TableCell tableCell = new A.TableCell(
          new A.TextBody(new A.BodyProperties(), 
          new A.Paragraph(new A.Run(new A.Text(text)))), 
          new A.TableCellProperties()); 
    return tableCell; 
} 

public static Int64Value TableHeight(A.Table table) 
{ 
    long height = 0; 

    foreach (var row in table.Descendants<A.TableRow>() 
          .Where(h => h.Height.HasValue)) 
    { 
     height += row.Height.Value; 
    } 

    return height; 
} 

Bu doğru Mevcut tabloya yeni tablo satır ekler, ancak: Burada

A.Table tbl = tableSlide.Slide.Descendants<A.Table>().First(); 
    A.TableRow tr = new A.TableRow(); 
    tr.Height = 370840L; 
    tr.Append(PowerPointUtilities.CreateTextCell("This"); 
    tr.Append(PowerPointUtilities.CreateTextCell("is")); 
    tr.Append(PowerPointUtilities.CreateTextCell("a")); 
    tr.Append(PowerPointUtilities.CreateTextCell("test")); 
    tr.Append(PowerPointUtilities.CreateTextCell("Test")); 
    tbl.Append(tr); 
    tableSlide.Slide.Save(); 

    long tableHeight = PowerPointUtilities.TableHeight(tbl); 

yardımcı yöntemler vardır: İşte tablo yükseklikte endam benim girişimi Tablonun yüksekliği, orijinal yüksekliğini değil yeni yüksekliği döndürür. Yeni yükseklik, büyük miktarda metin eklendikten sonra, başlangıçta ayarladığım varsayılan yükseklik anlamına gelir ve yükseklik değil. PowerPoint'te açıldığında yüksekliğin sadece yeniden ayarlandığı anlaşılıyor.

Satırdaki en büyük tablo hücresinin yüksekliğine erişmeyi denedim, ancak bu görevi gerçekleştirmek için doğru özelliği bulamıyor gibi görünmüyor.

Sorunun, PowerPoint'te açılana kadar satırın yüksekliğini güncelleştirmediği için dinamik olarak eklenen bir tablo satırının yüksekliğini nasıl belirliyorsunuz? Açık XML SDK 2.0 kullanırken içeriği başka bir slayta ne zaman ayırmanın diğer yolları? Bu konuda çok fazla dokümantasyon bulunmadığından, daha iyi bir yaklaşımla ilgili bir öneriye açığım.

+0

Evet ben bu ben aşağı gidiyordu yol oldu, ama herhangi bir şans yoktu yani. Kod ile çalışan bir örnek için daha fazlasını arıyorum. – amurra

+0

@Otaku: Bu konuya hiç bir zaman bir çözüm bulamadım ve zamanım projemde bir sorun olduğu için verinin slayttan akmasını ve son kullanıcının verileri yeniden biçimlendirmesini sağlamaya karar verdik. – amurra

cevap

2

Bu gerçekten harika bir soru. Yapabileceğiniz bir şey, System.Drawing.Text'daki yazı tiplerinin yüksekliğini ve genişliğini ölçmek ve metnin tablodan dışarı akmasına neden olup olmayacağını anlamak için kod içinde bir çeşit ön oluşturucu oluşturmaktır. Yazı tiplerinin hangi genişlikte sarılacağı ve yeni bir çizgi oluşturduğu gibi satırların ve hücrelerin kenar boşluğu arasındaki boşluğun izlenmesi biraz olacaktır. Tablo yüksekliğini, yazı tipinizle içerebileceği toplam satır sayısına ve boyutuna ve metninize takılı olarak sığdırmak için çalışan bir toplam olur ve yine de slayt tuvalinin sınırları dahilinde kalır. Ama bir kere buna sahip olduğunuzda, yeni bir slayda ihtiyacınız olup olmadığına dair size çok iyi bir fikir vermelisiniz.

Bu .NET işlenen metni ölçmek öğrenmek için iyi bir yazı olduğunu: http://www.devsource.com/c/a/Languages/Text-Metrics-in-the-Net-Framework-Part-I/

+0

Tablonun başlangıç ​​konumunu slayt üzerinde da başlangıç ​​yüksekliğini izlemeniz gerektiğini düşünürdüm.Bu görevi gerçekleştirmeyi denedim, ancak tutarlı sonuçlar elde edemedim çünkü tablo yüksekliği ppt işlenene kadar değişmiyordu. Bir şey özlediğimi görmek için gönderebileceğiniz herhangi bir kod var mı? – amurra

+0

@amurra: Ne yazık ki herhangi bir örnek kodum yok - I imajı, sorunu çözmek için adil bir iş ve kod olurdu, ama ben buna nasıl yaklaşacağım. Açık XML SDK ile ilgili temel sorun, herhangi bir oluşturma bilgisi içermemesidir - bu görevi VBA veya VSTO'dan deniyor olsaydınız, sadece slayt tuvaline bakarak çok daha hızlı bir çözüm geliştirebileceğinizi düşünürdüm yükseklik ve sayfanın kapalı olup olmadığını görmek için masa üstü + yüksekliğini karşılaştırın ve eğer öyleyse, son satırı kaldırın ve bir sonraki slaydı başlatın. –

+0

@amurra: .NET'teki metni ölçmekle ilgili iyi bir makalenin üzerine, yukarıdaki tavsiyeye yardımcı olacağına inandım. Yukarıdaki bağlantı. –