Ironpython напишите в Excel

55
5

Я пытаюсь записать данные из Revit в Excel с помощью RevitPythonShell.

До сих пор я собрал все данные в zip-списке и сделал перечислимый цикл для записи данных в соответствующие строки и столбцы следующим образом:

for index, data in enumerate(wall_zipped_list):
for count, parameters in enumerate(data):
wall_cell = worksheet_wanden.Range[(str(column_list[count]))+str(index+5)]
wall_cell.Value2 = data[count]

Это невероятно медленно, потому что цикл вызывает Value2 каждый раз. Модель Revit, содержащая около 800 стен, занимает 2 минуты, чтобы написать в Excel. Поэтому я попробовал другой метод, используя словарь.

for k , v in data_dict.iteritems():
#print k, v[0]
worksheet_wanden.Range["A"+str(count)].Value2 = k
worksheet_wanden.Range["B"+str(count)].Value2 = v[0]
worksheet_wanden.Range["C"+str(count)].Value2 = v[1]
worksheet_wanden.Range["D"+str(count)].Value2 = v[2]
worksheet_wanden.Range["E"+str(count)].Value2 = v[3]
worksheet_wanden.Range["F"+str(count)].Value2 = v[4]
worksheet_wanden.Range["G"+str(count)].Value2 = v[5]
worksheet_wanden.Range["H"+str(count)].Value2 = v[6]
worksheet_wanden.Range["I"+str(count)].Value2 = v[7]
worksheet_wanden.Range["J"+str(count)].Value2 = v[8]
worksheet_wanden.Range["K"+str(count)].Value2 = v[9]
count += 1

Этот метод уже намного быстрее. Это займет около 20 секунд, чтобы заполнить около 800 строк с 10 столбцами в Excel. Мне не хватает некоторых функций IronPython, которые вы можете записать в словарь или списки в строки или столбцы Excel?

Я также посмотрел на установку 3d-модулей. Но это не вариант, так как RevitPythonShell использует IronPython 2.7.3, и я не могу заставить pip install работать.

Заранее спасибо.

Может быть, быстрее написать csv сначала в IronPython, а затем импортировать его каким-то образом в excel?

спросил(а) 2017-12-15T11:59:00+03:00 2 года, 7 месяцев назад
1
Решение
67

Это больше вопрос о взаимодействии.NET/Excel. Я думаю, на основе этого вопроса SO вы должны иметь возможность назначить массив диапазону.

То есть ваш текущий диапазон - всего одна ячейка. Вы можете попробовать создать 2d System.Array и назначить его диапазону... Я попробовал это здесь:

'' 'import clr clr.AddReference("Microsoft.Office.Interop.Excel")

import Microsoft.Office.Interop.Excel как Excel excel = Excel.ApplicationClass() excel.Visible = True # делает приложение Excel видимым для рабочей книги пользователя = excel.Workbooks.Add() workheet = workbook.Worksheets.Add()

из System import Array xlrange = рабочий лист.Range ["A1: c3"]

a = Array.CreateInstance (объект, 3, 3) я = 0 для строки в диапазоне (3): для столбца в диапазоне (3): a [строка, столбец] = я i + = 1

xlrange.Value2 = a '' '

Это приводит к следующему:

Screenshot of the Excel Range

Более подробную информацию о IronPython и Excel можно найти здесь: http://www.ironpython.info/index.php?title=Interacting_with_Excel

Вы можете попробовать установить модуль xlwt и использовать это - избегая взаимодействия с COM.

ответил(а) 2017-12-18T13:03:00+03:00 2 года, 6 месяцев назад
39

Если вы имеете в виду нотацию Cells, которую вы можете использовать в VB, я не знаю, почему она не работает, но вы можете создать определение:

def Cells(a,b):
return str(chr(a+96) + str(b))

Теперь вы можете назвать что-то вроде:


x1range = ws.Range(Cells(1,1),Cells(5,10))

и это будет работать так же. Это то, что я делаю.

ответил(а) 2019-04-24T23:19:00+03:00 1 год, 2 месяца назад
40

Оно работает

i = 0 

xlrange_revit_type = worksheet_data.Range["C2:C" + str(len(revit_type_list)+1)]
a = Array.CreateInstance(object,len(revit_type_list), 3)

while i < len(revit_type_list):
a[i,0] = revit_type_list[i]
i += 1

xlrange_revit_type.Value2 = a

Возможно ли установить модуль 3d party, такой как xlwt для RevitPythonShell? Я не могу найти документацию.

ответил(а) 2017-12-21T12:37:00+03:00 2 года, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема