2010-04-14 16 views
5

Tengo un montón de datos que necesito exportar de un sitio web a una presentación de PowerPoint y he usado Open XML SDK 2.0 para realizar esta tarea. Tengo una presentación de PowerPoint que estoy poniendo a través de Open XML SDK 2.0 Productivity Tool para generar el código de plantilla que puedo usar para recrear la exportación.Cómo dividir la tabla en una nueva diapositiva de PowerPoint cuando el contenido fluye fuera de la diapositiva actual usando Open XML SDK 2.0

En una de esas diapositivas tengo una tabla y el requisito es agregar datos a esa tabla y dividir esa tabla en varias diapositivas si la tabla excede la parte inferior de la diapositiva. El enfoque que he tomado es determinar la altura de la tabla y si excede la altura de la diapositiva, mueva ese nuevo contenido a la siguiente diapositiva. He leído el blog Bryan and Jones al agregar datos repetidos a una diapositiva de PowerPoint, pero mi escenario es un poco diferente. Utilizan el siguiente código:

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

Esto no funcionará para mí, ya que saben qué altura para ajustar la fila de la tabla a, ya que será la altura de la imagen, pero cuando se añaden en diferentes cantidades de texto I no sé la altura antes de tiempo, así que simplemente configuré tr.Height en un valor predeterminado. Aquí está mi intento de averiguar la altura de la mesa:

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

Aquí están los métodos de ayuda:

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

Esto agrega correctamente la nueva fila de la tabla a la tabla existente, pero cuando intento y obtener el altura de la mesa, devuelve la altura original y no la nueva altura. La nueva altura significa la altura predeterminada que configuré inicialmente y no la altura después de haber insertado una gran cantidad de texto. Parece que la altura solo se reajusta cuando se abre en PowerPoint.

También he intentado acceder a la altura de la celda de tabla más grande de la fila, pero parece que no puedo encontrar la propiedad adecuada para realizar esa tarea.

Mi pregunta es ¿cómo se determina la altura de una fila de tabla añadida dinámicamente ya que no parece actualizar la altura de la fila hasta que se abre en PowerPoint? ¿Alguna otra forma de determinar cuándo dividir el contenido en otra diapositiva mientras usa Open XML SDK 2.0? Estoy abierto a cualquier sugerencia sobre un mejor enfoque que alguien haya tomado ya que no hay mucha documentación sobre este tema.

+0

Sí, me refiero a esto fue el camino que iba hacia abajo, pero no tuvo suerte. Buscando más por un ejemplo de trabajo con código. – amurra

+0

@Otaku: Nunca encontré una solución a este problema y dado que el tiempo era un problema en mi proyecto, decidimos simplemente dejar que los datos fluyeran de la diapositiva y hacer que el usuario final volviera a formatear los datos. – amurra

Respuesta

2

Esta es una gran pregunta. Una cosa que puede hacer es medir el alto y el ancho de las fuentes en System.Drawing.Text y crear una especie de preprocesador en el código para averiguar si el texto hará que la tabla fluya fuera de la pantalla. Habría un poco para hacer un seguimiento, como a qué ancho se ajustarán las fuentes y crear una nueva línea y luego espacio entre las líneas y el margen de las celdas. Sería un total acumulado realizar un seguimiento de la altura de la tabla por el número total de líneas que podría contener con su fuente y su tamaño y su texto enchufado, y aún permanecer dentro de los límites del lienzo de la diapositiva. Pero una vez que tenga todo esto, le dará una buena idea de si necesita o no una nueva diapositiva.

Este es un buen artículo para aprender cómo medir el texto representado en .NET: http://www.devsource.com/c/a/Languages/Text-Metrics-in-the-Net-Framework-Part-I/

+0

Creo que también necesitaría hacer un seguimiento de la posición inicial de la mesa en la diapositiva como altura de inicio.Intenté realizar esta tarea, pero no pude obtener resultados consistentes ya que la altura de la tabla no pareció cambiar hasta que ppt la procesó. ¿Algún código que puedas publicar para ver si me perdí algo? – amurra

+0

@amurra: Desafortunadamente no tengo ningún código de muestra, imagino que sería una buena cantidad de trabajo y código para resolver el problema, pero así es como lo abordaría. El problema principal con Open XML SDK es que no proporciona ninguna información de representación; imagino que si intentara esta tarea desde VBA o VSTO, sería capaz de desarrollar una solución mucho más rápido simplemente mirando el lienzo de la diapositiva. altura y compare la tabla superior + altura para ver si está fuera de página y, si es así, elimine la última fila y comience la siguiente diapositiva con ella. –

+0

@amurra: me encontré con un buen artículo sobre la medición de texto en .NET que sería útil la recomendación anterior. Enlace arriba. –

Cuestiones relacionadas