Название: Как сохранить таблицу в файл Excel, ну или на крайний случай в текстовый файл?
Отправлено: Elrow от Июнь 03, 2012, 19:08
Как сохранить таблицу в файл Excel, ну или на крайний случай в текстовый файл?
Везде написано, что надо конвертировать в csv или же пользоваться ActiveQ
Пытаюсь использовать код из этой темы - http://www.prog.org.ru/topic_11249_0.html , но не очень получается
Ругается на то что я пытаюсь присвоить QByteArray = Qstring
Название: Re: Как сохранить таблицу в файл Excel, ну или на крайний случай в текстовый файл?
Отправлено: LisandreL от Июнь 03, 2012, 19:49
Учитывая тот огромный объём кода, который вы привели, могу посоветовать только не присваивать QByteArray = Qstring. :D
Название: Re: Как сохранить таблицу в файл Excel, ну или на крайний случай в текстовый файл?
Отправлено: CJ1 от Июнь 04, 2012, 08:07
Я щас тоже это буду делать, На тебе мой код импорта из excell QMessageBox msgBox; // Открываю диалог выбора файла QString s = QFileDialog::getOpenFileName(this, "Импорт Excel","C:\\","Excel (*.xls *.xlsx)"); if (s == NULL) return; // если вернул ноль то выход
// Создаю Excel QAxWidget *excel = new QAxWidget("Excel.Application"); if (excel == NULL) { msgBox.setWindowTitle("Ошибка Excel"); msgBox.setIcon(QMessageBox::Critical); msgBox.setText("Возможно не установлен excel"); msgBox.exec(); return; // если вернул ноль то выход } excel->setProperty("Visible", false); // Делаю его невидимым excel->setProperty("DisplayAlerts", "0"); // Это мне надо, отключает гуеву ругань на различного рода ошибки, чтоб процесс выполнения программы на ошибках и предупреждениях не прерывался
QAxObject *workbooks = excel->querySubObject( "Workbooks" ); //получаем ссылу на коллекцию книг // Не получили коллекцию книг if (workbooks == NULL) { msgBox.setWindowTitle("Ошибка Excel"); msgBox.setIcon(QMessageBox::Critical); msgBox.setText("Не могу получить коллекцию книг Excel"); msgBox.exec(); return; // если вернул ноль то выход }
QAxObject *shab = workbooks->querySubObject("Open(const QString&)", s); // открываем книгу, хранящуюся на диске, и получаем на нее ссылу // Ошибка открытия файла if (shab == NULL) { msgBox.setWindowTitle("Ошибка Excel"); msgBox.setIcon(QMessageBox::Critical); msgBox.setText("Файл по какойто причине не открылся: " + s); msgBox.exec(); return; // если вернул ноль то выход }
// Получаю ссылку на Sheets QAxObject * Sheets =shab->querySubObject("Sheets"); // Ошибка открытия файла if (Sheets == NULL) { msgBox.setWindowTitle("Ошибка Excel"); msgBox.setIcon(QMessageBox::Critical); msgBox.setText("Ошибка Sheets"); msgBox.exec(); return; // если вернул ноль то выход }
//Загружаю первую страницу "Теле радио каналы" QAxObject * worksheet =Sheets->querySubObject("Item(const QVariant&)", QVariant("Теле радио каналы")); // Ошибка при загрузки первой страницы if (worksheet == NULL) { msgBox.setWindowTitle("Ошибка Excel"); msgBox.setIcon(QMessageBox::Critical); msgBox.setText("Ошибка при загрузки первой страницы \"Теле радио каналы\" "); msgBox.exec(); return; // если вернул ноль то выход } worksheet->dynamicCall("Select()");
QAxObject * usedrange =worksheet->querySubObject("UsedRange"); // Ошибка UsedRange if (usedrange == NULL) { msgBox.setWindowTitle("Ошибка Excel"); msgBox.setIcon(QMessageBox::Critical); msgBox.setText("Ошибка usedrange"); msgBox.exec(); return; // если вернул ноль то выход }
QAxObject * rows = usedrange->querySubObject("Rows"); // Ошибка Rows if (rows == NULL) { msgBox.setWindowTitle("Ошибка Excel"); msgBox.setIcon(QMessageBox::Critical); msgBox.setText("Ошибка rows"); msgBox.exec(); return; // если вернул ноль то выход } QAxObject * columns = usedrange->querySubObject("Columns"); // Ошибка Columns if (columns == NULL) { msgBox.setWindowTitle("Ошибка Excel"); msgBox.setIcon(QMessageBox::Critical); msgBox.setText("Ошибка columns"); msgBox.exec(); return; // если вернул ноль то выход } int intRowStart = usedrange->property("Row").toInt(); //Получаю начало строчки int intColStart = usedrange->property("Column").toInt(); //Получаю начало столбца int intCols = columns->property("Count").toInt(); //Получаю columns int intRows = rows->property("Count").toInt(); //Получаю rows
ui->tableWidget->clear(); //Отчищаю таблицу на всякий случай ui->tableWidget->setRowCount(intRows); // Устанавливаю количество строк ui->tableWidget->setColumnCount(intCols); // Устанавливаю количество столбцов
//Выделяем память под каждую ячейку for(int i = 0; i <= intRowStart + intRows; i++){ for(int j = 0; j <= intColStart + intCols; j++){ QTableWidgetItem *newItem = new QTableWidgetItem(""); ui->tableWidget->setItem( i, j, newItem);
}
}
// Читаю из Exsel и записываю в Таблицу tableWidget for (int i = intRowStart; i < intRowStart + intRows; i++) { for (int j = intColStart; j < intColStart + intCols; j++) { // Получаю ячейку с индексом i,j QAxObject * range = worksheet->querySubObject("Cells(int,int)", i, j ); // Беру из ячейки значения QString kz = range->property("Value").toString(); // Выделяю память под индекс и записываю туда значения QTableWidgetItem *newItem = new QTableWidgetItem(kz); // Получаю объект Font из Exsel QAxObject *font= range->querySubObject("Font"); // Если шрифт ячейки жирный то делаю это ячейку не редактируемой if (font->property("Bold").toBool()) { newItem->setFlags(Qt::ItemIsEnabled); QFont f; f.setBold(true); newItem->setFont(f); } // Занашу значения в ячейку ui->tableWidget->setItem( i-1, j-1, newItem); } }
по нему сделай, сохранения в excel И напиши мне сюда, а то я потом тоже пыхаться буду. Смотри, вот пример range->property("Value").toString(); Видишь, Value это команда в excel такая, чтобы получить значения, тебе нужно найти все эти команды, и мне тож дашь ссылку на эти команды, а то я еле нашел эти...
Название: Re: Как сохранить таблицу в файл Excel, ну или на крайний случай в текстовый файл?
Отправлено: DmitryM от Июнь 04, 2012, 10:35
я в таких случаях в HTML фигачу, Libre/MS Office вроде неплохо импортирует html.
Название: Re: Как сохранить таблицу в файл Excel, ну или на крайний случай в текстовый файл?
Отправлено: mutineer от Июнь 04, 2012, 11:28
я в таких случаях в HTML фигачу, Libre/MS Office вроде неплохо импортирует html.
CSV как-то проще и лучше импортируется))
Название: Re: Как сохранить таблицу в файл Excel, ну или на крайний случай в текстовый файл?
Отправлено: Alex_C от Июнь 05, 2012, 16:57
CSV как-то проще и лучше импортируется))
При импортировании из CSV возможны проблемы типа - необходимо указать код товара 21.02.12 - а в экселе у пользователя это будет высвечиваться как 21 февраля 2012 года :) . Самый правильный подход - через активх - с заданием формата ячеек.
|