【问题标题】:Transferring user entered data from an Excel worksheet to a Python Script将用户输入的数据从 Excel 工作表传输到 Python 脚本
【发布时间】:2014-06-22 17:49:05
【问题描述】:

我正在编写一个脚本,我希望能够与 MS Excel 进行交互。运行脚本后,我想打开一个 excel 工作表,让用户输入一些数据,在 excel 中进行一些基本计算,然后将计算的数据和一些用户输入的数据返回给脚本。

我这样做是因为我希望允许用户一次输入所有数据,而不必在提示后回答提示,还因为我是 Python 新手,甚至无法编写一个图形用户界面。

这是我正在尝试做的一个示例:

表 1(Excel 工作表中的 range1):

用户输入分数和 xa:aa 数据,excel 计算混合。 xa:aa 上的混合信息返回到我的 python 脚本中,在我的脚本中用于进一步计算。数据输入表实际上更长(更多的数据输入行),但只是显示了足够的子集来让我对我正在尝试做的事情有所了解:

Stream       1   2    3  4  5   Blend
Fraction    10% 60% 20% 10       100%
xa          100 150 175 57       135.0
yg          30.7 22 18  12.2     25.6
aa          210 425 375 307      352.2

表 2(同一个 Excel 工作表中的 range2)

用户输入所有数据,所有数据都返回到脚本进行进一步计算:

        Min Max Incr            
temp    45  60  5           
press   7.2 7.8 0.2         
cf      1   5   1           

一旦将数据输入到 excel 中并传输到脚本中,我就完成了脚本。

我该怎么做呢? Excel 似乎是设置表格条目数据的最简单方法,但如果有其他方法,请告诉我。如果是 Excel,我该怎么做?

【问题讨论】:

  • 是否需要交互,即脚本做事,然后excel,脚本做更多的事情?或者脚本读取一个excel文件作为输入就足够了吗?
  • 只是有点互动。启动脚本并阅读几行,打开 Excel 并允许用户输入数据,将数据发送回脚本。用户可能想要修改输入的 Excel 数据并重新运行。另一个选项可能是用户打开 Excel 工作表,输入数据,然后让 Excel 打开脚本并读取数据。如果有更好的方法,我不会被锁定在 Excel 中。但我认为我还没有准备好用 Python 开发 GUI。

标签: python excel pandas


【解决方案1】:

这是一种使用 pandas 的潜在方法。如果输入文件不存在,它会写入一个虚拟文件(修改它以适应),然后打开 excel 文件,并在用户关闭后读回数据框。将 excel_path 替换为您的 Excel 安装路径(我在这里使用 LibreOffice)。

import os
import subprocess

import pandas as pd

input_file = 'input.xlsx'
excel_path = 'soffice'

#############
# setup stuff
#############

if not os.path.isfile(input_file):
    input_template = pd.DataFrame(columns=['1','2','3','4'])
    # any additional code to set up space for user to input values

    input_template.to_excel(input_file)
else:

# call excel and open the input file
subprocess.call([excel_path, input_file])

# read modified input into DataFrame
excel_input = pd.read_excel(input_file)

################
# body of script
################

【讨论】:

  • 我收到以下错误:WindowsError: [错误 5] 访问被拒绝知道如何解决这个问题吗?
  • 在哪一行?确保input_file 是您具有写入权限的路径。
【解决方案2】:

你有很多选择。

也许您应该研究 VBA,这样您就可以在 excel 文档中制作脚本。

你也可以开始学习Tkinter,所以你马上用python制作界面。

我个人会用 HTML 来做。这样您就可以轻松地创建一个带有输入的接口,并让 javascript 进行计算。

但回到 Python 和 EXCEL。

您可以将文档保存为 csv 分号分隔。

import os
with open('yourcsv.csv','r') as f:
    contents = f.read().splitlines()

values = []

for row in range(0,len(contents),1): 
    values += contents[row].split(';')

现在,您的表位于多维列表中。 做一些计算。

现在您需要将结果附加为 ;分隔字符串到 csv 文件,带有某种 for 循环

file = open('yourcsv.csv','a')
file.write(results)
file.close()

如果您想尝试使用 HTML 和 javascript,它看起来像这样。

<!DOCTYPE html>
<html>
    <head>
    <title>Optional</title>
    <meta charset='UTF-8'>
    <script>
        function calc(){
            var val1 = parseFloat(document.getElementById('value1').value);
            var val2 = parseFloat(document.getElementById('value2').value);
            var res = val1+val2;
            var resDiv = document.getElementById('result');
            resDiv.innerHTML = parseFloat(res,2);
        }
    </script>
    </head>
    <body>
        <input type='text' id='value1'>
        <input type='text' id='value2'>
        <br>
        <button onClick='calc()'>Calculate</Button>
        <br>
        <div id='result'></div>
    </body>
</html>

JsFiddle

所以你给了 html 元素的 id,然后你可以从 javascript 中访问它们。

您还可以在单​​独的 .js 文件中包含 javascript。

那么你只需要在脚本标签里面引用它。

<script src='yourScript.js'></script>

【讨论】:

  • 您是否介意进一步评论 HTML 想法。好的,我可以轻松地将输入表转换为 HTML。我在 Excel 中所做的唯一计算是得出最终的混合成分。混合分数只是各个分数的总和。而 xa :aa 混合值只是混合 xa[1]*fraction[1] +xa[2]*fraction[2] ...等的平均值。如何从我的脚本中调用 HTML?我在哪里粘贴 HTML ?如何在我的脚本中引用输入变量? JScript calc 在哪里运行?
  • 我更新了答案。如果将最新的代码复制到文本文档中,将其另存为 html,用 chrome 打开。然后你可以摆弄它。 Javascript 在脚本标签中。 html标签内的html元素。你通过给他们 id 来访问他们。
  • 将 HTML 粘贴到 main 中还是什么? if name == 'main': 当我这样做时,我得到一个无效的语法。我需要进口什么吗?我使用 TABLEIZER 为表格创建 HTML 代码,但不知道下一步该做什么。
  • 这不是 python。只是 HTML。将其粘贴到文档中,将其保存为 html。并在 chrome 中将其作为网页打开。
  • 一旦在 Chrome 中打开,与 Python 的交互在哪里?如何将计算结果发送到我的脚本?这里的顺序是什么?打开 Chrome,运行 calcs,然后用户打开 .py 文件,然后以某种方式传输数据?理想的情况是运行脚本,脚本打开 chrome,用户输入数据,数据流回脚本,脚本继续。
【解决方案3】:

看看xlwings,我写的一个库完全可以满足你的需求。

【讨论】:

    猜你喜欢
    • 2023-01-10
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2019-03-30
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多