Python - Добавление строки в буфер обмена, которая будет вставлена ​​в Excel в правильном формате (т.е. разделена на строки / столбцы) - PullRequest
0 голосов
/ 26 марта 2020

Я видел несколько ответов на эту проблему, но в VBA и C# --- ничего в python. В python 3 я пытаюсь сделать следующее:

  1. Назначить переменной строку значений в соответствующем формате "excel"
  2. Затем эту переменную скопировать в clipboard
  3. Тогда пользователь должен иметь возможность вручную CTRL + V (вставить) эту строку в Excel и разделить ее на правильные размещения строк / столбцов.

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

# If I first go into excel, 
# and copy a few columns within a single row with different data in them, 
# then I run the following code: 

import tkinter as tk
root = tk.Tk()
paste = root.clipboard_get()

print(paste)

# Then I manually copy the print output to the clipboard,
# and then go back to excel and paste, 
# excel gives the following warning message:
# "The data you're pasting isn't the same size as your selection.  do you want to paste anyways?"
# And after pressing OK, it seems as though the data is pasted properly. 

Это нормально, и строка print (paste) может помочь мне создать соответствующий формат для исходной переменной строк, которые я хочу сгенерировать, но Мне нужно решение, которое не приведет к тому, что в Excel каждый раз будет появляться этот предупреждающий знак.

Если кто-то может дать представление об этом, я был бы очень признателен. Кроме того, решение должно быть через python, а не через изменения в Excel. Во-вторых, решение заключается не в добавлении / записи данных непосредственно в Excel (через Openpyxl, et c), а в получении данных в буфер обмена в соответствующем формате (я использую Excel 2016).

Спасибо !!


Редактировать:

Я также пытался использовать "решение ctypes", представленное здесь пользователем kichik.

Кому Чтобы упростить работу с этим решением, я загрузил приложение под названием «InsideClipboard», которое позволяет мне легко видеть идентификатор формата каждого типа форматов, в который буфер «копирует» данные.

Используя решение ctype от kichik, я проверил, чтобы увидеть, если ручное копирование вывода на печать различных форматов, сохраненных в буфере обмена, позволит мне вручную нажать CTRL + V в Excel в исходном формате, но это не удалось Исходная «копия» состояла из нескольких столбцов строк в одной строке строк из Excel, а ручная «вставка» отдельных форматов обратно в Excel сохраняла все строки в одной ячейке (за исключением HTML Формат что создано несколько строк данных - тоже неправильно). Различные форматы включали CF_LOCALE (16), CF_TEXT (1), CF_OEMTEXT (7), CF_UNICODETEXT (13) и AND HTML Format (49384).

Итак, по-прежнему: решения нет.


Edit2:

Я понял, что могу создавать строки в python с фактическими вкладками, зажатыми между строкой, вместо использования \ t, он работал для создания одной строки, которая помещала бы данные в разные столбцы одной строки при вставке в Excel.

Кроме того, я понял, что если я нажму CTRL + V непосредственно в Excel (не в заголовке строки), в фактической строке, в которую я хочу вставить данные, я больше не получаю «предупреждающее сообщение» Excel. Таким образом, использование этой работы может работать. Если никто не имеет никакого вклада, то этот простой подход может быть достаточно хорошим.

Однако я хотел бы иметь возможность просто щелкнуть заголовок строки вместо первой соответствующей ячейки строки, чтобы вставить данные без всплывающего окна предупреждения Excel. Идеи все еще приветствуются, и было бы лучше, чтобы все это было сделано через python (без изменений в Excel, так как приложение может работать на разных Windows ПК с ОС).

Итак: возможное простое решение , но не идеально.


Edit3:

Итак, я разработал решение, основанное на Edit2. Всплывающее окно «Предупреждение» в Excel по-прежнему возникает, если Excel открывается как приложение на рабочем компьютере; однако, если файл Excel открывается и редактируется с помощью онлайн-процессора, пользователь может выделить заголовок строки и вставить его, не создавая всплывающее окно «Предупреждение» в Excel. Это работает в моем конкретном случае c, хотя лучшим решением было бы, чтобы скопированные данные не генерировали всплывающее окно предупреждения Excel в любой ситуации. В любом случае, если никто не знает, как предотвратить всплывающее предупреждение Excel только с помощью python, тогда я все еще могу работать с этим методом.

Вот мое решение (обратите внимание, что пробелы в длинной строке на самом деле являются «табуляциями»):

import pyperclip

# t variables are defined prior to the below code
# note: the "   " parts in the data string are actually tabs

data = t1 + "   " + t2 + "  " + "   " + t3 + "  " + t4 + "  " + t5 + "  " + t6 + "  " + t7 + "  "  + "  " + "t8"  + "   "  + "  "  + "  "  + "  "  + "  "  + "  " + t9 + "  " + t10 + " " + t11 + " " + t12 + " "  + "  "  + "  "  + "  "  + "  "  + "  " + t13

pyperclip.copy(data)
print("clipboard:", data)

# now manually pressing CTRL+V while inside Excel (online processor) will
# paste the various t variables in the appropriate cells designated by 
# the "   " tabs in between.  Of note, this works for columns of a single
# row as I didn't need multiple rows of data for my task.

1 Ответ

0 голосов
/ 06 мая 2020

Ниже приведен код для создания 5 строк на 3 столбца сетки записей в tkinter. Нажатие кнопки копирования копирует содержимое записей в виде строки, разделенной символом табуляции / новой строки, в буфер обмена, который затем можно вставить в Excel.

import tkinter as tk
from tkinter import ttk

ROWS = 5
COLS = 3

root = tk.Tk()

rows = []  # Container for Entry widgets.

# Create and grid the Entry widgets.
for row in range( ROWS ):
    temp = []
    for col in range( COLS ):
        temp.append( ttk.Entry(root, width = 10 ))
        temp[-1].grid( row = row, column = col )
    rows.append( temp )

def entries_to_lists( rows ):
    list_out = []
    for row in rows:
        temp = []
        for col in row:
            temp.append( col.get() )
        list_out.append( temp )
    return list_out

def string_out( rows ):
    """ Prepares a '\t', '\n' separated string to send to the clipboard. """
    out = []
    for row in rows:
        out.append( '\t'.join( row ))  # Use '\t' (tab) as column seperator.
    return '\n'.join(out)              # Use '\n' (newline) as row seperator.

def do_copy():
    data = entries_to_lists( rows )
    root.clipboard_clear()
    root.clipboard_append( string_out( data ))     # Paste string to the clipboard
    root.update()   # The string stays on the clipboard after the window is closed

ttk.Button( text = "  Copy  ", command= do_copy ).grid( column = 1 )
# Button to trigger the copy action.

root.title("Copy to Excel Test")
root.geometry("400x200+10+10")
root.mainloop()

Это скопировано в Excel 2013 в Windows 10 без предупреждения. messages.

string_out сгенерирует подходящую строку из любого списка списков строк, 2d список.

...