接上篇 QT下Excel文件的读写” 实战1——简介及读取特定单元格
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对象。
}
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()");
}
}
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()");
}
}
功能与上面一样,界面由QtUI设计。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent) // 调用基类QMainWindow的构造函数
, ui(new Ui::MainWindow) // 创建一个新的MainWindow界面
{
ui->setupUi(this); // 使用ui文件中的定义来设置MainWindow的UI,即窗口上的各种控件
// 初始化各种控件
// 初始化 pushButton_1 和 pushButton_2
pushButton_1 = ui->pushButton_1;
pushButton_2 = ui->pushButton_2;
// 初始化 lineEdit
lineEdit = ui->lineEdit;
// 初始化 tableView_1 和 tableView_2
tableView_1 = ui->tableView_1;
tableView_2 = ui->tableView_2;
// 初始化 spinBox_1 和 spinBox_2
spinBox_1 = ui->spinBox_1;
spinBox_2 = ui->spinBox_2;
// 初始化 label_1 和 label_2
label_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对象的内存
}
/*加载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()");
}
}
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()");
}
}