自动化办公从EXCEL VBA转PYTHON xlwings自用代码对比实现

您所在的位置:网站首页 xlsx引用公式 自动化办公从EXCEL VBA转PYTHON xlwings自用代码对比实现

自动化办公从EXCEL VBA转PYTHON xlwings自用代码对比实现

2023-06-25 04:09| 来源: 网络整理| 查看: 265

#一、**VBA实现:**取消EXCEL横向合并单元格并使数据左对齐

'取消指定列如“A”列的合并单元格并设置为不换行左对齐格式 Sub XMerge() For i = 1 To Range("A65536").End(xlUp).Row + 1 '取A列数据的最大行数 If Range("A" & i).MergeCells = True Then '如果单元格为合并单元格 With Range("A" & i) .HorizontalAlignment = xlLeft '设置单元格左对齐 .WrapText = False '取消自动换行 .MergeArea.MergeCells = False '取消合并单元格 End With End If Next End Sub

#二、**PYTHON xlwings实现:**取消EXCEL横向合并单元格并使数据左对齐

import xlwings as xw #导入xlwings模块用于操作EXCEL,结合VBA代码(.api) app = xw.apps.active #当前活动app(EXCEL) wb = app.books.active #当前活动工作薄,方法2:打开指定工作簿xw.Book(r'D:\PY\test.xlsx') ws = wb.sheets.active #当前活动工作表,方法2:wb.sheets[0],即sheet1 nrows = ws.used_range.last_cell.row #可以正确获取总行数!***! #print(nrows) #测试点 for i in range(1,nrows): if ws.range(i,1).api.MergeCells: #合并单元格为真 ws.range(i,1).unmerge() #取消合并单元格 ws.range(i,1).api.HorizontalAlignment = -4131 #设置单元格左对齐 ws.range(i,1).api.WrapText = False #取消自动换行 ws.range(i,1).rows.autofit() #自适应,注意加括号 ws.range(i,1).api.Font.Bold = True #字体加粗

#三、**VBA实现:**取消EXCEL第1列合并单元格并合并第3列分行数据到一个单元格(填充指定列数据)

Sub HRow() 'For i = 1 To Range("A65536").End(xlDown).Row '取A列最大行数,2的20次方=1048576 Dim a(), i%, n% '定义动态数组a(),%:整数型变量(Integer),&:长整型变量(Long),$:字符串变量(String) n = Range("A65536").End(xlUp).Row + 1 '相同结果:n = Mid(UsedRange.Address, 9) 或者UsedRange.Rows.Count For i = 1 To n '取A列n行数,并从1到n循环 If Range("A" & i).MergeCells = True Then '如果单元格为合并单元格 x = Range("A" & i).MergeArea.Rows.Count - 1 '取X等于合并单元格的总行数-1,数组下标从0起所以要减1 If x > 0 Then '多行合并单元格才进行处理 ReDim a(x) '用X重定义数组大小 For j = Range("A" & i).MergeArea.Rows.Count To 1 Step -1 '取j循环计数,从合并单元格总行数逐1递减 a(j - 1) = Range("C" & (j + i - 1)) '属于A合并项的C列每行单元格数据逐项赋值对应数组成员,+i-1考虑从第二项合并单元格起的C列行数 If j > 1 Then 'j=1时为当前行不应删除 Rows(j + i - 1).Delete shift:=xlUp '保留原合并单元格对应的第一行,其余行删除 End If Next '完成所有合并单元格对应C列所有行单元格数据的数组赋值 Cells(i, 3) = Join(a, Chr(10)) '用Join函数即可以完成数组中元数值的连接 'For k = 1 To UBound(a) '从数组中循环取所有值 'Cells(i, 3) = Cells(i, 3) & Chr(10) & a(k) '将数组中的所有值连接并写入当前合并单元格对应第一行C列单元格 'Next '完成所有数组值写入单元格 End If End If '完成一个合并项的数据处理 Next '处理下一个合并项数据 End Sub

#四、**PYTHON xlwings实现:**取消EXCEL第1列合并单元格并合并第3列分行数据到一个单元格(填充指定列数据)

#这个程序是为了从WORD复制表格到EXCLE后整理数据,最后表格再放回WORD :) #在EXCEL中表格的特征是第1列有合并列(第1列是序号,第2列是名称),对应第3列是分行的数据 #要做的是:取消第1列合并,把第3列的数据并到1个单元格中,第2列会跟随第1列 import xlwings as xw #导入xlwings模块用于操作EXCEL,结合VBA代码(.api) app = xw.apps.active #当前活动app(EXCEL) wb = app.books.active #当前活动工作薄,方法2:打开指定工作簿xw.Book(r'D:\PY\test.xlsx') ws = wb.sheets.active #当前活动工作表,方法2:wb.sheets[0],即sheet1 k = ws.used_range.last_cell.row #删除第3列空值行,pandas dropna可能因为有合并列,仅第3列空没用成功 while k > 0: #从表格最后删起,从前删行数不停变动不好处理 if ws.range(k,1).value is None and ws.range(k,3).value is None: #第1列和第3列都为空值行 ws.api.Rows(k).Delete() #删除空行 k -= 1 #记数值递减 nrows = ws.used_range.last_cell.row #删除空行后重新取总行数,可以正确获取行数的方法! ls = {} #创建空字典ls for i in range(1,nrows): #for循环整个表格 if ws.range(i,1).api.MergeCells: #A列合并单元格为真 x = ws.range(i,1).api.MergeArea.Rows.Count - 1 #取A列合并单元格行数,-1留一行存放第3列合并数据 if x > 0: #条件为超过1行 j = ws.range(i,1).api.MergeArea.Rows.Count #取A列合并单元格行数,重取避免行数变化 for j in range(j,0,-1): #for循环,当前合并单元格行数递减1到1,不等于0 ls[j-1] = ws.range(j + i -1,3).value #赋值ls字典,keys从j-1到0,value为第3列每行数据 if j > 1: #当前合并单元格行数>1 ws.api.Rows(j + i - 1).Delete() #留合并列第1行,删除其他多余行 lst = reversed(ls.values()) #字典键值从高到低需要反向 ws.range(i,3).value = chr(10).join('%s' %id for id in lst) #换行连接每行数据,连接前需遍历转str ls.clear() #清除字典,为下一个合并列做好准备


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3