Как скопировать таблицу из офисных приложений и вставить в QTableView?
Третью неделю занимаюсь изучением Python3 & PyQt5 и столкнулся с проблемой, которая просто ошеломила своей беспощадностью. Подозреваю, что это из-за своей неискушённости в python, но тем не менее.
Задача
Требуется скопировать таблицу из офисных приложений (MS Office, LibreOffice) и вставить её GUI, реализованный посредством PyQt5 и QTableView в частности. C определённой степенью подробности изучил примеры для пионеров в интернете, однако моя задача чуть сложнее. Модель, которую я взял - это скопировать квадрат чисел 1, 2, 3, 4, окружённый одним рядом пустых ячеек:
Собственно, скопироваться фрагмент должен вместе и с цифрами, и с пустыми ячейками.
Что пробовал
В лоб Ctrl+C Ctrl+V не сработало, поэтому начал извращаться.
QtWidget.QApplication.clipboard().text()
Начал с самого простого - с текстового содержимого QtWidget.QApplication.clipboard(). Тут наблюдается полный разброд и шатание в зависимости от источника. Зачастую информация о пустых ячейках просто теряется. Ниже приведено текстовое содержимое буфера.
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'
QtWidget.QApplication.clipboard().text("html")
Вывод содержимого буфера в html-формате, в принципе, проблему решил, но очень корявым способом, т.к. html пришлось тщательно вычищать от всяких мусорных тэгов, которыми особенно грешил Word. Долго, геморройно, нет уверенности, что с изменением версий офисных программ не придётся переписывать алгоритм.
pandas.read_clipboard(header=None)
Подумал, что может помочь pandas, но в моих руках он мне не помог. Вот, что выдал вышеозначенный метод в зависимости от источника
MS Excel:
2
0 1
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
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
Вопрос
Навыки кодинга - это очень хорошо, но мучает вопрос: как решить поставленную задачу правильно? :)
