Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 10.02.2020, 12:42   #1
илья123456
Пользователь
 
Регистрация: 14.05.2014
Сообщений: 29
По умолчанию Запись в excel

Всем привет. Я щас задам глупый вопрос, но я не могу понять что не так делаю и может кто то поможет.
В общем у меня есть класс
Код:
#include "exelauto.h"
#include <ActiveQt/qaxobject.h>
#include <ActiveQt/qaxbase.h>

#include <QString>
#include <QFile>
#include <stdexcept>
#include <iostream>
#include <exception>

using namespace std;


exelauto::exelauto(bool closeExcelOnExit)
{
    m_closeExcelOnExit = closeExcelOnExit;
    m_excelApplication = nullptr;
    m_StatSheet = nullptr;
    m_sheet = nullptr;
    m_sheets = nullptr;
    m_workbook = nullptr;
    m_workbooks = nullptr;
    m_excelApplication = nullptr;

    m_excelApplication = new QAxObject( "Excel.Application", 0 );//{00024500-0000-0000-C000-000000000046}

    if (m_excelApplication == nullptr)
        throw invalid_argument("Failed to initialize interop with Excel (probably Excel is not installed)");

    m_excelApplication->dynamicCall( "SetVisible(bool)", false ); // hide excel
    m_excelApplication->setProperty( "DisplayAlerts", 0); // disable alerts

    m_workbooks = m_excelApplication->querySubObject( "Workbooks" );
    m_workbook = m_workbooks->querySubObject("Open(const QString&)", "D:/ProgramFiles/save.xlsx");
    m_sheets = m_workbook->querySubObject( "Worksheets" );
    //m_sheet = m_sheets->querySubObject( "Add" );
    m_sheet = m_sheets->querySubObject( "Add" );
    m_StatSheet = m_sheets->querySubObject( "Item(const QVariant&)", QVariant("ActiveSheet") );


}

void exelauto::SetCellValue(int lineIndex, int columnIndex, const QString& value)
{
    QAxObject *cell = m_sheet->querySubObject("Cells(int,int)", lineIndex, columnIndex);
    cell->setProperty("Value",value);
    delete cell;
}

void exelauto::SaveAs(const QString& fileName)
{
    if (fileName == "")
        throw invalid_argument("'fileName' is empty!");
    if (fileName.contains("/"))
        throw invalid_argument("'/' character in 'fileName' is not supported by excel!");

    if (QFile::exists(fileName))
    {
        if (!QFile::remove(fileName))
        {
            throw new std::exception();
        }
    }

}

exelauto::~exelauto()
{
  /*  // освобождение памяти
     delete  m_sheets;
     m_workbook->dynamicCall("Save()");
     delete  m_workbook;
     //закрываем книги
     delete  m_workbooks;
     //закрываем Excel
     m_excelApplication->dynamicCall("Quit()");
     delete m_excelApplication;*/

    delete m_StatSheet;
    m_sheets->clear();
            delete  m_sheets;
             m_sheets = NULL;
              m_workbook->dynamicCall("Save()");
             m_workbook->clear();
            delete  m_workbook;
             m_workbook = NULL;
             m_workbooks->dynamicCall( "Close" );
             m_workbooks->dynamicCall("Quit" );
             m_workbooks->clear();
            delete  m_workbooks;
             m_workbooks = NULL;
             m_excelApplication->dynamicCall( "Quit" );
            delete  m_excelApplication;
            m_excelApplication = NULL;
}
к нему я обращаюсь из основной формы
Код:
void MainWindow::zackritieexcel(){
    exelauto menuu;
    //------Таблица--------------
    menuu.SetCellValue(1,1,ui->lineEdit3Axis11->text());
    menuu.SetCellValue(2,1,ui->lineEdit3Axis12->text());
    menuu.SetCellValue(3,1,ui->lineEdit3Axis13->text());
    menuu.SetCellValue(1,2,ui->lineEdit3Axis21->text());
    menuu.SetCellValue(2,2,ui->lineEdit3Axis22->text());
    menuu.SetCellValue(3,2,ui->lineEdit3Axis23->text());
    menuu.SetCellValue(1,3,ui->lineEdit3Axis31->text());
    menuu.SetCellValue(2,3,ui->lineEdit3Axis32->text());
    menuu.SetCellValue(3,3,ui->lineEdit3Axis33->text());
    menuu.SetCellValue(6,1,ui->lineEdit2Axis41->text());
    menuu.SetCellValue(7,1,ui->lineEdit2Axis42->text());
    menuu.SetCellValue(6,2,ui->lineEdit2Axis43->text());
    menuu.SetCellValue(7,2,ui->lineEdit2Axis44->text());
    menuu.SetCellValue(10,1,ui->lineEdit1Axis45->text());
}
так вот все это работает и excel закрывается как приложение, но остается в фоновых процессах.
Так вот подскажите как закрыть его там?

Я закрыл как мог и при запуске программы excel тоже открываю и от там закрывается как нужно, а при выходе из программы и сохранении данных он не закрывается.
илья123456 вне форума Ответить с цитированием
Старый 11.02.2020, 11:41   #2
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 13
По умолчанию

Написал в личные по запарке. Там смотри.
Subst вне форума Ответить с цитированием
Старый 11.02.2020, 12:08   #3
илья123456
Пользователь
 
Регистрация: 14.05.2014
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Subst Посмотреть сообщение
Написал в личные по запарке. Там смотри.
Я посмотрел и ответ на твое сообщение
Это в заголовке
private slots:
void closeEvent(QCloseEvent *); //Автосохранение списка при выходе - событие closeEvent
void zackritieexcel();//закрытие файла Excel
А вызываю функцию
void MainWindow::closeEvent(QCloseEvent *event) {
zapisvfail();
zackritieexcel();
}
а и даже если добавить скобки к close и quit не поменялось нечего. по прежнему висит в фоновых процессах.

Последний раз редактировалось илья123456; 11.02.2020 в 12:12. Причина: дополнил
илья123456 вне форума Ответить с цитированием
Старый 11.02.2020, 12:35   #4
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 13
По умолчанию

Я не вижу уничтожение объекта класса exelauto.

У тебя закрытие и прочее происходит в деструкторе.
Класс exelauto вроде никому не принадлежит, т.е. нет явного указания на родительский объект (т.е. при уничтожении MainWindow объект класса exelauto не обязан уничтожаться).
Потому и спрашиваю, как создается объект и как убивается
Subst вне форума Ответить с цитированием
Старый 11.02.2020, 15:41   #5
илья123456
Пользователь
 
Регистрация: 14.05.2014
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Subst Посмотреть сообщение
Я не вижу уничтожение объекта класса exelauto.

У тебя закрытие и прочее происходит в деструкторе.
Класс exelauto вроде никому не принадлежит, т.е. нет явного указания на родительский объект (т.е. при уничтожении MainWindow объект класса exelauto не обязан уничтожаться).
Потому и спрашиваю, как создается объект и как убивается
exelauto.zip
илья123456 вне форума Ответить с цитированием
Старый 11.02.2020, 18:21   #6
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 13
По умолчанию

Цитата:
Сообщение от илья123456 Посмотреть сообщение
принципиально, все более менее нормально. У меня в тесте отработало.
Косись в сторону версии Excel.
Ну и несколько моментов:
добавь
m_excelApplication->dynamicCall( "SetInteractive(bool)", false );

убери или исправь на правильное
m_StatSheet = m_sheets->querySubObject( "Item(const QVariant&)", QVariant("ActiveSheet") );

у sheets Item(номер)

если же ActiveSheet использовать, то это свойство ExcelApplication
IDispatch* ActiveSheet;

В файлах сгененрированные доки по интерфейсам
Вложения
Тип файла: rar Excel.rar (205.8 Кб, 1 просмотров)
Subst вне форума Ответить с цитированием
Старый 11.02.2020, 18:39   #7
илья123456
Пользователь
 
Регистрация: 14.05.2014
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Subst Посмотреть сообщение
принципиально, все более менее нормально. У меня в тесте отработало.
Косись в сторону версии Excel.
Ну и несколько моментов:
добавь
m_excelApplication->dynamicCall( "SetInteractive(bool)", false );

убери или исправь на правильное
m_StatSheet = m_sheets->querySubObject( "Item(const QVariant&)", QVariant("ActiveSheet") );

у sheets Item(номер)

если же ActiveSheet использовать, то это свойство ExcelApplication
IDispatch* ActiveSheet;

В файлах сгененрированные доки по интерфейсам
хорошо буду пробывать) да и пока не известно с какой версией excel буду работать потом. Спасибо :-)
илья123456 вне форума Ответить с цитированием
Старый 11.02.2020, 19:06   #8
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 13
По умолчанию

Да не за что.
Отпишись хоть.

И пара лайфхаков.

ты можешь генерить доки именно по твоей версии Excel. Это раз.
Два - ты можешь отлавливать исключения ActiveX.

В работе помогает.
Subst вне форума Ответить с цитированием
Старый 12.02.2020, 10:39   #9
илья123456
Пользователь
 
Регистрация: 14.05.2014
Сообщений: 29
По умолчанию

Цитата:
Сообщение от Subst Посмотреть сообщение
Да не за что.
Отпишись хоть.

И пара лайфхаков.

ты можешь генерить доки именно по твоей версии Excel. Это раз.
Два - ты можешь отлавливать исключения ActiveX.

В работе помогает.
Subst,
Код:
добавь
m_excelApplication->dynamicCall( "SetInteractive(bool)", false );
это не помогает, но я тут подумал может если не придумаю нечего, то просто заменю на загрузку в текстовый файл.
Ведь у меня это для просто для автосохранения данных и дальше не пойдет никуда, да и проще будет даже, а для обработки выходной информации у меня сделан другой запуск экселя где сохраняю уже в ручную.
Код:
убери или исправь на правильное
m_StatSheet = m_sheets->querySubObject( "Item(const QVariant&)", QVariant("ActiveSheet") );
эту часть я убрал т.к. это и не нужно мне, да и поставил думал что может как то так будет работать. Так что спасибо и извините что обратился) И отдельно огромное спасибо, что помогли разобраться)
илья123456 вне форума Ответить с цитированием
Старый 12.02.2020, 16:04   #10
Subst
Пользователь
 
Регистрация: 30.01.2020
Сообщений: 13
По умолчанию

Я обычно в CSV или XML сохраняю.
Это удобней и универсальней нежели в Excel.

Отрытые форматы, прочитать и перетащить можно где угодно и куда угодно
Subst вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массивы - Спроектировать и разработать классы Запись в блокноте и Блокнот. Реализовать методы: Добавить запись, Удалить запись, Редактировать запись SashaRozhkov Помощь студентам 0 05.08.2017 20:16
запись excel fcdk_pavel Общие вопросы Delphi 0 13.09.2013 10:11
Запись БД Acsess из Excel Град Microsoft Office Excel 1 17.10.2008 12:38
запись в БД(*.MDB) из Excel VB MUZDIE Microsoft Office Excel 1 18.01.2008 18:13
Запись в БД(*.MDB) из Excel VB MUZDIE Помощь студентам 2 18.01.2008 13:58