Некорректно отображается текст из docx в QTextEdit
Есть вот такой вот модуль:
def handleOpen(self): # открытие
path = QtWidgets.QFileDialog.getOpenFileName(
self, 'Open file', '',
'Text files(*.txt);;Html files (*.html);;Docx files (*.docx)')[0]
if path:
file = QtCore.QFile(path)
if file.open(QtCore.QIODevice.ReadOnly):
stream = QtCore.QTextStream(file)
text = stream.readAll()
info = QtCore.QFileInfo(path)
if info.completeSuffix() == 'html':
self.textEdit.setHtml(text)
else:
self.textEdit.setPlainText(text)
file.close()
При открытии обычного .txt файла всё выводит красиво, но при открытии .docx файла вот такое:
Ответы (2 шт):
Автор решения: gil9red
→ Ссылка
При открытии обычного txt файла всё выводит красиво, но при открытии docx файла вот такое:
Потому что, txt – это текстовый формат, он понятен человеку, а у docx бинарный формат. Вообще, docx это архив с файлами
Чтобы QTextEdit смог открыть docx нужно его привести в формат, который QTextEdit поймет а это или txt, или html.
Автор решения: S. Nick
→ Ссылка
Update: Модуль QAxContainer - это расширение только для Windows
Попробуйте так:
import sys
from PyQt5.QAxContainer import QAxWidget
from PyQt5.QtWidgets import (QWidget, QGridLayout, QPushButton, QFileDialog,
QMessageBox, QApplication)
class Window(QWidget):
def __init__(self):
super(Window, self).__init__()
self.setWindowTitle('Document Word.Application')
self.axWidget = QAxWidget(self)
self.buttonOpen = QPushButton('Open', self)
self.buttonOpen.clicked.connect(self.handleOpen)
layout = QGridLayout(self)
layout.addWidget(self.axWidget)
layout.addWidget(self.buttonOpen)
def handleOpen(self):
path, _ = QFileDialog.getOpenFileName(
self, 'Выберите файл word', '', 'word(*.docx *.doc)')
if not path:
return
return self.openOffice(path, 'Word.Application')
def openOffice(self, path, app):
self.axWidget.clear()
if not self.axWidget.setControl(app):
return QMessageBox.critical(self, 'Ошибка', 'Нет установки %s' % app)
self.axWidget.dynamicCall(
'SetVisible (bool Visible)', 'false')
self.axWidget.setProperty('DisplayAlerts', False)
self.axWidget.setControl(path)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.resize(840, 480)
window.show()
sys.exit(app.exec_())

