Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2020, 11:32   #1
илья123456
Пользователь
 
Регистрация: 14.05.2014
Сообщений: 29
По умолчанию из Excel в lineedit

Всем привет. В общем я не понимаю как прочитать из Excel только одну ячейку. Т.е у меня программа закидывает из разных lineedit данные в Excel таким образом создал своеобразную базу, но теперь мне нужно в обратном порядке в те же lineedit записать данные из Excel. Как загружать всю таблицу я понял, но а если только одну ячейку нужно взять и поместить в lineedit.
Это загрузка в файл
Код:
ExelWork menuu;
    const QString fileName = "D://exampleTable1.xlsx";
    //------Таблица--------------
    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());
    //----------------------------
    menuu.SaveAs(fileName);
и как достать в tableWidget я понял и в коде что идет перебор, а если не нужен перебор, а конкретная ячейка я не пойму как.
Код:
QAxObject* excel = new QAxObject("Excel.Application", 0);
    QAxObject* workbooks = excel->querySubObject("Workbooks");
    QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", "D:\\exampleTable1.xlsx");
    QAxObject* sheets = workbook->querySubObject("Worksheets");
    QAxObject* sheet = sheets->querySubObject("Item(int)", 1);
    sheets->property("Count").toInt();
    QAxObject* usedRange = sheet->querySubObject("UsedRange");
    QAxObject* rows = usedRange->querySubObject("Rows");
    int countRows = rows->property("Count").toInt();
    QAxObject* columns = usedRange->querySubObject("Columns");
    int countCols = columns->property("Count").toInt();
    //ui->tableWidget->setRowCount(countRows);
   // ui->tableWidget->setColumnCount(countCols);
    for ( int row = 0; row < countRows; row++ ){
        for ( int column = 0; column < countCols; column++ ){
            QAxObject* cell = sheet->querySubObject("Cells(int,int)", column + 1, row + 1);
            QVariant value = cell->property("Value");
            QTableWidgetItem* item = new QTableWidgetItem(value.toString());
            qDebug() << "Строка" << row;
               qDebug() << "Колонка" << column ;
        }
    }
илья123456 вне форума Ответить с цитированием
Старый 15.01.2020, 14:45   #2
илья123456
Пользователь
 
Регистрация: 14.05.2014
Сообщений: 29
По умолчанию

Как взять значение из ячейки QTableWidget я тоже знаю, но он мне не нужен, у меня по сути будет так что при завершении работы идет выгрузка в excel из lineedit, а при загрузки в них же должна обратно сохранненая информация загружаться
илья123456 вне форума Ответить с цитированием
Старый 15.01.2020, 16:51   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

А GetCellValue метода нет случайно?
waleri вне форума Ответить с цитированием
Старый 15.01.2020, 18:18   #4
илья123456
Пользователь
 
Регистрация: 14.05.2014
Сообщений: 29
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А GetCellValue метода нет случайно?
Все разобрался может криво, но если кто то знает как можно сделать проще подскажите вот что я настругал:
Код:
 void MainWindow::otckritieexcel(){
   int i,j;
      QVector<float> mas;
    QAxObject* excel = new QAxObject("Excel.Application", 0);
        QAxObject* workbooks = excel->querySubObject("Workbooks");
        QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", "D:/save.xlsx");
        QAxObject* sheets = workbook->querySubObject("Worksheets");
        QAxObject* sheet = sheets->querySubObject("Item(int)", 1);
        sheets->property("Count").toInt();
        QAxObject* usedRange = sheet->querySubObject("UsedRange");
        QAxObject* rows = usedRange->querySubObject("Rows");
        int countRows = rows->property("Count").toInt();
        QAxObject* columns = usedRange->querySubObject("Columns");
        int countCols = columns->property("Count").toInt();
      for(i=1; i<=countRows; i++){//считываю информацию из 3 столбца файла
        for(j=1; j<=countCols; j++){//считываю информацию из 3 столбца файла
            QAxObject* cell = sheet->querySubObject("Cells(QVariant,QVariant)", i, j);
            QVariant vv = cell->property("Value");
            float ss = vv.toFloat() ;
            mas.append(ss);
            if (i == 1 && j==1){ui->lineEdit3Axis11->setText(QString::number(ss));}
            if (i == 2 && j==1){ui->lineEdit3Axis12->setText(QString::number(ss));}
            if (i == 3 && j==1){ui->lineEdit3Axis13->setText(QString::number(ss));}
            if (i == 1 && j==2){ui->lineEdit3Axis21->setText(QString::number(ss));}
            if (i == 2 && j==2){ui->lineEdit3Axis22->setText(QString::number(ss));}
            if (i == 3 && j==2){ui->lineEdit3Axis23->setText(QString::number(ss));}
            if (i == 1 && j==3){ui->lineEdit3Axis31->setText(QString::number(ss));}
            if (i == 2 && j==3){ui->lineEdit3Axis32->setText(QString::number(ss));}
            if (i == 3 && j==3){ui->lineEdit3Axis33->setText(QString::number(ss));}
            if (i == 6 && j==1){ui->lineEdit2Axis41->setText(QString::number(ss));}
            if (i == 7 && j==1){ui->lineEdit2Axis42->setText(QString::number(ss));}
            if (i == 6 && j==2){ui->lineEdit2Axis43->setText(QString::number(ss));}
            if (i == 7 && j==2){ui->lineEdit2Axis44->setText(QString::number(ss));}
            if (i == 10 && j==1){ui->lineEdit1Axis45->setText(QString::number(ss));}
      }
   }
    sheets->clear();delete sheets;sheets = NULL;
    workbook->clear();delete workbook;workbook = NULL;
    workbooks->dynamicCall( "Close" );workbooks->clear();delete workbooks;workbooks = NULL;
    excel->dynamicCall( "Quit" );delete excel;excel = NULL;
}
илья123456 вне форума Ответить с цитированием
Старый 16.01.2020, 09:11   #5
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

Цитата:
Сообщение от илья123456 Посмотреть сообщение
как можно сделать проще
насчёт как проще - не знаю, а вот утечки памяти (в частности sheet,usedRange,columns,cell) подправить - запросто

ещё добавил
Код:
workbook->dynamicCall("Close(Boolean)", false);
а то могут оставаться незакрытыми процессы экселя

Код:
void MainWindow::otckritieexcel()
{
	using AXPTR=QSharedPointer<QAxObject>;

	const QHash<QPair<int/*row*/,int/*col*/>,QSharedPointer<QLineEdit>> edits
	{
		{{ 1,1},ui->lineEdit3Axis11},
		{{ 2,1},ui->lineEdit3Axis12},
		{{ 3,1},ui->lineEdit3Axis13},
		{{ 1,2},ui->lineEdit3Axis21},
		{{ 2,2},ui->lineEdit3Axis22},
		{{ 3,2},ui->lineEdit3Axis23},
		{{ 1,3},ui->lineEdit3Axis31},
		{{ 2,3},ui->lineEdit3Axis32},
		{{ 3,3},ui->lineEdit3Axis33},
		{{ 6,1},ui->lineEdit2Axis41},
		{{ 7,1},ui->lineEdit2Axis42},
		{{ 6,2},ui->lineEdit2Axis43},
		{{ 7,2},ui->lineEdit2Axis44},
		{{10,1},ui->lineEdit1Axis45},
	};

	QVector<float> mas;
	if(auto excel=AXPTR::create(new QAxObject("Excel.Application", 0)))
	{
		if(auto workbooks=AXPTR{excel->querySubObject("Workbooks")})
		{
			if(auto workbook=AXPTR{workbooks->querySubObject("Open(const QString&)", "D:/save.xlsx")})
			{
				if(auto sheets=AXPTR{workbook->querySubObject("Worksheets")})
				{
					[&]()
					{
						auto sheet=AXPTR{sheets->querySubObject("Item(int)", 1)};
						if(! sheet) return;

						auto usedRange=AXPTR{sheet->querySubObject("UsedRange")};
						if(! usedRange) return;

						auto rows=AXPTR{usedRange->querySubObject("Rows")};
						if(! rows)return;

						auto columns=AXPTR{usedRange->querySubObject("Columns")};
						if(! columns)return;

						int countRows = rows->property("Count").toInt();
						int countCols = columns->property("Count").toInt();
						for(int row=1; row<=countRows; row++)
						{
							for(int col=1; col<=countCols; col++)
							{
								auto cell=AXPTR{sheet->querySubObject("Cells(QVariant,QVariant)", row, col)};
								if(!cell)continue;

								if(auto edit=edits[QPair<int,int>(row,col)])
								{
									const float val = cell->property("Value").toFloat();
									mas.append(val);
									edit->setText(QString::number(val));
								}
							}
						}
					}();
				}

				workbook->dynamicCall("Close(Boolean)", false);
			}

			workbooks->dynamicCall( "Close" );
		}

		excel->dynamicCall( "Quit(void)" );
	}
}
Алексей1153 вне форума Ответить с цитированием
Старый 16.01.2020, 12:52   #6
илья123456
Пользователь
 
Регистрация: 14.05.2014
Сообщений: 29
По умолчанию

Алексей1153, А вот тогда есть вопрос. Я сделал еще автосохранение этого же файла. Файл закрывается и сохраняется на автомате, но т.к у меня не активирован майкрософт до конца, окна по этому поводу сами не закрываются. И тут возникает вопрос какие команды на это влияют?
Реализовал вот так:
Код:
#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_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:\\save.xlsx");
    m_sheets = m_workbook->querySubObject( "Worksheets" );
    m_sheet = m_sheets->querySubObject( "Add" );



}

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()
{
    if (m_excelApplication != nullptr)
    {
        if (!m_closeExcelOnExit)
        {
            m_excelApplication->setProperty("DisplayAlerts", 1);
            m_excelApplication->dynamicCall("SetVisible(bool)", true );
        }

        if (m_workbook != nullptr && m_closeExcelOnExit)
        {
            m_workbook->dynamicCall("Close (Boolean)", true);
            m_excelApplication->dynamicCall("Quit (void)");
        }
    }

   /*delete m_sheet;
    delete m_sheets;
    delete m_workbook;
    delete m_workbooks;
    delete m_excelApplication;*/
    m_excelApplication ->dynamicCall( "Save" );
    m_workbook ->dynamicCall( "Save" );
    m_sheet ->dynamicCall( "Save" );
    m_workbooks->dynamicCall( "Save" );
    m_sheets->dynamicCall("Save");


   m_workbooks->dynamicCall( "Close" );m_workbooks->clear();delete m_workbooks;m_workbooks = NULL;m_workbooks->dynamicCall( "Close" );
    m_sheets->clear();delete m_sheets;m_sheets = NULL;m_sheets->dynamicCall( "Close" );
    m_workbook->clear();delete m_workbook;m_workbook = NULL;m_workbook->dynamicCall( "Close" );
    m_excelApplication->clear();delete m_excelApplication;m_excelApplication = NULL;m_excelApplication->dynamicCall( "Close" );
    m_sheet->clear();delete  m_sheet; m_sheet = NULL;m_sheet->dynamicCall( "Close" );


    m_excelApplication ->dynamicCall("Quit");
    m_workbook ->dynamicCall("Quit");
    m_sheet ->dynamicCall("Quit");
    m_workbooks->dynamicCall("Quit");
    m_sheets->dynamicCall("Quit");

}
Код:
#ifndef EXELAUTO_H
#define EXELAUTO_H
#include <QMainWindow>
#include <QObject>
#include <QWidget>
#include <ActiveQt/qaxobject.h>
#include <ActiveQt/qaxbase.h>
#include <QString>

class exelauto
{
public:
  exelauto(const exelauto& other) = delete;
    exelauto& operator=(const exelauto& other) = delete;

    exelauto(bool closeExcelOnExit = false);
    void SetCellValue(int lineIndex, int columnIndex, const QString& value);
    void SaveAs(const QString& fileName);
    ~exelauto();

private:
    QAxObject* m_excelApplication;
    QAxObject* m_workbooks;
    QAxObject* m_workbook;
    QAxObject* m_sheets;
    QAxObject* m_sheet;
    bool m_closeExcelOnExit;
};

#endif // EXELAUTO_H
Изображения
Тип файла: jpg 323.jpg (23.2 Кб, 18 просмотров)
Тип файла: jpg 4324.jpg (26.3 Кб, 18 просмотров)
илья123456 вне форума Ответить с цитированием
Старый 17.01.2020, 11:16   #7
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

илья123456, я не знаю точного ответа. Кое-где видел - рекомендуют скрыть окно экселя перед закрытием

Код:
excel->dynamicCall( "SetVisible(bool)", false );
якобы тогда никакое всплывающее окно не должно выскакивать. Попробуй
Алексей1153 вне форума Ответить с цитированием
Старый 18.01.2020, 10:45   #8
илья123456
Пользователь
 
Регистрация: 14.05.2014
Сообщений: 29
По умолчанию

Алексей1153, Не все равно, ладно может если нормальный офис такого не будет
илья123456 вне форума Ответить с цитированием
Старый 18.01.2020, 12:22   #9
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 947
По умолчанию

кстати, я же накосячил )

вот в этой строке
Код:
const QHash<QPair<int/*row*/,int/*col*/>,QSharedPointer<QLineEdit>> edits
конечно же следует исправить её на

Код:
const QHash<QPair<int/*row*/,int/*col*/>,QLineEdit*> edits
косяк остался от тестирования, я там заполнил структуру
Код:
static struct
{
	QSharedPointer<QLineEdit> lineEdit3Axis11{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit3Axis12{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit3Axis13{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit3Axis21{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit3Axis22{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit3Axis23{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit3Axis31{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit3Axis32{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit3Axis33{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit2Axis41{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit2Axis42{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit2Axis43{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit2Axis44{new QLineEdit};
	QSharedPointer<QLineEdit> lineEdit1Axis45{new QLineEdit};

	auto* operator->()
	{
		return this;
	}
}ui;

Последний раз редактировалось Алексей1153; 18.01.2020 в 12:24.
Алексей1153 вне форума Ответить с цитированием
Старый 19.01.2020, 12:55   #10
илья123456
Пользователь
 
Регистрация: 14.05.2014
Сообщений: 29
По умолчанию

Алексей1153, Спасибо за все огромное). У меня щас другие проблемы с соединением с другим устройством пытаюсь разобраться что и как для того чтобы выгружать то что он дает в эксель. Если я с роутером соедениться не могу, то это капец, но это уже не тема данного раздела))))).
илья123456 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подпись LineEdit на Python PyQt5 pigeon890 Python 4 28.01.2019 16:27
вывести данные в новую книгу Excel из другой книги Excel через VBA Алла94 Microsoft Office Excel 0 08.10.2014 16:16
Как запускать макросы созданные в Excel 2013, другим пользователям в Excel 2007 RISagitov Microsoft Office Excel 8 20.07.2014 22:45
Почему Excel 2010 выполняет поиск гораздо медленнее чем Excel 2003 Sprat Microsoft Office Excel 1 25.10.2011 05:34
Формирование из excel в ASCII, у меня он формирует по одному клиенту а в Excel нескол Askat Общие вопросы Delphi 0 18.07.2007 06:28