Dynamo处理Excel——调用Microsoft.Office.Interop.Excel教程

你好,这里是BIM的乐趣,我是九哥~

今天我们来聊聊如何通过Dynamo处理Excel数据以及格式,Dynamo自带的节点肯定是不行,所以我们需要来用Python解决(当然有个节点包

Bumblebee,我在案例百解教程里有过介绍),常用的处理Excel的python模块有很多,如xlrdxlwt,xlutilsopenpyxlXlsxWriter会Python的小伙伴自己去玩了哈,但是Dynamo目前主要是用IronPython(2.10+版本除外),所以我们可选的就没啥了,乖乖用Microsoft.Office.Interop.Excel就好了。

不了解这个的话,可以先关注下官方API网站:

Microsoft.Office.Interop.Excel Namespace | Microsoft Docs

#网址如下:

Microsoft.Office.Interop.Excel Namespace | Microsoft Learn

过多的我感觉也没啥可讲的,我把每行代码是在做什么,在Dynamo中来注释下,方便小伙伴们理解。好了,接下来先演示下基本用法:

一、读取Excel内容:

写个和Dynamo自带节点类似的:

import clr
import sys
import System
from System import Array
from System.Collections.Generic import *

#引入Microsoft.Office.Interop.Excel.dll模块
clr.AddReferenceByName('Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c')
from Microsoft.Office.Interop import Excel
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo("en-US")
from System.Runtime.InteropServices import Marshal

def fun(col_int):#数字转换成Excel列号
    list1=['A','B','C','D','E','F','G','H','I',
           'J','K','L','M','N','O','P','Q','R',
           'S','T','U','V','W','X','Y','Z']
    col_str=''
    if(col_int<=26):
        col_str=list1[col_int-1]
    elif(col_int < 702):
        col_int=col_int-27
        col_str=list1[int(col_int/26)]+list1[int(col_int%26)]
    elif(col_int==702):
        col_str='ZZ'
    else:
        col_int=col_int-703
        col_str=list1[int(col_int/676)]+list1[int(col_int/26)%26]+list1[col_int%26]
    return(col_str)

file = IN[0] 
#打开Excel应用程序
excel = Excel.ApplicationClass()
bool = IN[2] #Excel是否可见
excel.Visible = bool
wb = excel.Workbooks.Open(file)

#输入要打开的Excel工作表名称
sheetName = IN[1]
ws = wb.Worksheets[sheetName]
#获取Excel的总行数和列数
totalColumns = ws.UsedRange.Columns.Count
totalRows = ws.UsedRange.Rows.Count
x = (fun(totalColumns))

data = []
for i in range(totalRows): 
  x1range = ws.Range("A"+str(i+1),str(x)+str(i+1))   #读取某一行的内容
  r1 = x1range.Value2
  data.append(r1)
  i += 1
OUT = data

二、写入Excel内容

写个和Dynamo自带节点类似的:


import clr
import sys
import System
from System import Array
from System.Collections.Generic import *

#引入Microsoft.Office.Interop.Excel.dll模块
clr.AddReferenceByName('Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c')
from Microsoft.Office.Interop import Excel
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo("en-US")
from System.Runtime.InteropServices import Marshal

def fun(col_int):#数字转换成Excel列号
    list1=['A','B','C','D','E','F','G','H','I',
           'J','K','L','M','N','O','P','Q','R',
           'S','T','U','V','W','X','Y','Z']
    col_str=''
    if(col_int<=26):
        col_str=list1[col_int-1]
    elif(col_int < 702):
        col_int=col_int-27
        col_str=list1[int(col_int/26)]+list1[int(col_int%26)]
    elif(col_int==702):
        col_str='ZZ'
    else:
        col_int=col_int-703
        col_str=list1[int(col_int/676)]+list1[int(col_int/26)%26]+list1[col_int%26]
    return(col_str)

file = IN[0] #文件
sheetName = IN[1] #sheetName
#打开Excel软件
ExcelApp = Excel.ApplicationClass()
ExcelApp.Visible = True #Excel可见
#新建Excel表格
wb = ExcelApp.Workbooks.Add() #新建Excel文件
ws = wb.Worksheets.Add() #新建表格
ws.Name = sheetName #给表格命名
ws = wb.Worksheets[sheetName] #激活该表格,可省略

row = IN[2] #行
col = IN[3] #列
data = IN[4]  #数据

for d in data:
  x1 = row
  y1 = fun(col)
  for i in range(len(d)): 
    ws.Range[str(y1)+str(x1)].Value = d[i]#.ToString()  
    x1 += 1
  col += 1

#保存Excel文件到指定目录
wb.SaveAs(file)
OUT = "数据写入成功"

三、数字转换为Excel列号

这里简单写了一个自定义函数,来把输入的数字转换为Excel的列号,就是一顿数学计算,没啥好解释的,如下:


def fun(col_int):#数字转换成Excel列号
    list1=['A','B','C','D','E','F','G','H','I',
           'J','K','L','M','N','O','P','Q','R',
           'S','T','U','V','W','X','Y','Z']
    col_str=''
    if(col_int<=26):
        col_str=list1[col_int-1]
    elif(col_int < 702):
        col_int=col_int-27
        col_str=list1[int(col_int/26)]+list1[int(col_int%26)]
    elif(col_int==702):
        col_str='ZZ'
    else:
        col_int=col_int-703
        col_str=list1[int(col_int/676)]+list1[int(col_int/26)%26]+list1[col_int%26]
    return(col_str)

这个存下来吧,通用函数,很方便:


 

四、Excel格式的基本设置

(一)枚举一些基本的Excel格式设置的代码:


#ws为已经打开的Excel表格,以A1格位置为例:
#单个格写入内容
ws.Range["A1"].Value = "门窗表"   
#设置字号
ws.Range["A1"].Font.Size = 15
#设置文字加粗
ws.Range["A1"].Font.Bold = True
#合并单元格,A1到A3合并
ws.Range("A1:C1").MergeCells = True
#自动换行
ws.Range("A1").WrapText =  True
#自动列宽
ws.Range("A1").EntireColumn.AutoFit()
#文字居中
ws.Range("A1").HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
#设置字体为黑体
ws.Range("A1").Font.Name= "黑体"

(二)边框样式设置,API截图如下:

#设置表格边线样式,以黑实线为例:
#wb为当前打开Excel,ActiveSheet为当前激活的表格:
#rng为要设置边框的表格范围
#Excel.XlLineStyle.xlContinuous为实线
#范围的最底部边线
wb.ActiveSheet.Range(rng).Borders.Item(Excel.XlBordersIndex.xlEdgeBottom).LineStyle = Excel.XlLineStyle.xlContinuous
#范围的最左侧边线
wb.ActiveSheet.Range(rng).Borders.Item(Excel.XlBordersIndex.xlEdgeLeft).LineStyle = Excel.XlLineStyle.xlContinuous
#范围的最右侧边线
wb.ActiveSheet.Range(rng).Borders.Item(Excel.XlBordersIndex.xlEdgeRight).LineStyle = Excel.XlLineStyle.xlContinuous
#范围的最顶部边线
wb.ActiveSheet.Range(rng).Borders.Item(Excel.XlBordersIndex.xlEdgeTop).LineStyle = Excel.XlLineStyle.xlContinuous
#范围内的水平线
wb.ActiveSheet.Range(rng).Borders.Item(Excel.XlBordersIndex.xlInsideHorizontal).LineStyle = Excel.XlLineStyle.xlContinuous
#范围内的垂直线
wb.ActiveSheet.Range(rng).Borders.Item(Excel.XlBordersIndex.xlInsideVertical).LineStyle = Excel.XlLineStyle.xlContinuous

(三)设置颜色:


#设置填充颜色为淡紫色
ws.Range.Interior.ColorIndex = 39
#Excel字体颜色比较特殊,都是int表示的,需要转换一下,方法如下:
clr.AddReference("System.Drawing")
from System.Drawing import *
ws.Range["A1"].Font.Color = ColorTranslator.ToOle(Color.Orange)

色号如下图:

(四)单元格格式

#常规
ws.Range("A1").NumberFormatlocal = "G/通用格式"
#数值
#保留小数位数为3  (此处“_”表示:留下一个与下一个字符同等宽度的空格)
ws.Range("A1").NumberFormatlocal = "0.000" 
#不要小数
ws.Range("A1").NumberFormatlocal = "0"
#保留小数位数为3,并使用千位分隔符
ws.Range("A1").NumberFormatlo cal = "#,##0.000"
#货币
ws.Range("A1").NumberFormatlocal = "$#,##0.000"
#百分比
ws.Range("A1").NumberFormatlocal = "0.000%"
#分数
ws.Range("A1").NumberFormatlocal = "# ?/?"
#科学计数
ws.Range("A1").NumberFormatlocal = "0.00E+00"
#文本
ws.Range("A1").NumberFormatlocal = "@"
#特殊
#邮政编码
ws.Range("A1").NumberFormatlocal = "000000"
#中文小写数字
ws.Range("A1").NumberFormatlocal = "[DBNum1]G/通用格式"
#中文大写胡子
ws.Range("A1").NumberFormatlocal = "[DBNum2]G/通用格式"
#人民币大写
ws.Range("A1").NumberFormatlocal = "[DBNum2][$RMB]G/通用格式"

篇幅有限,今天就整理这些吧,有需求,多去翻翻官方API就行了~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/446099.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytorch实现分割模型TransUNet

TransUNet是一个非常经典的图像分割模型。该模型出现在Transformer引入图像领域的早期&#xff0c;所以结构比较简单&#xff0c;但是实际上效果却比很多后续花哨的模型更好。所以有必要捋一遍pytorch实现TransUNet的整体流程。 首先&#xff0c;按照惯例&#xff0c;先看一下…

Text Field文本输入框

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Text Field文本输入框 一、最基本的本文输入框1、基础示例2、一些表单属性3、验证 二、多行文本 一、最基本的本文输入框 1、基础示例 import {Box, TextField} from "…

Java开发:对象间复制属性,方法归纳

在Java开发中&#xff0c;对象间复制属性是一项常见的任务&#xff0c;特别是在处理层&#xff08;如控制器层&#xff09;与服务层或数据传输对象&#xff08;DTOs&#xff09;之间的数据转换时。有多种方法可以实现User对象到UserDTO对象的属性复制&#xff0c;下面列举了几种…

搭建Android Studio开发环境

一、JDK 1、下载 2、安装 双击进行安装&#xff0c;修改安装路径为&#xff1a;D:\Java\jdk-17.0.4.1即可&#xff0c;安装完成后目录如下&#xff1a; 配置环境变量 3、测试 WinR&#xff0c;输入cmd&#xff0c;按Enter后&#xff0c;键入&#xff1a;java --version&…

分布式执行引擎ray入门--(3)Ray Train

Ray Train中包含4个部分 Training function: 包含训练模型逻辑的函数 Worker: 用来跑训练的 Scaling configuration: 配置 Trainer: 协调以上三个部分 Ray TrainPyTorch 这一块比较建议直接去官网看diff&#xff0c;官网色块标注的比较清晰&#xff0c;非常直观。 impor…

C语言学习--练习4(二维数组)

目录 1.统计有序数组中的负数 2.矩阵对角线元素和 3.最富有客户的资产总量 4.托普利兹矩阵 5.矩阵中的幸运数 6.二进制矩阵中的特殊位置 7.岛屿的周长 1.统计有序数组中的负数 //直接遍历二维数组即可 int countNegatives(int** grid, int gridSize, int* gridColSize) …

大厂面试-好未来一面算法之求最长无重复子串长度

目录指引 大厂面试-好未来一面算法之求最长无重复子串长度本文学习目标或巩固的知识点 3. 无重复字符的最长子串&#x1f7e1;&#x1f7e2;通过题目可知题解结果验证 大厂面试-好未来一面算法之求最长无重复子串长度 本文学习目标或巩固的知识点 学习如何处理经典题目《最长…

Java 中的 File 类常用方法介绍

Java 中的 File 类是 java.io 包的一部分&#xff0c;它提供了丰富的文件操作方法。File 类可以用来表示文件和目录路径名的抽象表示形式&#xff0c;即它可以用来获取文件或目录的属性&#xff0c;也可以用来创建、删除、重命名文件和目录。下面是一些常用的 File 类方法&…

OSPF Router-ID 实验简述

如果要运行OSPF协议&#xff0c;必须存在Router ID。Router ID是一个32比特无符号整数&#xff0c;是一台路由器在自治系统中的唯一标识。 在实际网络部署中&#xff0c;建议手工配置OSPF的Router ID&#xff0c;因为这关系到协议的稳定。 如果不指定&#xff0c;启运OSPF进程后…

【Web开发】深度学习HTML(超详细,一篇就够了)

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Web开发】深度学习html(超详细,一篇就够了) &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 HTML1. HTML基础1.1 什么是HTML1.2 认识HTML标签1.3 HTML文件基本…

HTML使用

文章目录 一、简介二、HTML快速入门三、基础标签四、图片、音频、视频标签五、超链接标签六、列表标签七、表格标签八、布局标签九、表单标签十、表单向标签 一、简介 二、HTML快速入门 ​ <html><head><title>你好</title></head><body>再…

Springboot整合Mybaits启动过程

Springboot整合Mybaits启动过程 1.前言2.MybatisAutoConfiguration3.SqlSessionFactoryBean3.1 XMLConfigBuilder.parse()3.1.1 XMLMapperBuilder.parse()3.1.1.1 XMLStatementBuilder.parse() 4.SqlSession4.1 Executor 1.前言 直接加载mybatis配置文件&#xff0c;然后创建S…

代码训练LeetCode(7)删除有序数组中的重复项

代码训练(7)LeetCode之删除有序数组中的重复项 Author: Once Day Date: 2024年3月10日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09;力扣…

利用websocket +定时器简易的实现一个网络聊天室

其实原理非常简单,就是客户端用户通过websoket来连接websocket服务端。然后服务端,收集每个用户发出的消息, 进而将每条用户的消息通过广播的形式推送到每个连接到服务端的客户端。从而实现用户的实时聊天。 // TODO : 我主要是讲一下实现思路。并未完善其功能。 1.后端 依赖 …

2024年【电工(初级)】考试内容及电工(初级)考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 电工&#xff08;初级&#xff09;考试内容根据新电工&#xff08;初级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将电工&#xff08;初级&#xff09;模拟考试试题进行汇编&#xff0c;组成一套电…

线程的魔法:揭开现代操作系统并发执行的面纱

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

elasticsearch篇:RestClient操作

1. RestClient ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。官方文档地址&#xff1a;Elasticsearch Clients | Elastic 其中的Java Rest Client又包括两种&#xff1a; Java Low Level Res…

解读BOT攻击,探索灵活高效的防护之道

回顾早期的互联网应用&#xff0c;由于业务流量比较小&#xff0c;往往单台服务器就能满足负载需求。随着互联网的流量越来越大&#xff0c;单服务器已经不能满足业务需求&#xff0c;无论它优化得再好&#xff0c;都较难承受大量的访问压力。支持负载均衡的技术很多&#xff0…

openssl3.2 - exp - 选择最好的内建椭圆曲线

文章目录 openssl3.2 - exp - 选择最好的内建椭圆曲线概述笔记将 openssl ecparam -list_curves 实现迁移到自己的demo工程备注END openssl3.2 - exp - 选择最好的内建椭圆曲线 概述 在openssl中使用椭圆曲线, 只允许选择椭圆曲线的名字, 无法给定椭圆曲线的位数. 估计每种椭…

扩展学习|系统理解数字经济

文献来源&#xff1a;[1]肖静华,胡杨颂,吴瑶.成长品&#xff1a;数据驱动的企业与用户互动创新案例研究[J].管理世界,2020,36(03):183-205.DOI:10.19744/j.cnki.11-1235/f.2020.0041. [2]陈晓红,李杨扬,宋丽洁等.数字经济理论体系与研究展望[J].管理世界,2022,38(02):208-22413…