#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "Qdir"
#include "QFileDialog"
#include <QStringList>
#include <QTableWidget>
#include <QDebug>
#include <QHeaderView>
#include <QFile>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
#include <QMessageBox>
void MainWindow::on_pushButton_clicked()
{
QString strFile = QFileDialog::getOpenFileName(this,QString("选择Excel文件"),"",tr("Exel file(*.xls *.xlsx)"));
if (strFile.isEmpty()){
return;
}
//excel_list中已经获取的excel中所有数据,接下来要把数据打印到tablewidget中去
ui->tableWidget->setShowGrid(true); //设置显示格子线
ui->tableWidget->horizontalHeader()->setStretchLastSection(true); //使表格自适应行列宽度
// ui->tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:gray;}"); //设置表头颜色
ui->tableWidget->horizontalHeader()->setMinimumHeight(50);
// ui->tableWidget->verticalHeader()->setStyleSheet("QHeaderView::section{background:gray;}");
ui->tableWidget->verticalHeader()->setStretchLastSection(true); //使表格自适应行列宽度
ui->tableWidget->verticalHeader()->setMinimumWidth(50);
ui->tableWidget->verticalHeader()->setDefaultSectionSize(50);
ui->tableWidget->setAlternatingRowColors(true);
ui->tableWidget->setPalette(QPalette(Qt::gray)); // 设置隔行变色的颜色 gray灰色
QAxObject excel("Excel.Application"); //加载Excel驱动
excel.setProperty("Visible", false);//不显示Excel界面,如果为true会看到启动的Excel界面
QAxObject *work_books = excel.querySubObject("WorkBooks");
work_books->dynamicCall("Open (const QString&)", strFile); //打开指定文件
QAxObject *work_book = excel.querySubObject("ActiveWorkBook");
QAxObject *work_sheets = work_book->querySubObject("Sheets"); //获取工作表
QString ExcelName;
static int row_count = 0,column_count = 0;
int sheet_count = work_sheets->property("Count").toInt(); //获取工作表数目,如下图,有 3 页
if(sheet_count > 0)
{
QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1); //设置为 获取第一页 数据
QAxObject *used_range = work_sheet->querySubObject("UsedRange");
QAxObject *rows = used_range->querySubObject("Rows");
row_count = rows->property("Count").toInt(); //获取行数
QAxObject *column = used_range->querySubObject("Columns");
column_count = column->property("Count").toInt(); //获取列数
ui->tableWidget->setColumnCount(column_count); //获取列数据
ui->tableWidget->setRowCount(row_count); //获取行数据
//获取第一行第一列数据
ExcelName = work_sheet->querySubObject("Cells(int,int)", 1,1)->property("Value").toString();
QTableWidgetItem* item;
//获取表格中需要的数据,此处是从第三行第二列获取数据,具体原因看下图理解,根据自己的需求获取信息
for (int i =1; i <= row_count; i++)
{
for (int j = 1; j <= column_count;j++)
{
QString txt = work_sheet->querySubObject("Cells(int,int)", i,j)->property("Value").toString(); //获取单元格内容
item = new QTableWidgetItem(txt);
ui->tableWidget->setItem(i-1,j-1,item);
arr.append(txt);
}
array.append(arr);
arr.clear(); //将每行数据存储到array后,清空arr,避免下次循环时数据累计;arr.appeng()是添加不是赋值
}
work_book->dynamicCall("Close(Boolean)", false); //关闭文件
excel.dynamicCall("Quit(void)"); //退出
work_book->dynamicCall("Close()");
excel.dynamicCall("Quit()");
}
}
void MainWindow::on_pushButton_2_clicked()
{
//获取保存路径
QString filepath=QFileDialog::getSaveFileName(this,tr("Save"),".",tr(" (*.xlsx)"));
if(!filepath.isEmpty())
{
QAxObject *excel = new QAxObject(this);
//连接Excel控件
excel->setControl("Excel.Application");
//不显示窗体
excel->dynamicCall("SetVisible (bool Visible)","false");
//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
excel->setProperty("DisplayAlerts", false);
//获取工作簿集合
QAxObject *workbooks = excel->querySubObject("WorkBooks");
//新建一个工作簿
workbooks->dynamicCall("Add");
//获取当前工作簿
QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
//获取工作表集合
QAxObject *worksheets = workbook->querySubObject("Sheets");
//获取工作表集合的工作表1,即sheet1
QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);
//设置表头值
// for(int i=1;i<ui->tableWidget->columnCount()+1;i++)
// {
// //设置设置某行某列
// QAxObject *Range = worksheet->querySubObject("Cells(int,int)", 1, i);
// Range->dynamicCall("SetValue(const QString &)",ui->tableWidget->horizontalHeaderItem(i-1)->text());
// qDebug()<<ui->tableWidget->horizontalHeaderItem(i-1)->text();
// }
//设置表格数据
for(int i = 1;i<ui->tableWidget->rowCount()+1;i++)
{
qDebug()<<ui->tableWidget->rowCount();
for(int j = 1;j<ui->tableWidget->columnCount()+1;j++)
{
QAxObject *Range = worksheet->querySubObject("Cells(int,int)", i, j);
Range->dynamicCall("SetValue(const QString &)",ui->tableWidget->item(i-1,j-1)->text());
}
}
workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));//保存至filepath
workbook->dynamicCall("Close()");//关闭工作簿
excel->dynamicCall("Quit()");//关闭excel
delete excel;
excel=NULL;
qDebug() << "\n导出成功啦!!!";
}
}
QT4 Qtablewidget导入、导出Excel
需积分: 0 200 浏览量
更新于2023-08-03
3
收藏 6KB 7Z 举报
QT4中的QTableWidget是Qt库提供的一种用于在GUI应用程序中显示二维表格数据的控件。它是QTableView的变体,提供了更多的交互性,比如直接编辑单元格等。本篇文章将详细探讨如何利用QTableWidget导入和导出Excel数据。
导入Excel数据到QTableWidget通常涉及到读取Excel文件,这可以通过第三方库如QAxContainer或者更现代的QSpreadsheet来实现。QAxContainer是Qt对ActiveX控件的支持,允许我们调用Microsoft Office接口直接读取Excel文件。而QSpreadsheet则是一个轻量级的库,专门用于处理表格数据,不依赖于任何外部应用程序。
1. **使用QAxContainer导入Excel**:
- 需要包含必要的头文件并启用ActiveX支持。
- 创建一个QAxWidget,并设置其对象名称为"ExcelApp",然后初始化它以启动Excel进程。
- 使用`queryInterface()`函数获取Excel的接口,如`IDispatch`。
- 通过接口打开Excel文件,获取工作簿和工作表对象。
- 读取数据并填充到QTableWidget中。每一行和每一列对应QTableWidget的一个item。
2. **使用QSpreadsheet导入Excel**:
- 引入QSpreadsheet库,并创建一个Spreadsheet对象。
- 打开Excel文件,读取工作表。
- 将数据逐行逐列转换为QTableWidgetItem,然后添加到QTableWidget中。
导出QTableWidget到Excel则相对简单,因为我们可以直接写入数据到一个新的Excel文件,无需读取现有文件。这同样可以使用QAxContainer或QSpreadsheet实现,但QAxContainer更为常见:
1. **使用QAxContainer导出Excel**:
- 创建新的Excel工作簿和工作表。
- 获取工作表的范围对象,然后遍历QTableWidget中的所有items,将数据写入到Excel的工作表中。
- 保存文件并关闭Excel应用程序。
在实际操作中,需要注意的是,由于涉及到与其他软件(如Excel)的交互,可能会出现兼容性和权限问题。确保用户有权限访问和修改文件,并且在完成操作后正确清理资源,防止进程泄露。
此外,为了提高效率和用户体验,可以考虑异步处理大型数据集,避免阻塞UI。同时,也可以提供进度条反馈,让用户知道导入导出的状态。
压缩包中的"ExcelTest"可能包含一个示例程序或者测试数据,用于演示上述导入导出过程。用户可以运行这个程序,观察其工作原理,从而更好地理解QT4中QTableWidget与Excel的交互方式。
QT4的QTableWidget结合合适的库,可以方便地实现与Excel的数据交换,这对于需要处理大量表格数据的桌面应用来说是非常实用的功能。理解和掌握这些技巧,能够帮助开发者提高工作效率,提升用户界面的交互体验。
否定之否定。
- 粉丝: 12
- 资源: 1
最新资源
- 基于MPC的USV自主航行仿真研究源码+文档
- 【java毕业设计】智慧社区新闻资讯阅读量统计系统(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区活动参与人数统计系统(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区活动报名人数统计系统(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区在线影院影片观看量统计系统(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区共享资源下载量统计系统(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区物业管理系统(源代码+论文+PPT模板).zip
- LSTM08超详细LSTM调参指南PDF
- 【java毕业设计】智慧社区停车管理系统(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区智能家居控制系统(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区健康管理系统(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区环境监测系统(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区安防监控系统(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区垃圾分类管理系统(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区老人关怀系统(源代码+论文+PPT模板).zip
- 【java毕业设计】智慧社区紧急救援系统(源代码+论文+PPT模板).zip