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

发布于:2025-04-10 ⋅ 阅读:(29) ⋅ 点赞:(0)

以下是使用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
   ```

2. 界面设计:
   - 在Qt Designer中添加:
     - 一个ListView对象(命名为listViewFile)
     - 两个PushButton(分别命名为btnBrowse和btnOutput)

3. 注意:
   - 需要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);
}
```


网站公告

今日签到

点亮在社区的每一天
去签到