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