Russian Qt Forum
Май 01, 2024, 02:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сохранить таблицу в файл Excel, ну или на крайний случай в текстовый файл?  (Прочитано 7265 раз)
Elrow
Гость
« : Июнь 03, 2012, 19:08 »

Как сохранить таблицу в файл Excel, ну или на крайний случай в текстовый файл?

Везде написано, что надо конвертировать в csv или же пользоваться ActiveQ

Пытаюсь использовать код из этой темы - http://www.prog.org.ru/topic_11249_0.html , но не очень получается

Ругается на то что я пытаюсь присвоить QByteArray = Qstring
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июнь 03, 2012, 19:49 »

Учитывая тот огромный объём кода, который вы привели, могу посоветовать только не присваивать  QByteArray = Qstring.  Веселый
Записан
CJ1
Гость
« Ответ #2 : Июнь 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 такая, чтобы получить значения, тебе нужно найти все эти команды, и мне тож дашь ссылку на эти команды, а то я еле нашел эти...
Записан
DmitryM
Гость
« Ответ #3 : Июнь 04, 2012, 10:35 »

я в таких случаях в HTML фигачу, Libre/MS Office вроде неплохо импортирует html.
Записан
mutineer
Гость
« Ответ #4 : Июнь 04, 2012, 11:28 »

я в таких случаях в HTML фигачу, Libre/MS Office вроде неплохо импортирует html.

CSV как-то проще и лучше импортируется))
Записан
Alex_C
Гость
« Ответ #5 : Июнь 05, 2012, 16:57 »

CSV как-то проще и лучше импортируется))

При импортировании из CSV возможны проблемы типа - необходимо указать код товара 21.02.12 - а в экселе у пользователя это будет высвечиваться как 21 февраля 2012 года Улыбающийся . Самый правильный подход - через активх - с заданием формата ячеек.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 22.