copy & paste isolation with win32com & python

前端 未结 3 682
失恋的感觉
失恋的感觉 2021-01-14 17:08

Is there a way of using python and win32com to copy and paste such that python scripts can run in the background and not mess up the \"users\" copy and paste ability?

<
相关标签:
3条回答
  • 2021-01-14 17:47

    A little late, but I think I have your solution, and since I had trouble finding it it'll help someone anyway. This piece of code will copy everything (value, formula, formating, etc) without using selections (thus not messing with your users, and this is faster than using selections)

    First I open excel like that :

    xl = client.Dispatch("Excel.Application")
    wb = xl.Workbooks.Open("c:/somepath/file.xls")
    xl.Visible = 1
    

    To copy and paste on the same worksheet while conserving formating, formulas, etc:

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

    To copy and paste on an other worksheet while conserving formating, formulas, etc:

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

    case sensitive.

    0 讨论(0)
  • 2021-01-14 17:48

    Instead of:

    ws.Range('a1:k%s' % row).select
    ws.Range('a1:k%s' % row).cut
    ws.Range('a7').select
    ws.paste
    

    I did:

    ws.Range("A1:K5").Copy(ws.Range("A7:K11"))
    

    according to MSDN: Excel Object Model Reference

    0 讨论(0)
  • 2021-01-14 17:57

    Just read the data out into python, and then write it back.

    Instead of:

    ws.Range('a1:k%s' % row).select
    ws.Range('a1:k%s' % row).cut
    ws.Range('a7').select
    ws.paste
    

    Process the data cell-by-cell:

    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 ..
    

    I'm not sure what pasting a two-dimensional selection into a single cell does, so I can't do the last line for you. You may find that you need to do two loops; one to read in the data, and then a second to write it back out.

    0 讨论(0)
提交回复
热议问题