1、在pro工程文件中添加
QT += core gui gui-private axcontainer sql
2、创建batabase.h
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QObject>
#include <QApplication>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlError>
#include <QtSql/QSqlRecord>
#include <QDebug>
#include <QFile>
#include <QByteArray>
//#pragma execution_character_set("UTF-8")
int showInfo(QSqlQuery& query)
{
QString sql = "select * from student";
if(!query.exec(sql))
{
query.lastError().databaseText();
return -1;
}
while (query.next()) {
QString id = query.record().value(0).toString();
QString name = query.record().value(1).toString();
QString age = query.record().value(2).toString();
QString beizhu = query.record().value(3).toString();
qDebug() << QString("[%1] [%2] [%3] [%4]").arg(id).arg(name).arg(age).arg(beizhu);
}
}
3、mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QString>
#include <QPalette>
#include <QSqlTableModel>
#include <QFile>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QSqlTableModel *model;
QString m_savePath;
QString m_zipFile;
QString m_zipFolder;
public slots:
//写
void slotWriteBtn();
//读
void slotReadBtn();
//显示表格内容
void showTableString(const QStringList table);
//添加所有的信号槽
void connectAllSignals();
//从数据库导出数据显示在tableView上
void on_pushButton_clicked();
//保存到本地文件txt
void on_pushButton_3_clicked();
//保存编辑
void on_pushButton_4_clicked();
//创建数据库并与tableview关联
void on_pushButton_2_clicked();
//从数据库中导出excel
void on_btndc_clicked();
//开始压缩
// void on_startZipFileBtn_clicked();
//选择压缩文件
// void on_zipFileBtn_clicked();
//选择压缩路径
// void on_zipPathBtn_clicked();
private:
Ui::MainWindow *ui;
private slots:
};
#endif // MAINWINDOW_H
4、main.cpp
#include "mainwindow.h"
#include <QApplication>
#include "batabase.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
5、ui控件命名
6、mianwindow.cpp部分代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMessageBox>
#include<QFileDialog>
#include<QAxObject>
#include<QDir>
#include<QHBoxLayout>
#include<QTableWidgetItem>
#include <QDebug>
#include <QString>
#include <QStandardItemModel>
#include <QSqlError>
#include <QTextCodec>
#include "Export.h"
#include <QAxObject>
#include <QFileDialog>
#include <QMessageBox>
#include <QProcess>
#include <Windows.h>
#include "QtGui/private/qzipreader_p.h"
#include "QtGui/private/qzipwriter_p.h"
#include <QFileDialog>
#include <QStandardPaths>
#include <QMessageBox>
#include <QDebug>
#include <QFile>
#include <QElapsedTimer>
//#pragma execution_character_set("UTF-8")
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connectAllSignals();
}
MainWindow::~MainWindow()
{
delete ui;
}
//显示表格内容
void MainWindow::showTableString(const QStringList table)
{
if(table.isEmpty())
return;
QTableWidget*tableWidget=ui->tableWidget;
QStringList header=table.at(0).simplified().split(' ',QString::SkipEmptyParts);//去除空白 用空格‘ ’隔开 跳过空白
tableWidget->setRowCount(table.count()-1);//某行之后停止查询
tableWidget->setColumnCount(header.count());//在某一列数之后停止查询
tableWidget->setHorizontalHeaderLabels(header);//水平居中
for(int i=1;i<table.count();i++)
{
QStringList line=table.at(i).split('\t',QString::KeepEmptyParts);
for(int j=0;j<header.count();j++)
{
QTableWidgetItem*item=new QTableWidgetItem;
item->setText(line.at(j));
item->setTextAlignment(Qt::AlignCenter); //单元格文本对齐格式 居中对齐
tableWidget->setItem(i-1,j,item);
}
}
}
//添加所有的信号槽
void MainWindow::connectAllSignals()
{
connect(ui->openExcelAct,&QAction::triggered,this,&MainWindow::slotReadBtn);
connect(ui->saveExcelAct,&QAction::triggered,this,&MainWindow::slotWriteBtn);
}
//读取文件
void MainWindow::slotReadBtn()
{
//获取要读取得文件名
QString fileName=QFileDialog::getOpenFileName(this,"读取","/C++/*.xlsx");
if(fileName.isEmpty())
return;
fileName=QDir::toNativeSeparators(fileName); // 路径/转\ 否则不会读取
//打开Excel进程、获取工作簿、工作表、单元格
QAxObject*myExcel=new QAxObject("Excel.application",this);
myExcel->setProperty("DisplayAlerts",false);
QAxObject*workBooks=myExcel->querySubObject("WorkBooks");
workBooks->dynamicCall("Open(const QString&)",fileName);
QAxObject*workBook=myExcel->querySubObject("ActiveWorkBook");
QAxObject*mySheets=workBook->querySubObject("Sheets");
QAxObject*sheet=mySheets->querySubObject("Item(int)",1);
//获取已经使用的单元格区域,并得到行列数
QAxObject*range=sheet->querySubObject("UsedRange");
QAxObject*rows=range->querySubObject("Rows");
QAxObject*colums=range->querySubObject("Columns");
int count_row=rows->dynamicCall("Count").toUInt();
int count_col=colums->dynamicCall("Count").toUInt();
//提取单元格中内容,存放到StringList中
QStringList tableString;
QAxObject*cell;
tableString.clear();
for(int i=1;i<=count_row;i++)
{
QString line;
for(int j=1;j<=count_col;j++)
{
cell=range->querySubObject("Cells(int,int)",i,j);
line+=cell->dynamicCall("Value").toString()+"\t";
}
tableString.append(line); //后面一行行追加
}
//关闭工作簿、结束进程
workBook->dynamicCall("Close()");
myExcel->dynamicCall("Quit()");
//显示得到的数据
showTableString(tableString);
}