首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ironpython写入Excel

Ironpython写入Excel
EN

Stack Overflow用户
提问于 2017-12-15 16:59:24
回答 3查看 3K关注 0票数 3

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

到目前为止,我已经收集了压缩列表中的所有数据,并创建了一个枚举for循环,将数据写入相应的行和列,如下所示:

代码语言:javascript
复制
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。因此,我尝试了一种使用字典的不同方法。

代码语言:javascript
复制
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中,用10列填充大约800行大约需要20秒。我是否遗漏了一些IronPython功能,您可以将字典或列表写入到Excel行或列中?

我还考虑了安装3d派对模块。但这并不是一个真正的选择,因为RevitPythonShell使用的是IronPython 2.7.3,而且我无法让pip install正常工作。

提前谢谢。

是不是先在IronPython中写入csv,然后以某种方式将其导入到excel中会更快?

EN

回答 3

Stack Overflow用户

发布于 2017-12-18 18:03:02

这更像是一个关于.NET/Excel互操作的问题。我认为,基于this SO question,您应该能够将一个数组分配给一个范围。

也就是说,您当前的范围只有一个单元格。您可以尝试创建一个2d System.Array并将其分配给范围...我在这里尝试过:

代码语言:javascript
复制

将工作表导入为Excel excel = Excel.ApplicationClass() excel.Visible = True #使Excel应用程序对用户可见Microsoft.Office.Interop.Excel = excel.Workbooks.Add() worksheet = workbook.Worksheets.Add()

从系统导入数组xlrange = worksheet.Range"A1:c3“

对于范围( 3)中的行,a=Array.CreateInstance(对象,3,3)i=0:对于范围(3)中的列: arow,column =i i += 1

xlrange.Value2 =a `

这会产生如下结果:

有关IronPython和Excel的更多信息可以在这里找到:http://www.ironpython.info/index.php?title=Interacting_with_Excel

您可以尝试安装xlwt模块并使用它--避免COM互操作。

票数 2
EN

Stack Overflow用户

发布于 2017-12-21 17:37:48

它起作用了

代码语言:javascript
复制
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这样的3d party模块?我找不到任何文件。

票数 0
EN

Stack Overflow用户

发布于 2019-04-25 04:19:32

如果你指的是你可以在VB中使用的单元符号,我不知道为什么它不能工作,但你可以创建一个定义:

代码语言:javascript
复制
def Cells(a,b):
    return str(chr(a+96) + str(b))

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

代码语言:javascript
复制
x1range = ws.Range(Cells(1,1),Cells(5,10))

它的工作原理是一样的。这就是我要做的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47828892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档