2010-04-14 20 views
5

我有一大堆數據需要從網站導出到PowerPoint演示文稿,並且已使用Open XML SDK 2.0執行這個任務。我有一個PowerPoint演示文稿,我正在通過Open XML SDK 2.0生產力工具生成可用於重新創建導出的模板代碼。如何使用Open XML SDK 2.0從內容流出當前幻燈片時將表格拆分爲新的PowerPoint幻燈片

在其中一張幻燈片上,我有一個表格,並且要求將數據添加到該表格,並在表格超出幻燈片底部時將該表格分割到多張幻燈片中。我採取的方法是確定表格的高度,如果它超過幻燈片的高度,請將該新內容移動到下一張幻燈片中。我已閱讀Bryan and Jones博客,向PowerPoint幻燈片添加重複數據,但我的場景有點不同。他們使用下面的代碼:

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

這不會對我的工作,因爲他們知道什麼高度的錶行設置爲,因爲這將是圖像的高度,但在不同量的文字我的加時不知道提前的高度,所以我只是將tr.Height設置爲默認值。這是我在桌子高度盤算嘗試:

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

這裏的輔助方法:

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

這正確地添加新的錶行到現有的表,但是當我嘗試並獲得表的高度,它返回原來的高度而不是新的高度。新的高度表示我初始設置的默認高度,而不是插入大量文本後的高度。它似乎只有在PowerPoint中打開時才調整高度。

我也嘗試訪問該行中最大表格單元的高度,但似乎無法找到正確的屬性來執行該任務。

我的問題是,如何確定動態添加的表格行的高度,因爲它似乎沒有更新該行的高度,直到它在PowerPoint中打開爲止?在使用Open XML SDK 2.0時確定何時將內容拆分到另一張幻燈片的其他方法?對於有人可能採取的更好方法的任何建議,我都樂於接受,因爲關於此主題的文檔不多。

+0

是啊,我的意思是,這是我快要落山的路徑,但沒有任何運氣。尋找更多的代碼工作示例。 – amurra 2010-08-23 12:10:38

+0

@Otaku:我從來沒有找到解決這個問題的方法,並且由於時間是我項目中的一個問題,我們決定讓數據從幻燈片中移出並讓最終用戶重新格式化數據。 – amurra 2010-09-16 12:52:06

回答

2

這是一個非常好的問題。您可以做的一件事是測量System.Drawing.Text中的字體的高度和寬度,並在代碼中創建一種預渲染器,以確定文本是否會導致表格脫離屏幕。需要跟蹤一些內容,比如字體的寬度是多少,然後創建一個新的行,然後在行和單元格邊距之間創建一個空格。通過它可以包含的字體總數以及它的大小和插入的文本來跟蹤表格高度,並且仍然保持在幻燈片畫布的範圍內。但是,一旦你擁有了所有這些,它應該讓你很好地洞察你是否需要新的幻燈片。

這是學習如何衡量渲染的文本在.NET好文章:http://www.devsource.com/c/a/Languages/Text-Metrics-in-the-Net-Framework-Part-I/

+0

我想你會需要跟蹤幻燈片上桌子的初始位置,作爲起始高度。我試圖執行此任務,但無法獲得一致的結果,因爲在ppt呈現之前表的高度似乎沒有變化。任何代碼,你可以發佈,看看我是否錯過了什麼? – amurra 2010-07-13 13:03:57

+0

@amurra:不幸的是,我沒有任何示例代碼 - 我認爲這將是一個相當大的工作和代碼來解決問題,但這是我將如何處理它。 Open XML SDK的主要問題是它沒有提供任何渲染信息 - 我想如果你從VBA或VSTO嘗試這個任務,只要看一下幻燈片畫布就可以更快地開發解決方案高度並比較桌面+高度以查看它是否處於關閉頁面,如果是,則刪除最後一行並使用它開始下一張幻燈片。 – 2010-07-13 15:17:52

+0

@amurra:我偶然發現了一篇關於在.NET中測量文本的好文章,這將有助於上面的建議。上面的鏈接。 – 2010-08-06 14:17:06