Формула xlsxwriter с использованием python переменных и динамических c ссылок на ячейки - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь создать пакет файлов xls для подачи в симуляцию Монте-Карло. Я использую xlsxwriter, но я хочу, чтобы в моем четвертом столбце использовались переменные python и ссылки на ячейки из листа. Есть идеи, как я могу это сделать? Например, моя формула в четвертом столбце была бы намного проще, если бы я мог использовать сохраненную python версию, но вместо этого я жестко закодировал ее все.

В формуле четвертого столбца вместо 5 я хочу вставить случайную величину t, которую я уже вычислил в python

import numpy as np 
import xlsxwriter

#travel time as uniform (days)
low=4
high=8
t=np.random.uniform(low,high,size=1)


# Create an new Excel file and add a worksheet.
workbook = xlsxwriter.Workbook('demo.xls')
worksheet = workbook.add_worksheet()

# Widen the first column to make the text clearer.
worksheet.set_column('A:A', 20)

# Write headers
#First column
worksheet.write('A1', 'DAYD')
#days = range(1,13)
worksheet.write_column('A2', range(1,13))
worksheet.write_column('A14', range(1,13))
worksheet.write_column('A26', range(1,13))
worksheet.write_column('A38', range(1,13))
worksheet.write_column('A50', range(1,16))


#Second Column
#crop=['TA' for i in range(64)]
worksheet.write('B1', 'CROP')
worksheet.write_column('B2', ('TA' for i in range(63)))

#Third Column
worksheet.write('C1', 'QUAL')
worksheet.write_column('C2', ([2]*12))
worksheet.write_column('C14', ([3]*12))
worksheet.write_column('C26', ([4]*12))
worksheet.write_column('C38', ([5]*12))
worksheet.write_column('C50', ([1]*15))

#fourth Column
worksheet.write('D1', 'COL')
worksheet.write_array_formula('D2:D64', '{=42 +((124-42)/(1+((EXP(**(5)***A2:A64*(124-42)))*(124-(16.949*EXP((-0.025)*C2:C64))/((16.949*EXP((-0.025)*C2:C64)-42)))))}')

workbook.close()

1 Ответ

0 голосов
/ 03 марта 2020

Используйте синтаксис форматирования строки, чтобы добавить переменную в строку, которую вы пишете.

Например, предположим, t - это случайная переменная, которую вы хотите добавить, и это число с плавающей точкой:

formula_string = '{=42 +((124-42)/(1+((EXP(%f*A2:A64*(124-42)))*(124-(16.949*EXP((-0.025)*C2:C64))/((16.949*EXP((-0.025)*C2:C64)-42)))))}' % t

worksheet.write_array_formula('D2:D64', formula_string)

См. Также Форматирование строки в python 2.7

Если вы хотите, чтобы в каждой ячейке была другая случайная величина, вы можете сделать

for i in range(2,65):
    t = np.random.uniform(low,high,size=1)
    formula_string = '{=42 +((124-42)/(1+((EXP(%f*A2:A64*(124-42)))*(124-(16.949*EXP((-0.025)*C2:C64))/((16.949*EXP((-0.025)*C2:C64)-42)))))}' % t
    location = 'D%d' % i
    worksheet.write_array_formula(location, formula_string)
...