Qt excel создать файл
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
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
Краткое руководство по чтению и написанию 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<QList<QVariant> > , Чтобы манипулировать содержимым в это время, вам нужно поставить это QVariant Преобразовать в QList<QList<QVariant> >
Сначала посмотрите на функцию для получения всей ячейки (здесь ExcelBase - это пакет классов для чтения и записи в Excel):
Код this->sheet Это лист, который был открыт и используется при получении содержимого. this->sheet->querySubObject("UsedRange"); Вы можете получить все диапазоны.
Следующая функция castVariant2ListListVariant помещает QVariant Преобразовать в QList<QList<QVariant> >
Чтобы все содержимое Excel было преобразовано в QList<QList<QVariant>> Сохранить где QList<QList<QVariant> > в QList<QVariant> Для содержимого каждой строки строки помещаются в самый внешний QList по порядку.
Для Excel следующим образом:
После чтения QList<QList<QVariant> > Структура следующая:
Давайте посмотрим, насколько высока скорость чтения этого 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<QList<QVariant> > , Подробнее см. Следующий код:
Эта функция предназначена для записи данных из A1
В функции convertToColName Чтобы преобразовать количество столбцов в количество столбцов, представленных буквами в excel, эта функция реализована рекурсией:
Взгляните на время, необходимое для написания Excel:
Для записи 100000 данных требуется 262 мсек, и это очень быстро и эффективно.
QAxObject - это класс для упаковки компонентов COM, предоставляемых Qt. Чтобы управлять Excel через COM, вам необходимо использовать класс QAxObject. Чтобы использовать этот класс, вам необходимо добавить «QT + = axcontainer» в файл pro.
Пожалуйста, обратитесь к справочному документу для получения конкретных инструкций QAxObject.
Как подключиться к excel com
Базовая операция Excel
операция с файлом Excel
Получить коллекцию текущей книги
Создать новую книгу
Открыть существующую книгу
Сохранить как книгу
листовая операция листа
Все книги, используемые в приведенном ниже коде, получены после вышеуказанных операций с книгой, то есть для работы с определенной книгой (файлом Excel).
Получить все рабочие листы
Получите рабочий лист в соответствии с серийным номером, порядок серийных номеров приведен ниже после открытия Excel.
Получить количество строк и столбцов в таблице
Управление контентом
Операция с содержимым данных - получение ячейки на основе координат
Операция с содержимым данных - получение ячейки на основе имени строки и столбца
Содержимое данных операция чтения содержимого ячейки
Операция содержимого данных - запись содержимого ячейки
Другой
Большой объем прочитанных данных
Прочтите все содержимое ячеек - используйте этот метод, если объем данных велик, вам нужно выполнить только одну операцию, чтобы прочитать все содержимое до содержимого, избегайте повторения каждой ячейки для операции QAxObject
В это время результат сохраняется в QVariant, и его необходимо самостоятельно преобразовать в QList <QList>.
Запись большого количества данных
Большие данные хранятся в QList <QList>, что аналогично чтению, здесь сначала нужно указать диапазон области
Затем напишите данные
Пример: полная операция открытия-чтения-закрытия
нота:
1. В этом примере, чтобы увидеть эффект, настройки окна и предупреждения предназначены для отображения, измените значение на false самостоятельно.
2. Все операции в Excel выполняются через QAxObject для операций с компонентом COM, включая открытие файлов, поэтому путь должен проходить полный путь, а не относительный путь.
3. Сам QAxObject будет поддерживать новое пространство, просто удалите первый QAxObject напрямую
4. Все содержимое хранится в переменных var.
5. Все вышеперечисленные операции являются возвращаемыми значениями суждения, если в файле нет последующего содержимого, будет сообщено об ошибке.
Репутация: 0
Искал как создать Excel таблицу через Qt. Нашел только такой вариант:
Подскажите как создать Excel файл для последующей работы с ним?
Репутация: 12
Очевидно, никак, используя Qt.
Можно конечно взять QFile и реализовать на основе спецификации.
Но думаю это врядли интересно.
Навскидку, гугл выдает библиотеку, которая может облегчить жизнь.
Можно еще тут посмотреть.
Репутация: 12
Репутация: 8
Репутация: 94
Ещё один вариант, натолкнулся где-то в интернете, забахать простой HTML-ный файл с таблицей, а расширение задать ему XLS, Эксель его автоматически импртирует.
Как вам такой костыль?
Подскажите как создать Excel файл для последующей работы с ним? если работать из своего приложения собираешся, то естественный для Экселя путь - ActiveQt, как написал lanz, либо сторонние библиотеки, как указали предыдущие форумчане.Репутация: 12
нужно понимать, что при подключении библиотек типа ActiveQt потеряется переносимость программы на другие системы. так что лучше использовать не частные решения, а те средства, которые рекомендуются при разработке с использованием Qt, и работают с кроссплатформой.
Читайте также: