700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > “QT下Excel文件的读写” 实战2——读取并显示表格全部内容

“QT下Excel文件的读写” 实战2——读取并显示表格全部内容

时间:2019-05-19 10:17:59

相关推荐

“QT下Excel文件的读写” 实战2——读取并显示表格全部内容

接上篇 QT下Excel文件的读写” 实战1——简介及读取特定单元格

四、读表格全部内容

1、运行结果

点击“打开文件”按钮,在文件选择窗口选择并打开excel文件(test.xlsx),所有内容显示在第一个tableview。输入目标单元格的行号和列号,点击“获取单元格”按钮,该单元格内容显示在第二个tableview。

2、源码

MainWindow函数 (及其析构)

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent){setWindowTitle("Excel Reader");//设置程序的窗口标题为“Excel Reader”。setGeometry(QRect(QPoint(300, 300), QSize(1000, 600)));//设置窗口的位置和大小。button1 = new QPushButton("打开文件", this);//创建一个QPushButton对象,文本标签为“ ”,并将它添加到MainWindow类的窗口中。button1->setGeometry(QRect(QPoint(550, 20), QSize(100, 30)));//设置按钮的位置和大小。button2 = new QPushButton("读取单元格", this);//创建一个QPushButton对象,文本标签为“ ”,并将它添加到MainWindow类的窗口中。button2->setGeometry(QRect(QPoint(440, 140), QSize(100, 30)));//设置按钮的位置和大小。tableView1 = new QTableView(this); //创建一个QTableView对象,并将它添加到MainWindow类的窗口中。tableView1->setGeometry(QRect(QPoint(10, 100), QSize(400, 300))); //设置表格视图的位置和大小。tableView2 = new QTableView(this); //创建一个QTableView对象,并将它添加到MainWindow类的窗口中。tableView2->setGeometry(QRect(QPoint(600, 100), QSize(100, 65))); //设置表格视图的位置和大小。lineText = new QLineEdit(this);lineText->setGeometry(QRect(QPoint(10, 20), QSize(500, 30))); //设置表格视图的位置和大小。spinBox1 = new QSpinBox(this);spinBox1->setMaximum(999);spinBox1->setMinimum(1);spinBox1->setGeometry(QRect(QPoint(440, 100), QSize(50, 30))); //设置表格视图的位置和大小。spinBox2 = new QSpinBox(this);spinBox2->setMaximum(999);spinBox2->setMinimum(1);spinBox2->setGeometry(QRect(QPoint(500, 100), QSize(50, 30))); //设置表格视图的位置和大小。connect(button1, SIGNAL(clicked()), this, SLOT( loadExcelData() ) );connect(button2, SIGNAL(clicked()), this, SLOT( showCellData() ) );}MainWindow::~MainWindow(){delete excel;//在程序退出时释放之前打开的Excel对象。}

槽函数 loadExcelData

函数功能:“打开文件”按钮按下功能函数,打开并呈现表格文件。

void MainWindow::loadExcelData(){QString filePath = QFileDialog::getOpenFileName(this, tr("Open Excel file"), "", tr("Excel Files (*.xlsx *.xls)"));if (!filePath.isEmpty()){lineText->setText(filePath);excel = new QAxObject("Excel.Application", this); //创建了一个QAxObject对象,用于访问Excel应用程序的COM接口。excel->setProperty("Visible", false);//设置Excel应用程序的可见性为false,即不显示Excel应用程序的窗口。QAxObject *workbooks = excel->querySubObject("Workbooks"); //创建了一个QAxObject对象,用于访问Excel应用程序的Workbooks对象。QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filePath); //使用Workbooks对象的querySubObject函数打开指定的Excel文件,并返回一个QAxObject对象,用于访问打开的Excel文件。QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1); //使用打开的Excel文件的querySubObject函数访问其中的第一个工作表,并返回一个QAxObject对象,用于访问这个工作表。QAxObject *usedRange = worksheet->querySubObject("UsedRange");QAxObject *rows = usedRange->querySubObject("Rows");QAxObject *columns = usedRange->querySubObject("Columns");int row_count = rows->property("Count").toInt(); // 获取Excel文件中的行数int column_count = columns->property("Count").toInt(); // 获取Excel文件中的列数QStringList data_list;for (int i = 1; i <= row_count; i++) {QString row_data;for (int j = 1; j <= column_count; j++) {QAxObject *cell = worksheet->querySubObject("Cells(int, int)", i, j);QString cell_value = cell->dynamicCall("Value()").toString();row_data += cell_value + "\t";cell->clear();delete cell;}data_list << row_data;}QStandardItemModel *model = new QStandardItemModel();for (int i = 0; i < data_list.count(); i++) {QStringList row_data = data_list.at(i).split("\t", Qt::SkipEmptyParts);for (int j = 0; j < row_data.count(); j++) {QStandardItem *item = new QStandardItem(row_data.at(j));model->setItem(i, j, item);}}tableView1->setModel(model);workbook->dynamicCall("Close()");excel->dynamicCall("Quit()");}}

槽函数 showCellData

函数功能:“获取单元格”按钮按下功能函数,呈现指定单元格的内容。

void MainWindow::showCellData(){int rowIndex = spinBox1->value();int columnIndex = spinBox2->value();QString filePath = lineText->text();if (!filePath.isEmpty()) {excel = new QAxObject("Excel.Application", this); //创建了一个QAxObject对象,用于访问Excel应用程序的COM接口。excel->setProperty("Visible", false);//设置Excel应用程序的可见性为false,即不显示Excel应用程序的窗口。QAxObject *workbooks = excel->querySubObject("Workbooks"); //创建了一个QAxObject对象,用于访问Excel应用程序的Workbooks对象。QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filePath); //使用Workbooks对象的querySubObject函数打开指定的Excel文件,并返回一个QAxObject对象,用于访问打开的Excel文件。QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1); //使用打开的Excel文件的querySubObject函数访问其中的第一个工作表,并返回一个QAxObject对象,用于访问这个工作表。QAxObject *cell = worksheet->querySubObject("Cells(int, int)", rowIndex, columnIndex); //使用工作表的querySubObject函数访问其中的第x行第y列的单元格,并返回一个QAxObject对象,用于访问这个单元格。QString value = cell->dynamicCall("Value()").toString();//使用单元格的dynamicCall函数获取单元格中的值,并将它转换为一个QString对象。QStandardItemModel *model = new QStandardItemModel(); //创建了一个QStandardItemModel对象,用于在表格视图中显示数据。model->setItem(0, 0, new QStandardItem(value));//将单元格中的值作为一个QStandardItem对象添加到模型的第0行第0列。tableView2->setModel(model); //将模型对象设置为表格视图的数据模型,这样就可以在表格视图中显示数据了。workbook->dynamicCall("Close()"); //使用动态调用的方式关闭Excel文件。excel->dynamicCall("Quit()");}}

五、读表格全部内容(UI版)

功能与上面一样,界面由QtUI设计。

1、运行结果

2、源码

UIMainWindow函数 (及其析构)

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) // 调用基类QMainWindow的构造函数, ui(new Ui::MainWindow)// 创建一个新的MainWindow界面{ui->setupUi(this); // 使用ui文件中的定义来设置MainWindow的UI,即窗口上的各种控件// 初始化各种控件// 初始化 pushButton_1 和 pushButton_2pushButton_1 = ui->pushButton_1;pushButton_2 = ui->pushButton_2;// 初始化 lineEditlineEdit = ui->lineEdit;// 初始化 tableView_1 和 tableView_2tableView_1 = ui->tableView_1;tableView_2 = ui->tableView_2;// 初始化 spinBox_1 和 spinBox_2spinBox_1 = ui->spinBox_1;spinBox_2 = ui->spinBox_2;// 初始化 label_1 和 label_2label_1 = ui->label_1;label_2 = ui->label_2;// 将按钮与槽函数关联connect(pushButton_1, SIGNAL(clicked()), this, SLOT( loadExcelData() ) );connect(pushButton_2, SIGNAL(clicked()), this, SLOT( showCellData() ) );}MainWindow::~MainWindow() // MainWindow析构函数{delete excel; //在程序退出时释放之前打开的Excel对象。delete ui;// 释放MainWindow对象的内存}

槽函数 loadExcelData

函数功能:“打开文件”按钮按下功能函数,打开并呈现表格文件。

/*加载Excel数据的函数*/void MainWindow::loadExcelData(){QString filePath = QFileDialog::getOpenFileName(this, tr("Open Excel file"), "", tr("Excel Files (*.xlsx *.xls)")); // 获取 Excel 文件路径if (!filePath.isEmpty()){//打开excel,选定工作表lineEdit->setText(filePath); //将文件路径设置到lineEdit控件中excel = new QAxObject("Excel.Application", this); //创建了一个QAxObject对象,用于访问Excel应用程序的COM接口。excel->setProperty("Visible", false);//设置Excel应用程序的可见性为false,即不显示Excel应用程序的窗口。QAxObject *workbooks = excel->querySubObject("Workbooks"); //创建了一个QAxObject对象,用于访问Excel应用程序的Workbooks对象。QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filePath); //使用Workbooks对象的querySubObject函数打开指定的Excel文件,并返回一个QAxObject对象,用于访问打开的Excel文件。QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1); //使用打开的Excel文件的querySubObject函数访问其中的第一个工作表,并返回一个QAxObject对象,用于访问这个工作表。//获得excel的行列数QAxObject *usedRange = worksheet->querySubObject("UsedRange"); //创建了一个QAxObject类型的指针变量usedRange,它调用了worksheet对象的querySubObject()方法,该方法返回代表Excel中正在使用的区域(即非空单元格所在的区域)的QAxObject对象。QAxObject *rows = usedRange->querySubObject("Rows"); //创建了一个QAxObject类型的指针变量rows,它调用了usedRange对象的querySubObject()方法,该方法返回代表Excel中正在使用的区域的行的QAxObject对象。QAxObject *columns = usedRange->querySubObject("Columns");//创建了一个QAxObject类型的指针变量columns,它调用了usedRange对象的querySubObject()方法,该方法返回代表Excel中正在使用的区域的列的QAxObject对象。int row_count = rows->property("Count").toInt(); // 获取Excel文件中的行数int column_count = columns->property("Count").toInt(); // 获取Excel文件中的列数//将 Excel 中的数据存入一个 QStringList 对象中QStringList data_list;for (int i = 1; i <= row_count; i++) {QString row_data;for (int j = 1; j <= column_count; j++) {QAxObject *cell = worksheet->querySubObject("Cells(int, int)", i, j);QString cell_value = cell->dynamicCall("Value()").toString();row_data += cell_value + "\t";cell->clear();delete cell;}data_list << row_data;}// 将 QStringList 对象中的数据存入一个 QStandardItemModel 对象中,用于在表格视图中显示数据。QStandardItemModel *model = new QStandardItemModel();for (int i = 0; i < data_list.count(); i++) {QStringList row_data = data_list.at(i).split("\t", Qt::SkipEmptyParts);for (int j = 0; j < row_data.count(); j++) {QStandardItem *item = new QStandardItem(row_data.at(j));model->setItem(i, j, item);}}tableView_1->setModel(model);// 将 QStandardItemModel 对象设置为表格视图的数据模型,这样就可以在表格视图中显示数据了。workbook->dynamicCall("Close()");excel->dynamicCall("Quit()");}}

槽函数 showCellData

函数功能:“获取单元格”按钮按下功能函数,呈现指定单元格的内容。

void MainWindow::showCellData(){int rowIndex = spinBox_1->value(); //获取spinBox_1中的值作为行号int columnIndex = spinBox_2->value();//获取spinBox_2中的值作为列号QString filePath = lineEdit->text(); //获取lineEdit中的文本作为Excel文件路径if (!filePath.isEmpty()) {excel = new QAxObject("Excel.Application", this); //创建了一个QAxObject对象,用于访问Excel应用程序的COM接口。excel->setProperty("Visible", false);//设置Excel应用程序的可见性为false,即不显示Excel应用程序的窗口。QAxObject *workbooks = excel->querySubObject("Workbooks"); //创建了一个QAxObject对象,用于访问Excel应用程序的Workbooks对象。QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filePath); //使用Workbooks对象的querySubObject函数打开指定的Excel文件,并返回一个QAxObject对象,用于访问打开的Excel文件。QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1); //使用打开的Excel文件的querySubObject函数访问其中的第一个工作表,并返回一个QAxObject对象,用于访问这个工作表。//读第rowIndex行第columnIndex列的单元格QAxObject *cell = worksheet->querySubObject("Cells(int, int)", rowIndex, columnIndex); //使用工作表的querySubObject函数访问其中的第6行第7列的单元格,并返回一个QAxObject对象,用于访问这个单元格。QString value = cell->dynamicCall("Value()").toString();//使用单元格的dynamicCall函数获取单元格中的值,并将它转换为一个QString对象。QStandardItemModel *model = new QStandardItemModel(); //创建了一个QStandardItemModel对象,用于在表格视图中显示数据。model->setItem(0, 0, new QStandardItem(value));//将单元格中的值作为一个QStandardItem对象添加到模型的第0行第0列。tableView_2->setModel(model); //将模型对象设置为表格视图的数据模型,这样就可以在表格视图中显示数据了。workbook->dynamicCall("Close()"); //使用动态调用的方式关闭Excel文件。excel->dynamicCall("Quit()");}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。