Перенос введенных пользователем данных из рабочего листа Excel в скрипт Python

Я пишу сценарий, и я хотел бы иметь возможность взаимодействовать с MS Excel. После запуска сценария я хотел бы открыть рабочий лист Excel, чтобы пользователь ввел некоторые данные, выполнил некоторые основные расчеты в Excel, а затем вернул вычисленные данные и некоторые данные, введенные пользователем, в сценарий.

Я делаю это, потому что я хотел бы позволить пользователю вводить все данные сразу и не отвечать на запрос за запросом, а также потому, что я новичок в Python и даже не близко к тому, чтобы написать графический интерфейс.

Вот пример того, что я пытаюсь сделать:

Таблица 1 (диапазон1 на листе Excel):

Пользователь вводит дробь и данные 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 (диапазон2 на том же листе Excel)

Пользователь вводит все данные и все возвращается в скрипт для дальнейших расчетов:

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

Как только данные вводятся в Excel и передаются в сценарий, я завершаю сценарий.

Как мне это сделать? Excel кажется самым простым способом настроить данные записи таблицы, но если есть другой способ, сообщите мне. Если это Excel, как мне это сделать?


person user3720101    schedule 22.06.2014    source источник
comment
Должен ли он быть интерактивным, т. Е. Сценарий делает что-то, а затем превосходит, скрипт делает больше? Или достаточно, чтобы скрипт прочитал файл excel в качестве входных данных?   -  person chrisb    schedule 22.06.2014
comment
Просто немного интерактива. Запустите сценарий и прочитайте несколько строк, откройте Excel и разрешите пользователю вводить данные, отправьте данные обратно в сценарий. Пользователь может захотеть пересмотреть введенные данные Excel и запустить его повторно. Другой вариант может заключаться в том, что пользователь может открыть рабочий лист Excel, ввести данные, а затем позволить Excel открыть сценарий и прочитать данные. Я не заперт в Excel, если есть лучший способ. Но я не думаю, что уже близок к тому, чтобы разработать графический интерфейс на Python.   -  person user3720101    schedule 22.06.2014


Ответы (3)


Вот потенциальный подход с использованием 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
################
person chrisb    schedule 22.06.2014
comment
Я получаю следующую ошибку: WindowsError: [Ошибка 5] Отказано в доступе Есть идеи, как это исправить? - person user3720101; 24.06.2014
comment
На какой линии? Убедитесь, что input_file — это путь, к которому у вас есть доступ для записи. - person chrisb; 24.06.2014

У вас есть много вариантов.

Возможно, вам следует изучить 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-элементов, а затем можете получить к ним доступ из javascript.

Вы также можете иметь javascript в отдельном файле .js.

Тогда вам просто нужно сослаться на него внутри тега скрипта.

<script src='yourScript.js'></script>
person el3ien    schedule 22.06.2014
comment
Не могли бы вы прокомментировать идею HTML. Хорошо, я мог легко преобразовать входную таблицу в HTML. Единственные вычисления, которые я делаю в Excel, заключаются в окончательном составе смеси. Доля смеси — это просто сумма отдельных фракций. И значения смеси xa :aa представляют собой просто среднее значение смесей xa[1]*fraction[1] +xa[2]*fraction[2] ... и т.д. Как вызвать HTML из моего скрипта? Куда вставить HTML? Как я могу ссылаться на входные переменные в моем скрипте? Где живет расчет JScript? - person user3720101; 22.06.2014
comment
Я обновил ответ. Если вы скопируете последний код в текстовый документ, сохраните его как html, откройте в хроме. Тогда вы можете возиться с ним. Javascript находится внутри тегов script. HTML-элементы внутри HTML-тегов. Вы получаете доступ к ним, давая им идентификаторы. - person el3ien; 22.06.2014
comment
Вставьте HTML внутри основного или что? if name == 'main': когда я это делаю, я получаю недопустимый синтаксис. Нужно ли мне что-то импортировать? Я использовал TABLEIZER для создания HTML-кода для таблицы, но не знаю, что делать дальше. - person user3720101; 22.06.2014
comment
это не питон. Просто HTML. вставьте его в документ, сохраните как html. И откройте его в хроме как веб-страницу. - person el3ien; 23.06.2014
comment
После открытия в Chrome, где взаимодействие с Python? Как мне отправить результат вычислений в мой скрипт? Какая здесь последовательность? Откройте Chrome, запустите calcs, затем пользователь зайдет и откроет файл .py, а затем каким-то образом данные будут переданы? Идеально было бы запустить скрипт, скрипт открывает хром, пользователь вводит данные, данные возвращаются обратно в скрипт и скрипт продолжается. - person user3720101; 23.06.2014
comment
Там нет питона. только джаваскрипт. Вы делаете все вычисления в javaScript с этим примером. Если вы хотите отправить данные на python, вам следует изучить модуль python под названием Flask. - person el3ien; 23.06.2014

Взгляните на xlwings, библиотеку, которую я написал, чтобы делать именно то, что вам нужно.

person Felix Zumstein    schedule 30.06.2014