副本&用win32com& amp;粘贴隔离蟒蛇

时间:2009-02-10 00:39:56

标签: python excel

有没有办法使用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格式?

3 个答案:

答案 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"))

根据MSDN: Excel Object Model Reference

答案 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'))

区分大小写。