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);

}

```

相关推荐
烟雨柳成烟2 小时前
C++学习Day0:c++简介
开发语言·c++·qt·学习
溟洵5 小时前
【C++ Qt】Hello World、初始信号槽、理解对象树 ~~~(通俗易懂 图文并茂)
开发语言·c++·qt
Littlehero_1216 小时前
qt中关于思源雅黑字体的使用
开发语言·qt
怕什么真理无穷15 小时前
Qt 的 事件队列
qt
我真的不会C16 小时前
Qt中widget控件的常见属性
java·开发语言·qt
alin、m16 小时前
银河麒麟(Kylin) - V10 SP1桌面操作系统ARM64编译QT-5.15.12版本
大数据·qt·kylin
命运之光19 小时前
qt中解决#include “main.moc“问题
开发语言·qt
დ旧言~1 天前
【Qt】界面优化
qt
GOTXX1 天前
【Qt】QWidget 核⼼属性详解
开发语言·前端·c++·qt·机器学习·ai·widget
꧁坚持很酷꧂1 天前
Qt实现文件传输服务器端(图文详解+代码详细注释)
开发语言·数据库·qt