2012-03-05 54 views
4

我是Open Xml的新手,并使用Open Xml SDK创建了报表应用程序。它将数据填充到表格中,并且当表格高度超过幻灯片边框时,将幻灯片克隆并填充新幻灯片中的下一组数据等等。所有的工作都很好,但是当一些行有数据包装成2行时,无法在确切的地方插入新页面。看起来原因是当有单行数据时,Open Xml仍然返回与行高相同的行高。无论如何解决这个问题。OpenXML,PresentationML表格高度和换行高度

下面是一段代码,做分页逻辑(CreateTextCell是创建文本单元,并返回一个方法):

var tbl = current.Slide.Descendants<A.Table>().First(); 
       var tr = new A.TableRow(); 
       tr.Height = 200000; 
       tr.Append(CreateTextCell(product.Name)); 
       tr.Append(CreateTextCell(product.ProductNumber)); 
       tr.Append(CreateTextCell(product.Size)); 
       tr.Append(CreateTextCell(String.Format("{0:00}", product.ListPrice))); 
       tr.Append(CreateTextCell(product.SellStartDate.ToShortDateString())); 
       tbl.Append(tr); 
       totalHeight += tr.Height; 



       if (totalHeight > pageBorder) 
        overflow = true; 

回答

1

我有一个非常相似的question,发现当通过Open XML SDK填充表格时,表的高度没有更新。只有在Power Point中实际打开演示文稿时才会更新它。这显然无法帮助您在代码中分辨何时将表格拆分为新的幻灯片,但如果您尝试使用answer,则可能会有所帮助。

+0

amura .. of course我以前见过这个问题:)。但是在计算文本的版面区域时,我们需要确保单元格边距,填充和缩进都被考虑在内?如果你已经达到这个目标,你会介意分享一些资源吗? – Aneef 2012-03-07 09:44:53

+0

当你说填充和保证金需要考虑时,你是对的。我从来没有在这个问题上标出正确答案,因为我从未找到解决方案。我回到我们的客户身边,得到了一个可以接受的解决方法。 – amurra 2012-03-07 15:21:56

1

如果你可以假设上述所有的列都是固定的宽度,但使用product.Name的第一列除外,并且字体样式相同,则可以使用以下方法而不是检查表格高度>边框。

首先,在PowerPoint中打开演示文稿并转到幻灯片中。输入固定宽度的列数据。然后在第一列中输入'XXXX ....'直到换行符为止,计算换行符前的字符数,该数字将为maxLengthBeforeBreak

第二,从上面的第一步清除并输入在不会换行的类似行中复制并粘贴此行,然后在幻灯片中填充表格,直至您的幻灯片的最大行数看起来吸引用户,该行数将为maxTableRowsPerSlide

现在,当你填入行每一张幻灯片,算你在rowCount变量插入的行数。插入行而rowCount < maxTableRowsPerSlide,然后开始一个新的幻灯片。

并且对于每一行 - 如果product.Name的长度为>maxLengthBeforeOverflow,则可以将长度除以maxLengthBeforeOverflow以增加rowCount以获得此行换行的数字行。

+0

感谢您的回应,但问题是所有列数据都是动态驱动的,而这只是一种数据模式。可能还会有更多的其他场景。基本上我需要一个常用的方法来处理这个问题 – Aneef 2012-03-06 08:11:40