Qt сохранение в excel
Краткое руководство по чтению и написанию Excel в Qt
Многие увидят, как читать и писать в Excel QAxObject При выполнении операции многие люди обнаружат проблему, попробовав ее, что происходит медленно, очень медленно! Так много людей приходят к выводу, что QAxObject Метод чтения и записи excel нежелателен и неэффективен. Чтобы
Позже я попытался использовать ODBC и другие интерфейсы типа базы данных для чтения и записи.Даже если бы я столкнулся с китайскими сбоями, скорость чтения слишком большого Excel все равно была бы медленной. Чтобы
Наконец, прочитав некоторый открытый исходный код, я обнаружил, что для чтения Excel под Windows я все еще использую QAxObject Самый быстрый! Да, просто используйте QAxObject Самое быстрое чтение и письмо! ! ! (Прочитать 100000 ячеек за 229 мс)
Когда вы будете читать Excel в будущем (под win), вам не нужно рассматривать другие методы, используйте QAxObject Ничего страшного, рычаги скорости, медленные из-за ошибки! Поговорим о том, как повысить эффективность чтения.
Я не буду здесь говорить о том, как открыть или создать Excel, а сосредоточусь на том, как быстро читать в Excel. Чтобы
Метод работы с Excel с Qt можно найти в Интернете, и чтение выполняется с использованием метода, подобного следующему:
Основная причина медленного чтения: sheet->querySubObject("Cells(int, int)", row, col)
Представьте, что есть 10000 единиц и вам нужно 10 000 звонить querySubObject , 90% руководств в Интернете не говорят об этом querySubObject произведено QAxObject* Лучше удалить вручную, хотя в родительском QAxObject Он будет управлять своей памятью, но родительский объект не будет уничтожен, а дочерний объект не будет уничтожен.Если он вызывается 10 000 раз, будет создано 10 000. QAxObject Объект
Выгода отQT быстро читает файлы Excel с большим объемом данныхВ этой статье ниже описывается, как быстро читать и писать в Excel.
Принцип - один звонок querySubObject Прочитать все данные в память
Может использоваться в VBA UsedRange Вернуть все использованные диапазоны ячеек и использовать атрибуты Value Получите все значения этих ячеек.
На данный момент полученное значение представляет собой таблицу, но Qt превращает ее в переменную QVariant для хранения, которая фактически является QList > , Чтобы манипулировать содержимым в это время, вам нужно поставить это QVariant Преобразовать в QList >
Сначала посмотрите на функцию для получения всей ячейки (здесь ExcelBase - это пакет классов для чтения и записи в Excel):
Код this->sheet Это лист, который был открыт и используется при получении содержимого. this->sheet->querySubObject("UsedRange"); Вы можете получить все диапазоны.
Следующая функция castVariant2ListListVariant помещает QVariant Преобразовать в QList >
Чтобы все содержимое Excel было преобразовано в QList> Сохранить где QList > в QList Для содержимого каждой строки строки помещаются в самый внешний QList по порядку.
Для Excel следующим образом:
После чтения QList > Структура следующая:
Давайте посмотрим, насколько высока скорость чтения этого Excel
Вот Excel с 1000 строками, 100 столбцами и в общей сложности 100 000 ячеек. На открытие потребовалось некоторое время, а на чтение 100 000 ячеек ушло 229 миллисекунд.
Код чтения выглядит следующим образом: (полный исходный код см. Ниже)
Приведенные выше m_xls и m_datas являются переменными-членами:
Чтение, требующее много времени:
100000 - это всего 0,2 секунды
Точно так же может пройти QAxObject *usedRange = this->sheet->querySubObject("UsedRange"); Добейтесь быстрого чтения и быстрого письма
Перед быстрым написанием нужно получить диапазон записанной ячейки: Range(const QString&)
Если A1 в excel - это первая строка и первый столбец, то A1: B2 - это диапазон от первой строки, первого столбца, до второй строки, второго столбца.
Чтобы записать в этот диапазон, также через соответствующий QList > , Подробнее см. Следующий код:
Эта функция предназначена для записи данных из A1
В функции convertToColName Чтобы преобразовать количество столбцов в количество столбцов, представленных буквами в excel, эта функция реализована рекурсией:
Взгляните на время, необходимое для написания Excel:
Для записи 100000 данных требуется 262 мсек, и это очень быстро и эффективно.
This page discusses various available options for working with Microsoft Excel documents in your Qt application. Please also read the general considerations outlined on the Handling Document Formats page.
One needs to distinguish between two different formats (this page deals with both of them):
Legacy "Excel Spreadsheet" format | "Office Open XML Workbook" format | |
---|---|---|
classification: | binary BIFF-based | XML-based |
main filename extension: | .xls | .xlsx |
main internet media type: | application/vnd.ms-excel | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
default format of Excel: | until Excel 2003 | since Excel 2007 |
Contents
Reading / Writing
Using Excel itself
If you are exclusively targeting the Windows platform and Microsoft Excel will be installed on all target machines, then you can use Qt's ActiveX framework to access Excel's spreadsheet processing functionality through OLE automation. For an introductory code example (and a way to list the API provided by the Excel COM object), consult this how-to.
DLL file name | COM object name | platforms | license | |
---|---|---|---|---|
Microsoft Excel | ? | Excel.Application | Windows | commercial |
Using ODBC
To read an Excel file with ODBC (tested on Windows 7 with QT 4.7.1 and Windows 10 with QT 5.7) :
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "xlsx_connection"); db.setDatabaseName("DRIVER=;DBQ=" + QString("c:\\path\\to\\your\\file\\file.xlsx")); if(db.open())
The above code print all of column1's values to the debug output. It works for *.xls and *.xlsx and the other excel file formats.
By default OBDC uses the first row as names for the columns, you are supposed to be able to change this with the 'FirstRowHasNames' option in the connection settings, however there is a bug (see KB288343). Keep in mind that you are using a database and that each column has his own datatype, so if your second row contains text and your third row contains numbers, sql will pick one of these datatypes. If a few rows contain text and the rest of them contain floating numbers, sql will make the text appear and will make the numbers disappear.
Using independent parser/writer libraries
For a more portable solution, you could take a look at some of the available third-party C/C++ libraries for parsing/writing Excel files:
Note that these libraries differ in their scope and general approach to the problem.
Using manual XML processing
Files using the XML-based (.xlsx) format could be processed using Qt's XML handling classes (see Handling Document Formats). Third-party libraries can help you in dealing with the container format that wraps the actual XML files:
API | supported platforms | license | |
---|---|---|---|
libopc | C | Win, Mac, Linux, … | permissive |
Using batch conversion tools
.xls to * | .xlsx to * | *to .xls | *to .xlsx | platforms | license | |
---|---|---|---|---|---|---|
LibreOffice | .ods .csv … | .ods .csv … | .ods .csv … | .ods .csv … | Win, Mac, Linux, … | GPL v3 [strong copyleft] |
… | … | … | … | … | … | … |
Notes: LibreOffice can be used like this for batch conversion (it's slow, though): soffice —invisible -convert-to xls test.ods
или он может только в простые типы файлов типа xls и doc. Текстовые txt я не трогаю.
Знаю что можно сохранять в xlsx так:
, но мне такого плана не требуется, а нужно в более простом. Файл xlsx и docx он создает, но открыть не может т.к. якобы повреждается.
Работа с файлами в формате .doc, .docx, .xls, .xlsx
Добрый день! Подскажите, есть ли какая-то альтернатива COM-объектам для извлечения текста из.
Сохранение отформатированных печатных форм в .xlsx или .docx
Добрый день. Конфигурация ЗУП 2.5. Как можно передать параметры форматирования (отображения) в.
VBA Excel Сохранение в формате xlsx
Возможно и как сохранить макрос и форму на писанные на VBA в формате документа xlsx, а не в xlsm.
По очереди открывать каждый CSV-файл, запускать макрос и сохранять этот файл в формате XLSX
Добрый день. Помогите написать скрипт который будет: У меня есть много файлов в папке С:\1\.
который может работать не без проблем
средствами чистого Qt можно csv создавать
Добавлено через 4 минуты
Сорри не знал, просто везде пишут что якобы это простой т.к. был создан раньше чем xlsx и docx которые в 2007 появились\\
Библиотека для генерирования docx и xlsx
Здравствуйте! Стоит задача генерации отчетов в docx, xlsx и pdf форматах. При чем по сути это.
Как работать с файлами doc, docx,xlsx
Видел библиотеку ActiveQt, ну там про DOC я даже не понимаю как с ним раьотать, есть мейби пример.
Сохранение в файл в определенном формате
как сохранить и востановить в файл: - в произвольном текстовом виде - json - csv.
Вирус vault зашифрованы многие файлы xlsx docx dwg
Здравствуйте. По невнимательности подцепил из почты вирус vault, зашифрованы многие файлы xlsx.
Рабочие файлы DOCX, XLSX, PDF и т.д. зашифрованы расширением vault
ПОМОГИТЕ РАСШИФРОВАТЬ ФАЙЛЫ. Сегодня утром на рабочем столе обнаружил файлы vault.txt, vault.key.
В предыдущей части я рассказывал о создании модуля для запуска SQL-запросов и оболочки, в которой эти модули запускаются. После недолгой работы с запросами возникает очевидный вопрос — а как воспользоваться результатом выборки, кроме как посмотреть на экране?
Для этого стоит сделать дополнительные инструменты экспорта и копирования данных. Экспортировать будем в файл в формате Excel, а копировать в системный буфер в формате HTML.
Но для начала прилепим к нашему главному окну панель инструментов.
Панель инструментов
Напомню, что наше приложение призвано быть простым, универсальным и расширяемым. Чтобы тулбар тоже сделать универсальным и расширяемым, вынесем его определение в файл конфигурации, а выполняемые функции будут находиться во внешних модулях, явно не импортируемых в модуле тулбара. Таким образом добавление новой кнопки и функции сведется к прописыванию их в конфигурационном файле и добавлению модуля в каталог программы.
Для панелей инструментов в Qt есть готовый класс QToolBar, от него породим свой ToolBar. Сейчас нам достаточно одного тулбара, но заложимся на возможность добавления в программу нескольких панелей. Каждой панели нужен свой конфигурационный файл со своим набором кнопок, поэтому имя файла будем передавать параметром при создании тулбара.
Конфигурационный файл будет традиционно в формате Ini и кодировке UTF-8.
Синтаксис определения кнопок в наших руках, в простейшем случае нам нужны три вещи:
— текст на кнопке
— модуль, содержащий функцию кнопки
— функция кнопки
Определимся, что функция кнопки принимает один параметр — текущее дочернее окно. Что именно будет делать модуль с ним — задача модуля кнопки, а задача тулбара ограничивается только его вызовом.
Создадим такой файл tools.ini:
Теперь в питоне разбираем определения из Ini-файла:
Метод выполнения, назначенный всем кнопкам, будет импортировать нужный модуль и вызывать из него назначенную кнопке функцию. Чтобы нам не прописывать каждый модуль в перечне импорта тулбара, воспользуемся библиотекой importlib. Осталось только узнать, что за кнопка была нажата и от какого QAction пришел сигнал — за это отвечает стандартный метод QObject.sender(), далее возьмем сохраненные в нем параметры и сделаем то, что задумано в модуле (что бы это ни было).
Осталось добавить нашу панель в наше главное окно (модуль tasktree.py)
Можем запустить и проверить, появилась ли панель:
Может быть не так симпатично, как на первой картинке, главное, что работает.
Модуль функций инструментов
Теперь самое время сделать модуль с функциями кнопок. Модуль у нас будет один, потому что функции экспорта и копирования будут работать с одним источником данных и по одинаковым правилам, нет смысла разносить их по разным модулям.
Наши функции будут работать с таблицами данных QTableView, который мы использовали в модулях для просмотра результатов запроса. Чтобы сохранить независимость модулей, определять нужный компонент будем «на лету» — либо это текущий выбранный (focused) компонент QTableView в текущем окне, либо первый попавшийся нужного класса среди дочерних элементов текущего окна.
Из таблицы получаем список выбранных ячеек. Если ничего не выбрано, то принудительно выбираем всё.
Наверное, вы уже в курсе, что в Qt вы не получаете массив данных напрямую, вместо этого вы работаете с индексами в модели. Индекс QModelIndex представляет собой простую структуру и указывает на конкретную позицию данных (строку row() и столбец column(), а в иерархии указание на индекс родителя parent()). Получив индекс, можно из него получить сами данные методом data().
Мы получили список индексов выбранных ячеек в модели, но индексы в этом списке следуют в том порядке, в котором пользователь их выделял, а не отсортированные по строкам и столбцам. Нам же удобнее будет работать не со списком, а с словарем (позиция → индекс) и сортированными списками задействованных строк и столбцов.
Еще стоит учесть, что QTableView по умолчанию позволяет выделять несвязанные ячейки, потому в списке индексов могут быть ячейки, практически случайно расположенные:
Поэтому в d.rows есть каждая использованная строка, в d.columns есть каждый использованный столбец, но их сочетание необязательно есть в d.indexes.
Еще нам для пущей красоты нужен перечень наименований столбцов, который выводятся в QTableView. Получим их из модели методом headerData:
До сих пор код для экспорта и копирования был одинаковым, но теперь пошли различия.
Экспорт в Excel
Для экспорта в файлы Excel я воспользовался пакетом xlsxwriter. Он устанавливается, как обычно, через pip:
Документация пакета вполне подробная и понятная, с примерами, поэтому останавливаться на нем не буду. Суть в том, что запись идет по ячейкам, адресуемым по номеру строки и столбца. Если нужно дополнительное форматирование, то нужно определить стиль и указывать его при записи ячейки.
Имя xlsx-файла, в который будем экспортировать, запросим у пользователя, у Qt есть такая функция. В PyQt функция возвращает список из выбранного имени файла и использованного фильтра. Если вернулся список из пустых строк, то это означает, что пользователь отказался от выбора.
Танцы вокруг QDateTime добавлены из-за разного понимания даты/времени в Python, Qt и Excel — во-первых, пакет xlsxwriter умеет работать с питоновским datetime, но не умеет с QDateTime из Qt, поэтому приходится дополнительно его конвертировать специальной функцией toPyDateTime; во-вторых, Excel умеет работать только с датами с 01.01.1900, а всё, что было до этого времени для Excel — просто строка.
Результат экспорта в Excel:
Копирование в системный буфер в формате HTML
Не всегда нужен отдельный файл с выборкой, часто, особенно когда данных немного, удобнее скопировать их в табличном виде в системный буфер (clipboard), а затем вставить в нужное место, будь то Excel, Word, редактор веб-страниц или что-то другое.
Наиболее универсальным способом копирования табличных данных через буфер — это обычный формат HTML. В Windows, *nix и MacOS сильно разные способы работы с буфером (не говоря о том, что их несколько), поэтому хорошо, что Qt скрывает от нас детали реализации.
Всё, что нам нужно — создать объект QMimeData, заполнить его через метод setHtml фрагментом HTML-разметки, и отдать в системный clipboard, который доступен через QApplication
Таблицу собираем построчно, начиная с заголовков.
Результат, вставленный в Word:
Здесь границы таблицы видны только благодаря включенной в Word настройке "Показывать границы текста", на самом деле они невидимы. Чтобы таблица копировалась с явными границами, нужно изменить стиль таблицы в тэге table. Предоставляю это сделать вам.
Заключение
Итак, мы получили способ добавления в наш инструмент новых функций, причем функции добавляются и работают независимо от того, какими источниками данных мы будем пользоваться и как их отображать — модули, работающие с данными, ничего не знают о тулбарах и их функциях, тулбары не связаны ни с модулями данных, ни с функциями кнопок, а функции кнопок, не зная ни о тулбарах, ни о модулях данных, просто пытаются обработать текущий визуальный компонент известным им способом.
Исходники, использованные в примерах, как и ранее, выложены на github под лицензией MIT.
QAxObject - это класс для упаковки компонентов COM, предоставляемых Qt. Чтобы управлять Excel через COM, вам необходимо использовать класс QAxObject. Чтобы использовать этот класс, вам необходимо добавить «QT + = axcontainer» в файл pro.
Пожалуйста, обратитесь к справочному документу для получения конкретных инструкций QAxObject.
Как подключиться к excel com
Базовая операция Excel
операция с файлом Excel
Получить коллекцию текущей книги
Создать новую книгу
Открыть существующую книгу
Сохранить как книгу
листовая операция листа
Все книги, используемые в приведенном ниже коде, получены после вышеуказанных операций с книгой, то есть для работы с определенной книгой (файлом Excel).
Получить все рабочие листы
Получите рабочий лист в соответствии с серийным номером, порядок серийных номеров приведен ниже после открытия Excel.
Получить количество строк и столбцов в таблице
Управление контентом
Операция с содержимым данных - получение ячейки на основе координат
Операция с содержимым данных - получение ячейки на основе имени строки и столбца
Содержимое данных операция чтения содержимого ячейки
Операция содержимого данных - запись содержимого ячейки
Другой
Большой объем прочитанных данных
Прочтите все содержимое ячеек - используйте этот метод, если объем данных велик, вам нужно выполнить только одну операцию, чтобы прочитать все содержимое до содержимого, избегайте повторения каждой ячейки для операции QAxObject
В это время результат сохраняется в QVariant, и его необходимо самостоятельно преобразовать в QList .
Запись большого количества данных
Большие данные хранятся в QList , что аналогично чтению, здесь сначала нужно указать диапазон области
Затем напишите данные
Пример: полная операция открытия-чтения-закрытия
нота:
1. В этом примере, чтобы увидеть эффект, настройки окна и предупреждения предназначены для отображения, измените значение на false самостоятельно.
2. Все операции в Excel выполняются через QAxObject для операций с компонентом COM, включая открытие файлов, поэтому путь должен проходить полный путь, а не относительный путь.
3. Сам QAxObject будет поддерживать новое пространство, просто удалите первый QAxObject напрямую
4. Все содержимое хранится в переменных var.
5. Все вышеперечисленные операции являются возвращаемыми значениями суждения, если в файле нет последующего содержимого, будет сообщено об ошибке.
Читайте также: