Python xlwings复制粘贴公式与相对单元格引用
问题描述:
我有一个单元格A1中的公式是"=C1+$D$1"
。我想用xlwings将这个公式复制到A3(保留相对单元格引用)。我希望单元格A3中的粘贴公式为"=C3+$D$1"
而不是"=C1+$D$1"
。Python xlwings复制粘贴公式与相对单元格引用
是否有一个标志或函数会根据我们粘贴的范围调整公式?如果没有,我想最好的解决方案是在粘贴前处理公式本身。
rng_to_paste = ws.range('A1').options(ndim=1).formula
ws.range('A3').options(ndim=1).formula = rng_to_paste
答
我的解决方法是调用Excel宏为我做复制粘贴。尝试将Worksheet和Range对象传递给宏时发生错误,因此我的代码只使用字符串标识符。
的Python
def copypaste_range(wb_string,
ws_source_string,
rng_to_copy_string,
ws_destination_string,
rng_to_paste_string):
import xlwings as xw
xw.App.display_alerts = False
folder = r'D:\My Documents'
xls_path = folder + r'\xlwings_macros.xlsb'
wb_macros = xw.Book(xls_path)
wb_macro = wb_macros.macro('copypaste_range')
wb_macro(wb_string,
ws_source_string,
rng_to_copy_string,
ws_destination_string,
rng_to_paste_string)
xw.App.display_alerts = True
wb_macros.close()
VBA
Public Sub copypaste_range(wb_string, _
ws_source_string, rng_to_copy_string, _
ws_destination_string, rng_to_paste_string)
Dim wb As Workbook
Dim fso As New FileSystemObject
If Not IsWorkBookOpen(wb_string) Then
Set wb = Workbooks.Open(fileName:=wb_string)
Else
wb_string = fso.GetFileName(wb_string)
Set wb = Workbooks(wb_string)
End If
Dim rng_to_copy As Range
Dim rng_to_paste As Range
Set rng_to_copy = wb.Sheets(ws_source_string).Range(rng_to_copy_string)
Set rng_to_paste = wb.Sheets(ws_destination_string).Range(rng_to_paste_string)
rng_to_copy.Copy _
Destination:=rng_to_paste
End Sub
答
可以指定将更新隐式分配单元在已调整的式(S)的范围内的范围的公式属性。但是,使用此方法,xlwings不知道从哪里复制公式,所以它只能相对于分配的公式递增行/列。
xw.sheets[0].range('A1:A5').value = [[i] for i in range(5)]
xw.sheets[0].range('B1:C5').formula = [['=A1+1','=B1*10']]
xw.sheets[0].range('A1:C5').value
Out[3]:
[[0.0, 1.0, 10.0],
[1.0, 2.0, 20.0],
[2.0, 3.0, 30.0],
[3.0, 4.0, 40.0],
[4.0, 5.0, 50.0]]
您正在按照原样复制公式值。事实上,你必须处理公式本身,或者更简单地分配一个**新的公式来反映你的例子中的当前行。 – stovfl