Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Plotly:如何在Excel中嵌入完全交互式Plotly图形?_Python_Excel_Vba_Plotly_Plotly Python - Fatal编程技术网

Python Plotly:如何在Excel中嵌入完全交互式Plotly图形?

Python Plotly:如何在Excel中嵌入完全交互式Plotly图形?,python,excel,vba,plotly,plotly-python,Python,Excel,Vba,Plotly,Plotly Python,我正在尝试将交互式plotly(或bokeh)绘图嵌入excel 为此,我尝试了以下三种方法: 将Microsoft Web浏览器用户表单嵌入excel,如下所示: 这可以工作并允许加载联机和脱机html 创建绘图html ''' 使用在excel中重新绘制webbrowser对象。导航到本地plotly.html。横幅上弹出 “…限制此文件显示可访问计算机的活动内容” 单击横幅,我遇到以下错误: 可以在浏览器中打开相同的HTML 有没有办法在excel中显示交互式绘图?交互式绘图需要jav

我正在尝试将交互式plotly(或bokeh)绘图嵌入excel

为此,我尝试了以下三种方法:

  • 将Microsoft Web浏览器用户表单嵌入excel,如下所示:
  • 这可以工作并允许加载联机和脱机html

  • 创建绘图html
  • '''

  • 使用
    在excel中重新绘制webbrowser对象。导航到本地plotly.html。横幅上弹出
  • “…限制此文件显示可访问计算机的活动内容”

    单击横幅,我遇到以下错误:

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


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

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


    在这个问题中已经解决了在excel中包含javascript的挑战:

    正如@jerlich所提到的,excel阻止javascript。如果你想要完全的交互性,你应该尝试他们链接的解决方法

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

    这些限制是:

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


    我喜欢你的问题!我希望我能给你一个更好的答案,但似乎你能实现任何远程类似于交互式plotly plot的东西的唯一方法是使用并遵循下面列出的步骤,包括这样的plot函数:

    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中释放一个完全交互式的绘图。如果这是一个选择,你应该仔细看看。这种方法使用了
    R
    ,不过…

    最后,在与微软和微软的讨论后,我成功地将交互式绘图带到了excel中

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

    计算机\HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\REGISTRY\MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\16.0\Common\COM兼容性{8856F961-340A-11D0-A96B-00C04FD705A2}

    将DWord 0更改为400

    现在,您可以将web浏览器对象插入excel,逐步详细信息如下所示

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

    最初从plotly生成的HTML文件如下所示

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

    正确,excel webbrowser将打开html,但在打开精心创建的“test1.html”时失败。但是,“test1.html”可以在浏览器(chrome、IE等)中打开。在IE中,需要启用ActiveX控件,但在其他情况下,它可以正常工作。当HTML试图使用JavaScript时,就会出现问题,您必须在Microsoft Excel中启用宏(和JS)!您可以共享plotly html文件吗?我想做一些测试。@QHarr要复制HTML,需要运行上面第2步“创建绘图HTML”中的代码,这将把HTML保存到定义的位置。下一步是加载到excel,此时出现上述错误,单击“是”会出现第二个错误“Plotly is undefined”Hi@jerlich,作为免责声明,我(还)不熟悉COM对象,查看了链接答案,但我不知道如何利用它解决此问题,请您概括一下要遵循的步骤好吗?我对pyxll感到困惑,Python中已经存在免费的COM互操作性。pyxll需要钱。完全互动的情节也在运作,检查这里我不同意XLL的建议。Python已经免费提供了COM互操作性。这听起来太棒了!但我无法让它在我这边发挥作用。我收到
    运行时错误438-对象不支持此属性或方法。
    我在Windows 10上以
    .xlsm
    文件运行它。你愿意分享更多关于你的设置的细节吗?@Vesland我也在win10中运行,我在这里保存了我的.xlsm文件->和用于在这里生成html的python代码->。如果你需要什么,尽管问。@Vignesh,这太棒了!非常感谢您,最简单的修复有时是最难的-我不知道您是如何发现的,但它是有效的!我试图重新激活/重新分配悬赏,但该选项对我来说没有出现。@vestlands,我正在运行Win10,Office2019@vestland我已经在这里的一个博客上发布了它,因为它是一个大故事。试试看,给我一个反馈
    <html>
    <head><meta charset="utf-8" /></head>
    <body>
    
    <html>
    <head>
        <meta charset="utf-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    </head>
    <body>
    
    Sub Button4_Click()
    ActiveSheet.WebBrowser1.Navigate "file:///C:/Users/vignesh.rajendran/Desktop/test5.html"
    End Sub