2010-04-14 11 views
5

Ho un sacco di dati che ho bisogno di esportare da un sito Web a una presentazione di PowerPoint e ho utilizzato Open XML SDK 2.0 per eseguire questo compito. Ho una presentazione di PowerPoint che sto utilizzando lo strumento di produttività Open XML SDK 2.0 per generare il codice del modello che posso utilizzare per ricreare l'esportazione.Come dividere la tabella in una nuova diapositiva di PowerPoint quando il contenuto scorre fuori dalla diapositiva corrente utilizzando Open XML SDK 2.0

In una di queste diapositive ho una tabella e il requisito è quello di aggiungere dati a quella tabella e suddividere quella tabella tra più diapositive se la tabella supera la parte inferiore della diapositiva. L'approccio che ho preso è quello di determinare l'altezza della tabella e se supera l'altezza della diapositiva, spostare quel nuovo contenuto nella diapositiva successiva. Ho letto il blog Bryan and Jones aggiungendo dati ripetuti a una diapositiva di PowerPoint, ma il mio scenario è leggermente diverso. Usano il seguente codice:

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++; 

Questo non funziona per me dato che essi sanno che cosa altezza per impostare la riga della tabella per quanto sarà l'altezza dell'immagine, ma quando l'aggiunta di diverse quantità di testo che Non conosco l'altezza in anticipo quindi ho appena impostato tr.Height su un valore predefinito. Qui è il mio tentativo di capire, al culmine tavolo:

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

Qui ci sono i metodi di supporto:

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

Questo aggiunge correttamente la nuova riga della tabella alla tabella esistente, ma quando provo e ottenere il altezza del tavolo, restituisce l'altezza originale e non la nuova altezza. La nuova altezza indica l'altezza predefinita inizialmente impostata e non l'altezza dopo che è stata inserita una grande quantità di testo. Sembra che l'altezza venga riadattata solo quando viene aperta in PowerPoint.

Ho anche provato ad accedere all'altezza della cella di tabella più grande nella riga, ma non riesco a trovare la proprietà giusta per eseguire quell'attività.

La mia domanda è come si determina l'altezza di una riga di tabella aggiunta dinamicamente poiché non sembra aggiornare l'altezza della riga finché non viene aperta in PowerPoint? Altri modi per determinare quando dividere il contenuto in un'altra diapositiva mentre si utilizza Open XML SDK 2.0? Sono aperto a qualsiasi suggerimento su un approccio migliore che qualcuno potrebbe aver preso poiché non c'è molta documentazione su questo argomento.

+0

Sì, voglio dire questo è stato il percorso che stavo giù, ma non ha avuto alcuna fortuna. Cercando di più per un esempio funzionante con codice. – amurra

+0

@Otaku: Non ho mai trovato una soluzione a questo problema e poiché il tempo è stato un problema per il mio progetto, abbiamo deciso di lasciare semplicemente scorrere i dati dalla diapositiva e rendere l'utente finale riformattare i dati. – amurra

risposta

2

Questa è davvero una grande domanda. Una cosa che puoi fare è misurare l'altezza e la larghezza dei caratteri in System.Drawing.Text e creare una specie di pre-renderer nel codice per capire se il testo farà sì che la tabella scorra fuori dallo schermo. Ci sarebbe un po 'da tenere a mente, come a quale larghezza i caratteri si avvolgono e si crea una nuova linea e quindi lo spazio tra le linee e il margine delle celle. Sarebbe un totale parziale per tenere traccia dell'altezza del tavolo per il numero totale di linee che potrebbe contenere con il tuo font e le sue dimensioni e il testo inserito e rimanere comunque entro i limiti della diapositiva. Ma una volta che hai tutto questo, dovrebbe darti una visione molto chiara della necessità o meno di una nuova diapositiva.

Questo è un buon articolo per imparare a misurare il testo reso in .NET: http://www.devsource.com/c/a/Languages/Text-Metrics-in-the-Net-Framework-Part-I/

+0

Penso che avresti bisogno di tenere traccia della posizione iniziale del tavolo sulla diapositiva anche come altezza iniziale.Ho cercato di eseguire questa operazione, ma non ho potuto ottenere risultati coerenti dal momento che l'altezza della tabella non sembra cambiare fino a renderla ppt. Qualche codice che potresti postare per vedere se ho perso qualcosa? – amurra

+0

@amurra: Purtroppo non ho alcun codice di esempio - immagino che sarebbe una buona dose di lavoro e codice per risolvere il problema, ma questo è il modo in cui mi piacerebbe affrontarlo. Il problema principale con Open XML SDK è che non fornisce alcuna informazione di rendering - Immagino che se provassi questo compito da VBA o VSTO, saresti in grado di sviluppare una soluzione molto più velocemente semplicemente guardando la diapositiva della diapositiva altezza e confronta il tavolo + altezza per vedere se è fuori dalla pagina e, in tal caso, rimuovere l'ultima riga e avviare la successiva diapositiva con esso. –

+0

@amurra: mi sono imbattuto in un buon articolo sulla misurazione del testo in .NET che sarebbe stato utile per la raccomandazione di cui sopra. Link sopra. –

Problemi correlati