回覆列表
  • 1 # 使用者990540253822

    透過Email推送統計報告。一般除了要求將PPT報告檔案作為附件發給使用者,同時希望將報告內容在郵件中直觀展示。 一份統計報告中經常包含柱狀圖、餅圖、好看的圖表,這些資訊要直接在Email中展示比較複雜。本文推薦一種方式:將PPT圖表內容轉換為高保真的圖片,將圖片放到Email中傳送,在不丟失使用者體驗的前提下,工作量儘可能小。

    一、 將PPT報告轉換為PNG圖片檔案。

    **有兩種方式:**一種是採用POI元件將圖片繪製到剪下板再輸出為圖片檔案;另一種方式是透過COM介面呼叫PowerPoint的介面,使用PPT自身的”另存為”功能,將PPT內容另存為圖片檔案。

    優劣比較:

    POI元件:不依賴於Office, 再linux下也可以執行;不好的地方是儲存的圖片效果太差,文字模糊,圖表存在重影。參考程式碼:http://blog.csdn.net/jsudavid/article/details/10387959。輸出圖片檔案效果如部落格中描述。本人POI元件應用經驗比較少,不清楚如何最佳化,有經驗的同行可以給點建議。

    COM介面:依賴於Office,需要安裝Office,只能部署在Windows平臺,效能比較低,不支援併發操作(注意新增同步鎖);匯出的圖片效果很好,功能強大,程式碼簡單。

    參考程式碼:

    public static void main(String[] args)

    {

    new PPT2Image().SaveAsImage("D:\\TEMP\\ppt\\xxx.pptx",

    "D:\\TEMP\\ppt\\20151201");

    }

    /**

    *

    * 儲存PPT為圖片檔案,每一個Slide儲存為一個圖片檔案。

    *

    * @param pptFilePath ppt檔案路徑。

    * @param savePath 儲存圖片檔案目錄,生成的圖片檔案放該目錄下。

    */

    public synchronized void SaveAsImage(String pptFilePath, String savePath)

    {

    // 啟動 office PowerPoint程式

    ActiveXComponent pptApp = new ActiveXComponent("PowerPoint.Application");

    Dispatch.put(pptApp, "Visible", new Variant(true));

    Dispatch presentations = pptApp.getProperty("Presentations").toDispatch();

    // 開啟PPT檔案

    Dispatch presentation = Dispatch.call(presentations, "Open", pptFilePath, false,

    false, true).toDispatch();

    // 另儲存為PNG圖片檔案。SaveAs支援將PPT儲存為各種格式的檔案。

    // PpSaveAsFileType:18-儲存為PNG格式的圖片。MsoTriState:1-轉換狀態

    // 完整的列舉定義參見MicroSoft說明文件:

    // https://technet.microsoft.com/zh-cn/windows/bb251061(v=msdn.10).aspx

    // https://technet.microsoft.com/zh-cn/aa432714(v=office.12)

    Dispatch.call(presentation, "SaveAs", savePath, 18, 1);

    // 儲存,關閉檔案。退出power point程式。

    Dispatch.call(presentation, "Save");

    Dispatch.call(presentation, "Close");

    Dispatch.call(pptApp, "Quit");

    }

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    如果POI能否做一些調優,效果達到COM介面輸出的圖片效果。優先使用POI元件,否則選擇COM介面的方式。畢竟需要優先保證使用者體驗。

    二、 將圖片新增到郵件正文

    2.1 原理描述

    將PPT轉換後的圖片檔案儲存在Tomcat的Web應用路徑下,提供域名(或者IP地址)下載該圖片檔案。使用者開啟收到的郵件時會透過http協議請求載入圖片檔案。需要注意的是中文版本的PPT轉換後的PNG圖片名中包含中文,要將Tomcat的資源定位編碼設定為UTF-8。Conf\ server.xml。

    圖片檔案在伺服器上按日期、按型別長期儲存,提供下載服務。如果Tomcat伺服器關閉了,使用者開啟郵件就看不到圖片。

    1

    2

    1

    2

    and responses are returned. Documentation at :

    Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)

    Java AJP Connector: /docs/config/ajp.html

    APR (HTTP/AJP) Connector: /docs/apr.html

    Define a non-SSL HTTP/1.1 Connector on port 8080

    -->

    <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

    <Connector executor="tomcatThreadPool"

    port="8080" protocol="HTTP/1.1"

    connectionTimeout="20000"

    redirectPort="8443" />

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    2.2 參考程式碼

    email.setMailHeader("Email推送報告技術說明及樣例程式碼");

    mailContext += "建立人: Elon";

    mailContext += "<br />"

    + "<br />"

    + "本文件主要解決報告轉換為圖片, 新增到Email正文傳送的問題。"

    + "<br />"

    + "<br />";

    mailContext += "<img src=http://192.168.1.1:80/app/images/report/幻燈片3.PNG />";

    mailContext += "<br />"

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

  • 中秋節和大豐收的關聯?
  • 唐代皇帝詩人有哪些?