有没有办法使用python和win32com进行复制和粘贴,以便python脚本可以在后台运行而不会弄乱“用户”的复制和粘贴功能?
from win32com.client import Dispatch
import win32com.client
xlApp = Dispatch("Excel.Application")
xlWb = xlApp.Workbooks.Open(filename_xls)
ws = xlWb.Worksheets(1)
xlApp.Visible=False
ws.Range('a1:k%s' % row).select
ws.Range('a1:k%s' % row).cut
ws.Range('a7').select
ws.paste
假设脚本将在大量数据集上连续运行......
好的,问题更清晰一点,我需要进行格式化,所有这些,所以只需抓取t值当然很简单,但不完全是需要的。
那么让我把这个问题说成: 有什么原因可以在没有选择,复制和粘贴例程的情况下在python中同时获取值及其excel格式?
答案 0 :(得分:5)
而不是:
ws.Range('a1:k%s' % row).select
ws.Range('a1:k%s' % row).cut
ws.Range('a7').select
ws.paste
我做了:
ws.Range("A1:K5").Copy(ws.Range("A7:K11"))
答案 1 :(得分:1)
只需将数据读入python,然后将其写回。
而不是:
ws.Range('a1:k%s' % row).select
ws.Range('a1:k%s' % row).cut
ws.Range('a7').select
ws.paste
逐个单元处理数据:
for r in range(1, row+1): # I think Excel COM indexes from 1
for c in range (1, 12): # a--k
val = ws.Cells(r, c).Value
ws.Cells(r, c).Value = '' # Blank this cell; equivalent to cut
ws.Cells(?, ?).Value = val # Write it somewhere ..
我不确定将二维选区粘贴到单个单元格中的确如此,所以我不能为你做最后一行。你可能会发现你需要做两个循环;一个读取数据,然后一秒钟将其写回。
答案 2 :(得分:1)
有点晚了,但我想我有你的解决方案, 因为我很难找到它,所以无论如何都会帮助别人。 这段代码将复制所有内容(值,公式,格式等) 使用选择(因此不会弄乱您的用户,这比使用选择更快)
首先我打开excel:
xl = client.Dispatch("Excel.Application")
wb = xl.Workbooks.Open("c:/somepath/file.xls")
xl.Visible = 1
复制并粘贴同一工作表,同时保留格式化,公式等:
ws = wb.Sheets("someSheet") #you can put the sheet number instead of it's name
ws.Range('a1:k%s' % row).Copy() #copy works on all range objects (ws.Columns(), ws.Cells, etc)
ws.Paste(ws.Range('a7'))
复制并粘贴其他工作表,同时保留格式化,公式等:
source_ws = wb.Sheets("SheetContainingData")
destination_ws = wb.Sheets("SheetWhereItNeedsToGo")
source_ws.Range('a1:k%s' % row).Copy()
destination_ws.Paste(destination_ws.Range('a7'))
区分大小写。