Как сохранить данные qtablewidget в файл excel с помощью openpyxl

У меня есть qtablewidet с данными, и когда пользователь нажимает кнопку экспорта, появляется диалоговое окно с запросом имени файла для сохранения в формате excel, как мне это сделать с помощью openpyxl?

вот мой код

self.exportbtn.clicked.connect(self.export)

    def export(self):
        try:
            filename = QtWidgets.QFileDialog.getSaveFileName(self, 'Save file', '','Excel files(*.xlsx)')
            wb = Workbook()
            sheet = wb.active
            for column in range(self.tableWidget.columnCount()):
                for row in range(self.tableWidget.rowCount()):
                    try:
                        text = str(self.tableWidget.item(row, column).text())
                        sheet.write(row, column, text)
                        wb.save(filename)
                    except Exception as e:
                        print("Error Writing file.")
        except Exception as e:
            print("Error Saving file.")

когда я пытаюсь нажать «Сохранить» в диалоговом окне, прямо сейчас выводится это

как сохранить все данные, включая заголовки из qtablewidget, в файл excel с помощью openpyxl?

обновлять: я отредактировал свой код сейчас, и я могу создать файл, но данные из qtablewidget все еще не записываются в файл excel

def export(self):
        filename, filter = QtWidgets.QFileDialog.getSaveFileName(self, 'Save file', '','Excel files (*.xlsx)')
        wb = Workbook()
        sheet = wb.active
        if not filename:
            for column in range(self.tableWidget.columnCount()):
                for row in range(self.tableWidget.rowCount()):
                    try:
                        text = str(self.tableWidget.item(row, column).text())
                        sheet.write(row, column, text)                    
                    except AttributeError:
                        pass
        wb.save(filename)

я попытался распечатать данные из qtablewidget, и они отображаются, они просто не сохраняются в файле excel, чего-то еще не хватает?

изменить на print("Error Writing file.", e)

eyllanesc 18.12.2020 17:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
1 342
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Таким образом, ваша строка wb.save(filename) находится внутри вашего цикла for, поэтому одно и то же имя файла сохраняется в каждом цикле.

Переместите эту строку наружу и после цикла for во внешнем отступе и, следовательно, сохраните ее только один раз.

Кроме того, убедитесь, что имя файла еще не существует, иначе вы можете получить всплывающее диалоговое окно «Вы уверены?» и тогда вам нужно принудительно сохранить его.

но когда я выдвигаю его наружу, он говорит AttributeError: 'tuple' object has no attribute 'write'

uaena 19.12.2020 12:21

Я ожидаю, что вам придется проверить, какие значения вы получаете от qtablewidget.

Rob Py 21.12.2020 10:54

Я ожидаю, что вам придется проверить, какие значения вы получаете от qtablewidget, чтобы убедиться, что вы не получаете недопустимое (нулевое) значение. Используйте печать, чтобы убедиться, что значения действительны. Кроме того, следующие строки можно использовать для сохранения значений в Excel, и большинство из них уже есть в вашем коде. from openpyxl import Workbook wb = Workbook() sheet = wb.active # в циклах for получите ссылку на ячейку и присвойте значение данных cellref = sheet.cell(row=4,column=5) cellref.value = 'ваши данные для ячейки' #после цикла for wb.save('samplefile.xlsx')

Rob Py 21.12.2020 11:05

теперь я могу создать файл .xlsx, но данные из qtable не записываются в файл, я попытался распечатать значения в qtablewidget, и он показывает, он просто не сохраняется в файл excel, извините, я не совсем понял получить ссылку на часть ячейки?

uaena 21.12.2020 11:32

Ваша проблема может быть не в сохранении в Excel, а просто в том, чтобы быть уверенным. Начните с простого тестирования того, что вы можете сохранить простую строку в Excel, используя свой код, чтобы просто ввести значение в ячейку, например так.# получить ссылку на ячейку cellref = sheet.cell(row=4,column=5) # присвоить ячейке значение cellref.value = 'test hello world' #после цикла for wb.save('samplefile.xlsx')

Rob Py 21.12.2020 11:45

я отредактировал свой вопрос и поместил свой последний код сейчас, я также сделал простой тест, и он сработал, может быть, сейчас чего-то не хватает в моем коде????

uaena 21.12.2020 11:59

sheet.cell(3,3).value = 'hello world' это позволит получить ссылку на ячейку и ввести строку 'hello world' в ячейку excel C3

Rob Py 21.12.2020 12:03

измените строку: sheet.write(row, column, text) и сделайте ее sheet.cell(row,column).value = text

Rob Py 21.12.2020 12:07

ваш первый индекс из цикла for равен 0. Однако в Excel таблица начинается с 1. Поэтому вам нужно изменить строку ввода ячейки на это: sheet.cell(row+1,column+1).value = text # К сожалению, если вы не распечатаете сообщение об ошибке, вам будет сложно выявить проблемы. У вас не должно быть Pass в части исключения вашего кода, так как вам лучше знать, когда возникает проблема. Лучше распечатать сообщение об ошибке и попытаться решить оттуда.

Rob Py 21.12.2020 12:43

у вас есть строка кода, которую вы добавили в свое обновление редактирования, которая не нужна: если не имя файла:

Rob Py 21.12.2020 13:00

аааа, я вижу ... я добавил, если не имя файла ранее, потому что он не создает файл, но я удалил сейчас и заменил лист.ячейка (строка + 1, столбец + 1). значение = текст, теперь это работает, я просто нужно добавить заголовки столбцов, большое спасибо за терпение: D

uaena 21.12.2020 13:22

Почти все статические методы QFileDialog (кроме getExistingDirectory() и getExistingDirectoryUrl()) возвращают кортеж в виде (file(s), filter).

Для getOpenFileNames() (обратите внимание на множественное число) первый объект представляет собой список строк, указывающих на выбранные файлы, в остальных случаях это путь к файлу в виде строки или URL-адреса.

Обратите внимание, что если диалог закрыт, строка файла (или список) пуста, поэтому вы должны проверить это, прежде чем продолжить запись файла:

    filename, filter = QtWidgets.QFileDialog.getSaveFileName(
        self, 'Save file', '','Excel files(*.xlsx)')
    if not filename:
        return
    # ...

Также не следует пытаться сохранять файл при каждом цикле цикла for.

While 99% of the functions in Qt behave in the same way in PyQt, that's not always true, especially for situations for which C++ uses referenced variables. Whenever you are not sure about a function or get unexpeted behavior from it, you can check the PyQt documentation (the returned type(s) are specified at the end of the function definition, after the →) or just call help(class.function) in the python consolle. An even simpler solution is to just print the returned value, and you'll see that for yourself.

Теперь я могу создать файл xlsx, и он сохраняется, но когда я его открываю, данные не сохраняются и пусты, чего-то не хватает в цикле for или что-то в этом роде? я также переместил wb.save наружу

uaena 19.12.2020 12:39
def imag_Export_Report(self):  
    self.cur.execute('''SELECT name, phone, image FROM photo''')
    rows = self.cur.fetchall()
    excel_file = QtWidgets.QFileDialog.getSaveFileName(self, "save file",'./','Excel Files (*.xlsx)')
    workbook = xlsxwriter.Workbook(excel_file[0])
    sheet1 = workbook.add_worksheet()
    sheet1.write(0, 0, 'name ') 
    sheet1.write(0, 1, ' phone')
    sheet1.write(0, 2, 'image ')

    row_number = 1  
    for row in rows:
        column_number = 0  
        for item in row:
            sheet1.write(row_number, column_number, str(item))
            column_number += 1
        row_number += 1
    workbook.close()
    self.con.commit()

Для того, чтобы данные отображались в файле Excel, необходимо вызвать требуемые данные из базы данных

user20718051 07.12.2022 23:25

Другие вопросы по теме