【问题标题】:Plotly: How to embed a fully interactive Plotly figure in Excel?Plotly:如何在 Excel 中嵌入完全交互式的 Plotly 图形?
【发布时间】:2021-03-24 02:41:29
【问题描述】:

我正在尝试将交互式绘图(或散景)嵌入到 excel 中。

为此,我尝试了以下三件事:

  1. 将 Microsoft Web 浏览器用户表单嵌入到 excel 中,如下:

How do I embed a browser in an Excel VBA form?

这样可以同时加载在线和离线 html

  1. 创建一个有情节的 html

'''

import plotly
import plotly.graph_objects as go


x = [0.1, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0]
y = [i**2 for i in x]

fig = go.Figure()

fig.add_trace(go.Scatter(x=x, y=x, mode='markers', name="y=x", marker=dict(color='royalblue', size=8)))
fig.add_trace(go.Scatter(x=x, y=y, name="y=x^2", line=dict(width=3)))

plotly.offline.plot(fig, filename='C:/Users/.../pythonProject/test1.html')
  1. 使用.Navigate 将excel 中的webbrowser 对象重新指向本地plotly.html。横幅弹出

“....限制此文件显示可以访问您计算机的活动内容”

点击横幅,我遇到了这个错误:

同样的 HTML 可以在浏览器中打开。

有没有办法在 excel 中显示交互式绘图?

【问题讨论】:

  • 正确,excel webbrowser 将打开 html,但在打开 plotly 创建的“test1.html”时失败。但是,“test1.html”可以在浏览器(chrome、IE 等)中打开。在 IE 中需要启用 ActiveX 控件,否则它可以正常工作。
  • HTML尝试使用JavaScript时出现问题cdn.bokeh.org/bokeh/release/bokeh-2.2.3.min.js
  • 您必须在 Microsoft Excel 中启用宏(和 JS)!
  • 你能分享plotly html文件吗?我想做一些测试。
  • @QHarr 复制 HTML 需要运行上面第 2 步“创建绘图 html”中的代码,这会将 HTML 保存到定义的位置。接下来是加载到excel中,此时出现上面的错误,点击“yes”会出现第二个错误“Plotly is undefined”

标签: python excel vba plotly plotly-python


【解决方案1】:

最后,经过微软QnA 和Web Browser Control & Specifying the IE Version 的讨论,我设法将交互式情节带到了Excel 中

要将 Microsoft 网页插入 Excel,您必须在注册表编辑器中更改兼容性标志

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\Software\Wow6432Node\Microsoft\Office\16.0\Common\COM 兼容性{8856F961-340A-11D0-A96B-00C04FD705A2}

将 DWord 0 改为 400

现在您可以将网络浏览器对象插入到 excel 中,详细步骤为 here

通过添加使用 X-UA 兼容的 HTML 元标记的标记手动编辑从 plotly 生成的 HTML 文件

最初从 plotly 生成的 HTML 文件看起来像这样

<html>
<head><meta charset="utf-8" /></head>
<body>

修改后的 HTML 兼容浏览器

<html>
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
</head>
<body>

在此之后,我可以在 excel 中查看交互式绘图,也可以进行与 Web 浏览器相同的交互

使用的宏:

Sub Button4_Click()
ActiveSheet.WebBrowser1.Navigate "file:///C:/Users/vignesh.rajendran/Desktop/test5.html"
End Sub

【讨论】:

  • 这听起来很棒!但我无法让它最终发挥作用。我收到了Run Time Error 438 - Object doesn't support this property or method. 我在 Windows 10 上的 .xlsm 文件中运行它。您愿意分享有关您的设置的更多详细信息吗?
  • @vestland 我也在 win10 中运行,我将 .xlsm 文件保存在这里 -> gofile.io/d/XaPTSl 和用于生成 html 的 python 代码 -> gofile.io/d/Jvj3nd。如果您有任何需要,请随时提出。
  • @Vignesh,这太棒了!非常感谢,最简单的修复有时是最难的——我不知道你是怎么发现的,但它确实有效!我尝试重新激活/重新分配赏金,但该选项未显示给我。
  • @vestlands,我正在运行 Win10,Office 2019
  • @vestland 我已将它发布在博客vikebot.blogspot.com/2021/01/… 中,因为它是在这里发布的一个大故事。试试看并给我反馈
【解决方案2】:

我喜欢你的问题!我希望我能给你一个更好的答案,但似乎你可以远程实现任何类似于交互式绘图的唯一方法是使用 pyxll 并按照Charts and plotting / Plotly 下概述的步骤,包括绘图功能像这样:

from pyxll import xl_func, plot
import plotly.express as px

@xl_func
def plotly_plot():
    # Get some sample data from plotly.express
    df = px.data.gapminder()

    # Create a scatter plot figure
    fig = px.scatter(df.query("year==2007"),
                     x="gdpPercap", y="lifeExp",
                     size="pop", color="continent",
                     log_x=True, size_max=60)

    # Show the figure in Excel using pyxll.plot
    plot(fig)

这将产生以下情节:

唉,这不会是一个像我们都知道和喜爱的完全互动的情节情节,因为它也在同一页面上声明:

您在 Excel 中看到的绘图被导出为图像,因此任何 交互元素将不可用。做一个半交互式的 你可以在函数中添加参数来控制绘图的方式 完成,当这些参数改变时,情节将被重绘。

但据我所知,这与您在问题中寻求的目标一样接近。如果您不限于 Excel,而是以某种方式受限于 Microsoft 领域,那么其中一位评论者提到您可以在 PowerBI 中释放完全交互式的情节图。如果这是一个选项,您应该仔细查看Is it possible to use R Plotly library in R Script Visual of Power BI?。这种方法虽然使用R...

【讨论】:

  • 我对 pyxll 感到困惑,Python 中已经免费提供了 COM 互操作性。 pyxll 需要钱。
  • 完全互动的情节也在工作中,检查这里stackoverflow.com/a/65678371/10849457
【解决方案3】:

正如@jerlich 所述,Excel 会阻止 javascript。如果您想要完全的交互性,您应该尝试他们链接的解决方法。

如果您至少想要某种程度的可控性或交互性,请尝试使用xlwings。使用excel按钮,你仍然可以在Excel和Python之间进行一些通信(包括读取数据和发送图表)。

限制是:

  • 只能使用数据条目和按钮,而不是默认的绘图交互功能。许多可以复制,但工作量更大。
  • 它只能在您可以设置 python 脚本的计算机上运行(但是,看起来 xlwings pro 允许您将程序存储在文件中)
  • 看来您需要通过保存然后添加图形来传递绘图图,因为直接传递它们需要 xlwings pro。 MatPlotLib 可以在没有专业人士的情况下直接通过。

Plotly guide to making interactive(ish) graphs

xlwings docs on MatPlotLib and Plotly graphs

【讨论】:

  • 我不同意 xlwings 的建议。 Python 已经免费提供 COM 互操作性。
【解决方案4】:

交互式绘图需要 javascript 才能工作。出于安全原因,Excel 会阻止该 javascript。您可以轻松地将静态图像放入 excel 中。

在这个问题中解决了在 excel 中包含 javascript 的挑战:How can I use JavaScript within an Excel macro?

【讨论】:

  • 嗨@jerlich,作为免责声明,我(还)不熟悉COM对象,查看了链接的答案,但我不知道如何利用它来解决这个问题,请您概述一下步骤跟随?
猜你喜欢
  • 2022-09-24
  • 2018-11-05
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 2017-09-25
  • 2021-02-25
  • 2021-10-19
  • 2021-10-24
相关资源
最近更新 更多