Cómo copiar y pegar una tabla desde las aplicaciones de Office a la interfaz gráfica de PyQt5
Soy nuevo en Python 3 y PyQt5 y me enfrenté a un problema que me dejó atónito por su crueldad. Asumo que mi falta de experiencia en Python es la causa raíz, pero aún así…
Tarea
La tarea consiste en copiar una parte de una tabla de aplicaciones de oficina (MS Office, LibreOffice) y pegarla en una GUI implementada por PyQt5 y QTableView. Estudié algunos ejemplos simples en Internet, pero mi tarea es un poco más complicada. Es necesario copiar algunos datos que están rodeados por celdas vacías en todos los lados:
Lo que se ha intentado
Ctrl+C, Ctrl+V no funcionan, así que probé formas más complicadas que se enumeran a continuación.
QtWidgets.QApplication.clipboard().text()
Comencé con lo más sencillo: el contenido de texto de QtWidgets.QApplication.clipboard() y encontré un caos completo que depende de la fuente de una tabla:
MS Office Excel: '\t\t\n\t1\t2\n\t3\t4\n'
LibreOffice Calc: '1\t2\n3\t4\n'
MS Office Word: '\t\t\t\n\t1\t2\t\n\t3\t4\t\n\t\t\t\n'
LibreOffice Writer: '\n\n\n\n\n1\n2\n\n\n3\n4\n\n\n\n\n\n'
Como podemos ver, en muchos casos se pierde información sobre las celdas vacías.
QtWidgets.QApplication.clipboard().text(“html”)
Obtener el contenido HTML del portapapeles es una solución, pero de una manera muy torpe. El texto con etiquetas HTML tenía que ser cuidadosamente limpiado de cualquier etiqueta de basura, que MS Word produce especialmente en gran cantidad. Es largo y complicado, sin la certeza de que con una actualización de Office no tenga que reescribir el algoritmo.
pandas.read_clipboard(header=None)
Pensé que pandas podría ayudarme, pero descubrí que la salida de pandas.read_clipboard(header=None) era casi absurda en comparación con la salida de QtWidgets.QApplication.clipboard().text():
MS Excel:
2
0 1<br>
NaN NaN NaN
1.0 2.0
3.0 4.0
LibreOffice Calc:
0 1
0 1 2
1 3 4
MS Word:
3
0 1 2<br>
NaN NaN NaN NaN
1.0 2.0 NaN
3.0 4.0 NaN
NaN NaN NaN
LibreOffice Writer:
0
0 1
1 2
2 3
3 4
Agradecería si me dieran algún consejo sobre cómo resolver este problema de la manera más óptima.
davy.ai
Solución para copiar una tabla formateada desde MS Office y LibreOffice a PyQt5 QTableView
Copiar tablas formateadas desde MS Office y LibreOffice a un PyQt5 QTableView puede ser una tarea desafiante. La causa raíz de este problema es que los datos están rodeados de celdas vacías en todos los lados, y el portapapeles pierde la información sobre las celdas vacías en muchos casos. Por lo tanto, Ctrl+C, Ctrl+V no funciona, y otros métodos como
QtWidgets.QApplication.clipboard().text()
oQtWidgets.QApplication.clipboard().text("html")
no proporcionan una solución limpia.Una solución posible es usar pandas para leer el contenido del portapapeles utilizando el siguiente código:
Sin embargo, esta solución puede no funcionar como se espera debido a la misma razón explicada anteriormente. La salida de
pd.read_clipboard(header=None)
puede no coincidir con nuestras expectativas y podemos obtener una salida absurda.Por lo tanto, la forma óptima de resolver este problema es crear una implementación personalizada para analizar el contenido del portapapeles y extraer los datos de la tabla formateada. Se pueden seguir los siguientes pasos para implementar una solución personalizada:
QtWidgets.QApplication.clipboard().mimeData()
.QStandardItemModel
.QStandardItemModel
como el modelo para elQTableView
.A continuación se muestra un ejemplo de implementación de una función
parseTable()
que se puede utilizar para analizar el contenido del portapapeles:Esta función
parseTable()
puede manejar los datos de la tabla de MS Office y LibreOffice excluyendo las celdas vacías en todos los lados y eliminando las etiquetas html.El siguiente paso es poblar un
QStandardItemModel
utilizando los datos de la tabla analizada. Aquí se puede utilizar una implementación personalizadaPandasModel
, que hereda deQAbstractTableModel
y se puede utilizar para cargar un DataFrame de pandas en unQTableView
. A continuación se muestra un ejemplo de implementación de una clasePandasModel
:Finalmente, a continuación se muestra un ejemplo de implementación de cómo utilizar las funciones anteriores para cargar los datos de la tabla formateada en un
QTableView
.Esta implementación se puede utilizar para copiar tablas formateadas desde MS Office y LibreOffice a un PyQt5 QTableView de manera óptima.