使用IronPython写入Excel

4

我正尝试使用RevitPythonShell将数据从Revit写入Excel。

到目前为止,我已经将所有数据收集到一个压缩列表中,并使用枚举循环将数据按如下方式写入相应的行和列:

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。一个包含大约800个墙的Revit模型需要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

这种方法已经快很多了。在Excel中,大约需要20秒钟来填充大约800行带有10列的内容。我是否错过了一些IronPython功能,可以将字典或列表写入Excel行或列?
我还尝试安装第三方模块。但这不是一个真正的选择,因为RevitPythonShell使用的是IronPython 2.7.3,我无法让pip install工作。
提前感谢您的帮助。
也许在IronPython中先写入CSV,然后以某种方式将其导入Excel会更快?
3个回答

2
这更像是一个关于.NET/Excel互操作的问题。我认为,根据这个SO问题,你应该能够将数组分配给一个范围。
也就是说,你当前的范围只是一个单元格。你可以尝试创建一个二维的System.Array并将其分配给范围...我在这里尝试了一下:
``` import clr clr.AddReference("Microsoft.Office.Interop.Excel")
import Microsoft.Office.Interop.Excel as Excel excel = Excel.ApplicationClass() excel.Visible = True # makes the Excel application visible to the user workbook = excel.Workbooks.Add() worksheet = workbook.Worksheets.Add()
from System import Array xlrange = worksheet.Range["A1:c3"]
a = Array.CreateInstance(object, 3, 3) i = 0 for row in range(3): for column in range(3): a[row, column] = i i += 1
xlrange.Value2 = a ```
这会产生一个类似于这样的结果: Excel范围截图 有关IronPython和Excel的更多信息,请参见此处:http://www.ironpython.info/index.php?title=Interacting_with_Excel 你可以尝试安装xlwt模块并使用它-避免COM互操作。

0

它运行正常

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

是否可以在RevitPythonShell中安装像xlwt这样的第三方模块?我找不到任何文档。


0

如果您正在引用VB中可以使用的单元格符号,我不知道为什么它不起作用,但您可以创建一个定义:

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

现在你可以调用类似这样的东西:

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

它将会以同样的方式工作。这就是我所做的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接