業務背景
專案需提供多報表 Word 下載,報表含 FusionChart 圖表。Linux 環境下無法使用 COM/Jacob 調用 Office,純 Java 操作 Word 僅有 POI (HWPF/XWPF) 與 docx4j 可選。
方案演進與對比
方案一:前端渲染 → 服務端生圖 → 插入 Word(曲線救國)
- 流程:新頁面打開 Flash 圖表 → 調用 FusionChart 服務端導出圖片 → Servlet 生成 Word 並插入圖片;
- 缺點:性能極差,涉及多次 HTTP 往返、Flash 渲染、圖片傳輸、文檔生成,用戶等待時間不可控。
方案二:Word 嵌入 Flash OLE 對象
- 思路:將 Flash 作為 OLE/ActiveX 嵌入 .doc,Word 打開時實時渲染;
- 阻礙:HWPF 不支援 OLE,需手工構建 BIFF 格式,難度極高;且 Office 安全策略常禁用 ActiveX,兼容性極差。放棄。
方案三:數據驅動 Office 原生圖表
- 思路:直接用數據生成 Word/Excel 原生圖表(HWPF/XWPF 或 HSSF/XSSF);
- 現狀:HWPF 無圖表 API,HSSF 雖支援但需操作 Excel 再轉 Word,流程繁瑣。不可行。
方案四:JFreeChart 後端生成圖片 → 插入 Word(最終選型)
- 流程:後端用 JFreeChart 繪製圖表為圖片 → POI/docx4j 生成 Word 並插入圖片;
- 優點:純 Java、無外部依賴、Linux 部署零障礙、性能可控;
- 缺點:圖表風格與 FusionChart 不一致,JFreeChart 預設樣式較醜,需投入精力美化(主題、渲染器、字體)。
技術選型決策矩陣
| 維度 | 方案一 | 方案二 | 方案三 | 方案四 |
| 實現難度 | 中 | 極高 | 高 | 低 |
| 運行性能 | 差 | 中 | 中 | 好 |
| Linux 相容 | 需無頭瀏覽器 | 不支援 | 不支援 | 完美 |
| 圖表一致性 | 高 | 高 | 中 | 低(可定制) |
| 維護成本 | 高 | 極高 | 高 | 中 |
JFreeChart 美化關鍵點
- 主題定制:實現
ChartTheme 統一顏色、字體、網格風格;
- 渲染器優化:
LineAndShapeRenderer、BarRenderer 等調整筆觸、陰影、標籤位置;
- 中文字體:設置
ChartFactory.setChartTheme(new StandardChartTheme("CN", new Font("微軟雅黑", Font.PLAIN, 12), ...));
- 輸出質量:
ChartUtils.saveChartAsPNG(file, chart, width, height, RenderingHints.VALUE_ANTIALIAS_ON) 開啟抗鋸齒。
總結
在 Linux 服務端生成含圖表 Word 報表,JFreeChart + POI/docx4j 是目前工程落地成熟度最高、維護成本最低的方案。雖樣式需二次打磨,但避開了 Flash、COM、OLE 等強平台依賴技術棧,長期收益遠大於短期適配成本。