動態

詳情 返回 返回

Access導出帶圖表的 HTML 報表:技術實現詳解

Hi,大家好!
上週我分享了把表中數據導出為 HTML 的實現;這次聚焦進階:如何把圖表也導出到 HTML 中並保持交互性與可移植性。開始前,給大家再彙報一下框架的情況,由於近兩月參與其他項目的交付,框架開發有所延後;現已調整優先級,計劃本月先發布一版可用實現,後續再按需迭代與優化。本來我也是遊刃有餘,現在是匆匆忙忙,不過這個Flag先立下了。
在 Access 開發中,我們經常需要將數據以可視化的方式呈現。今天分享一個實用技術:使用 VBA 生成包含交互式圖表的 HTML 報表。

一、技術方案

選擇Access 導出圖表到 HTML 主要有兩種方式:使用內置 OutputTo:會將圖表轉為靜態圖片,文件體積大使用 JavaScript 圖表庫:生成可交互的矢量圖表,文件小且效果好本文采用第二種方案,使用 Chart.js 庫實現。

二、創建表與窗體

接着,我們要準備好數據,可以像這樣:

表有了,那我們再創建一個簡單的窗體:

三、核心實現代碼

以下是一個完整的導出函數,從數據庫讀取數據並生成帶圖表的 HTML:

' 導出帶 Chart.js 圖表的 HTML
Public Sub ExportHTMLWithChartJS()
    Dim rs As DAO.Recordset
    Dim html As String
    Dim labels As String
    Dim dataValues As String
    
    ' 獲取數據
    Set rs = CurrentDb.OpenRecordset("SELECT 月份, 銷售額 FROM tblSales ORDER BY 月份")
    
    ' 構建圖表數據
    labels = ""
    dataValues = ""
    Do While Not rs.EOF
        labels = labels & "'" & rs!月份 & "',"
        dataValues = dataValues & rs!銷售額 & ","
        rs.MoveNext
    Loop
    rs.Close
    
    ' 去掉最後的逗號
    If Len(labels) > 0 Then
        labels = Left(labels, Len(labels) - 1)
        dataValues = Left(dataValues, Len(dataValues) - 1)
    End If
    
    ' 構建 HTML
    html = "<!DOCTYPE html>" & vbCrLf
    html = html & "<html lang='zh-CN'>" & vbCrLf
    html = html & "<head>" & vbCrLf
    html = html & "  <meta charset='utf-8'>" & vbCrLf
    html = html & "  <meta name='viewport' content='width=device-width, initial-scale=1'>" & vbCrLf
    html = html & "  <title>銷售趨勢圖</title>" & vbCrLf
    
    ' 引入 Chart.js
    html = html & "  <script src='https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js'></script>" & vbCrLf
    
    html = html & "  <style>" & vbCrLf
    html = html & "    body { font-family: 'Microsoft YaHei', sans-serif; margin: 20px; background: #f5f5f5; }" & vbCrLf
    html = html & "    .container { max-width: 1200px; margin: 0 auto; background: white; padding: 30px; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }" & vbCrLf
    html = html & "    h1 { color: #333; text-align: center; }" & vbCrLf
    html = html & "    .chart-container { position: relative; height: 400px; margin-top: 30px; }" & vbCrLf
    html = html & "  </style>" & vbCrLf
    html = html & "</head>" & vbCrLf
    html = html & "<body>" & vbCrLf
    html = html & "  <div class='container'>" & vbCrLf
    html = html & "    <h1>銷售趨勢分析</h1>" & vbCrLf
    html = html & "    <p style='text-align: center; color: #666;'>數據更新時間:" & Now & "</p>" & vbCrLf
    
    ' 圖表容器
    html = html & "    <div class='chart-container'>" & vbCrLf
    html = html & "      <canvas id='salesChart'></canvas>" & vbCrLf
    html = html & "    </div>" & vbCrLf
    html = html & "  </div>" & vbCrLf
    
    ' JavaScript 圖表代碼
    html = html & "  <script>" & vbCrLf
    html = html & "    const ctx = document.getElementById('salesChart');" & vbCrLf
    html = html & "    new Chart(ctx, {" & vbCrLf
    html = html & "      type: 'bar'," & vbCrLf
    html = html & "      data: {" & vbCrLf
    html = html & "        labels: [" & labels & "]," & vbCrLf
    html = html & "        datasets: [{" & vbCrLf
    html = html & "          label: '銷售額(萬元)'," & vbCrLf
    html = html & "          data: [" & dataValues & "]," & vbCrLf
    html = html & "          borderColor: 'rgb(75, 192, 192)'," & vbCrLf
    html = html & "          backgroundColor: 'rgba(75, 192, 192, 0.2)'," & vbCrLf
    html = html & "          tension: 0.1" & vbCrLf
    html = html & "        }]" & vbCrLf
    html = html & "      }," & vbCrLf
    html = html & "      options: {" & vbCrLf
    html = html & "        responsive: true," & vbCrLf
    html = html & "        maintainAspectRatio: false," & vbCrLf
    html = html & "        plugins: {" & vbCrLf
    html = html & "          legend: { display: true, position: 'top' }," & vbCrLf
    html = html & "          title: { display: false }" & vbCrLf
    html = html & "        }" & vbCrLf
    html = html & "      }" & vbCrLf
    html = html & "    });" & vbCrLf
    html = html & "  </script>" & vbCrLf
    html = html & "</body>" & vbCrLf
    html = html & "</html>"
    
    ' 保存文件
    WriteUTF8File "C:\Users\Desktop\html\SalesChart.html", html
    
    MsgBox "圖表導出完成!", vbInformation
End Sub
' UTF-8 寫入函數
Private Sub WriteUTF8File(filePath As String, content As String)
    Dim stream As Object
    Set stream = CreateObject("ADODB.Stream")
    With stream
        .Type = 2
        .Charset = "utf-8"
        .Open
        .WriteText content
        .SaveToFile filePath, 2
        .Close
    End With
    Set stream = Nothing
End Sub

四、技術要點説明

4.1 數據格式化Chart.js 需要 JavaScript 數組格式的數據:標籤:['一月', '二月', '三月']數值:[100, 200, 150]在 VBA 中通過字符串拼接實現,注意去掉最後的逗號。
4.2 圖表類型Chart.js 支持多種圖表類型,只需修改 type 參數:line:折線圖bar:柱狀圖pie:餅圖doughnut:環形圖radar:雷達圖
4.3 響應式設計關鍵配置:配合 CSS:
4.4 中文支持必須做到三點:HTML 頭部聲明:<meta charset='utf-8'>使用 UTF-8 保存文件指定中文字體:font-family: 'Microsoft YaHei'輸出的樣式:

五、常見問題

Q1:圖表不顯示?檢查瀏覽器控制枱是否有 JavaScript 錯誤,通常是數據格式問題。
Q2:離線使用怎麼辦?下載 Chart.js 文件到本地,修改引用路徑。

六、擴展應用

這個技術可以應用到:
MRP 運算結果
可視化庫存波動趨勢分析
生產進度監控儀表板
質量分析圖表

通過 VBA 自動化生成,可以實現定時導出、批量生成等功能。如果你覺得這篇技術分享有用,歡迎點贊收藏。需要完整示例代碼的朋友,可以在評論區留言交流。

user avatar
0 用戶, 點贊了這篇動態!

發表 評論

Some HTML is okay.