Скопировать и вставить изоляцию с Win32com и Python - PullRequest
3 голосов
/ 10 февраля 2009

Есть ли способ использовать 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 без процедуры выбора, копирования и вставки?

Ответы [ 3 ]

5 голосов
/ 04 сентября 2012

Вместо:

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

1 голос
/ 06 мая 2013

Немного поздно, но я думаю, что у меня есть ваше решение, и так как у меня были проблемы с поиском, это все равно кому-нибудь поможет. Этот фрагмент кода скопирует все (значение, формулу, форматирование и т. Д.) Без используя выборки (таким образом, не мешая вашим пользователям, и это быстрее, чем использование выборок)

Сначала я открываю 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'))

с учетом регистра.

1 голос
/ 10 февраля 2009

Просто прочитайте данные в 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 ..

Я не уверен, что делает вставка двумерного выделения в одну ячейку, поэтому я не могу сделать последнюю строку для вас. Вы можете обнаружить, что вам нужно сделать две петли; один, чтобы прочитать данные, а затем второй, чтобы записать их обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...