【问题标题】:Ironpython write to ExcelIronpython 写入 Excel
【发布时间】:2018-05-29 11:02:37
【问题描述】:

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

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

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

这个方法已经快很多了。这需要大约 20 秒才能在 Excel 中用 10 列填充大约 800 行。我是否缺少一些 IronPython 功能,您可以将字典或列表写入 Excel 行或列?

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

提前致谢。

首先在 IronPython 中写入 csv 然后以某种方式将其导入到 excel 中可能更快吗?

【问题讨论】:

    标签: excel ironpython revitpythonshell


    【解决方案1】:

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

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

    ``` 导入 clr clr.AddReference("Microsoft.Office.Interop.Excel")

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

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

    a = Array.CreateInstance(object, 3, 3) 我 = 0 对于范围(3)中的行: 对于范围(3)中的列: a[行,列] = i i += 1

    xlrange.Value2 = a ```

    这会产生如下结果:

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

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

    【讨论】:

      【解决方案2】:

      有效

      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 派对模块?我找不到任何文档。

      【讨论】:

        【解决方案3】:

        如果您指的是可以在 VB 中使用的 Cells 表示法,我不知道为什么它不起作用,但您可以创建一个定义:

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

        现在你可以这样调用:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-14
          • 1970-01-01
          相关资源
          最近更新 更多