Qt实现读取本地文件并导出数据到Excel

以下是使用Qt实现读取本地文件并导出数据到Excel的示例代码,分为头文件和源文件:

**mainwindow.h**

```cpp

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>

#include <QStandardItemModel>

QT_BEGIN_NAMESPACE

namespace Ui { class MainWindow; }

QT_END_NAMESPACE

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

MainWindow(QWidget *parent = nullptr);

~MainWindow();

private slots:

void on_btnBrowse_clicked();

void on_btnOutput_clicked();

private:

Ui::MainWindow *ui;

QStandardItemModel *m_fileListModel;

};

#endif // MAINWINDOW_H

```

**mainwindow.cpp**

```cpp

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QFileDialog>

#include <QAxObject>

#include <QDateTime>

#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent)

: QMainWindow(parent)

, ui(new Ui::MainWindow)

, m_fileListModel(new QStandardItemModel(this))

{

ui->setupUi(this);

ui->listViewFile->setModel(m_fileListModel);

}

MainWindow::~MainWindow()

{

delete ui;

}

void MainWindow::on_btnBrowse_clicked()

{

// 获取多个文件路径

QStringList files = QFileDialog::getOpenFileNames(

this,

"选择文件",

QDir::homePath(),

"所有文件 (*.*)"

);

// 添加文件路径到列表视图

foreach (const QString &file, files) {

QStandardItem *item = new QStandardItem(file);

m_fileListModel->appendRow(item);

}

}

void MainWindow::on_btnOutput_clicked()

{

QAxObject *excel = new QAxObject("Excel.Application");

if (!excel) {

QMessageBox::critical(this, "错误", "无法创建Excel对象");

return;

}

try {

// 创建新工作簿

excel->setProperty("Visible", true);

QAxObject *workbooks = excel->querySubObject("Workbooks");

workbooks->dynamicCall("Add");

QAxObject *workbook = excel->querySubObject("ActiveWorkbook");

QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);

// 设置标题行

QStringList headers = {"时间", "温度(℃)", "透气度"};

for (int col = 0; col < headers.size(); ++col) {

QAxObject *cell = worksheet->querySubObject("Cells(int,int)", 1, col+1);

cell->setProperty("Value", headers[col]);

}

// 生成示例数据(可根据需要替换为实际数据)

for (int row = 2; row <= 5; ++row) {

// 时间列

QAxObject *cell = worksheet->querySubObject("Cells(int,int)", row, 1);

cell->setProperty("Value", QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));

// 温度列(示例随机值)

cell = worksheet->querySubObject("Cells(int,int)", row, 2);

cell->setProperty("Value", 20 + qrand() % 10);

// 透气度列(示例随机值)

cell = worksheet->querySubObject("Cells(int,int)", row, 3);

cell->setProperty("Value", 0.5 + (qrand() % 50)/100.0);

}

// 自动调整列宽

QAxObject *range = worksheet->querySubObject("UsedRange");

range->dynamicCall("AutoFit");

// 保存文件

QString filePath = QDir::homePath() + "/ExportData.xlsx";

workbook->dynamicCall("SaveAs(const QString&)", filePath);

workbook->dynamicCall("Close()");

excel->dynamicCall("Quit()");

} catch (...) {

QMessageBox::critical(this, "错误", "操作Excel时发生异常");

}

delete excel;

}

```

**使用说明:**

  1. 在.pro文件中添加:

```qmake

QT += core gui axcontainer

```

  1. 界面设计:
  • 在Qt Designer中添加:

  • 一个ListView对象(命名为listViewFile)

  • 两个PushButton(分别命名为btnBrowse和btnOutput)

  1. 注意:
  • 需要Windows系统和安装Excel才能使用QAxObject

  • 示例中的温度/透气度数据为随机生成,实际应根据需要替换真实数据

  • 要处理Excel操作失败的情况,可能需要更完善的错误处理

**替代方案(跨平台CSV导出):**

如果只需要生成Excel可读的格式,可以替换导出函数为:

```cpp

void MainWindow::on_btnOutput_clicked()

{

QString fileName = QFileDialog::getSaveFileName(

this,

"保存文件",

QDir::homePath(),

"CSV文件 (*.csv)"

);

if (fileName.isEmpty()) return;

QFile file(fileName);

if (!file.open(QIODevice::WriteOnly | QIODevice::Text))

return;

QTextStream stream(&file);

stream << "时间,温度(℃),透气度\n";

// 生成示例数据

for (int i = 0; i < 3; ++i) {

stream << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") << ","

<< 20 + qrand() % 10 << ","

<< 0.5 + (qrand() % 50)/100.0 << "\n";

}

file.close();

QMessageBox::information(this, "成功", "数据已导出到:" + fileName);

}

```

相关推荐
hqwest18 小时前
码上通QT实战12--监控页面04-绘制6个灯珠及开关
开发语言·qt·qpainter·qt事件·stackedwidget
youyicc1 天前
Qt连接Pg数据库
开发语言·数据库·qt
楚Y6同学1 天前
基于 Haversine 公式实现【经纬度坐标点】球面距离计算(C++/Qt 实现)
开发语言·c++·qt·经纬度距离计算
江公望1 天前
QT/QML qmlRegisterType()函数浅谈
开发语言·qt
ZouZou老师1 天前
Linux Qt出现xcb异常问题解决办法
开发语言·qt
雁门.11 天前
qt封装dll及调用
开发语言·qt
办公自动化软件定制化开发python1 天前
基于PyQt5开发的文件智能查找工具,开源思路+完整实现,解决办公文件检索痛点
开发语言·qt
深蓝海拓1 天前
PySide6,QEventLoop.exec()的使用
笔记·python·qt·学习·pyqt
_OP_CHEN1 天前
【从零开始的Qt开发指南】(二十)Qt 多线程深度实战指南:从基础 API 到线程安全,带你实现高效并发应用
开发语言·c++·qt·安全·线程·前端开发·线程安全
qq_401700411 天前
CardLayout 实现自定义布局
qt