diff --git a/mainwindow.cpp b/mainwindow.cpp index e0c8310..c989463 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -127,10 +127,14 @@ void MainWindow::on_actionSave_copy_of_SQL_as_triggered() void MainWindow::on_actionExport_data_triggered() { - QString home_dir = QStandardPaths::locate(QStandardPaths::HomeLocation, "", QStandardPaths::LocateDirectory); - QString file_name = QFileDialog::getSaveFileName(this, - tr("Export data"), home_dir, tr("CSV file (*.csv)")); + QueryTab *tab = GetActiveQueryTab(); + if (tab) { + QString home_dir = QStandardPaths::locate(QStandardPaths::HomeLocation, "", QStandardPaths::LocateDirectory); + QString file_name = QFileDialog::getSaveFileName(this, + tr("Export data"), home_dir, tr("CSV file (*.csv)")); + tab->exportData(file_name); + } } void MainWindow::on_actionClose_triggered() diff --git a/querytab.cpp b/querytab.cpp index 61979a9..4044eb2 100644 --- a/querytab.cpp +++ b/querytab.cpp @@ -565,3 +565,13 @@ void QueryTab::copyQueryAsCString() QString cs = ConvertToMultiLineCString(command); QApplication::clipboard()->setText(cs); } + +void QueryTab::exportData(const QString &file_name) +{ + auto widget = ui->tabWidget->currentWidget(); + auto fi = std::find(resultList.begin(), resultList.end(), widget); + if (fi != resultList.end()) { + TuplesResultWidget* rw = *fi; + rw->exportData(file_name); + } +} diff --git a/querytab.h b/querytab.h index 7765cb7..5b25672 100644 --- a/querytab.h +++ b/querytab.h @@ -49,6 +49,7 @@ public: bool canClose(); void copyQueryAsCString(); + void exportData(const QString &filename); private: // struct ResultTab { diff --git a/tuplesresultwidget.cpp b/tuplesresultwidget.cpp index 4cf1582..5d2704d 100644 --- a/tuplesresultwidget.cpp +++ b/tuplesresultwidget.cpp @@ -2,6 +2,9 @@ #include "ui_tuplesresultwidget.h" #include "util.h" +#include +#include + TuplesResultWidget::TuplesResultWidget(QWidget *parent) : QWidget(parent), ui(new Ui::TuplesResultWidget) @@ -24,3 +27,14 @@ void TuplesResultWidget::setResult(std::shared_ptr res, float ui->lblRowCount->setText(rowcount_str); ui->lblElapsedTime->setText(msfloatToHumanReadableString(ms)); } + +void TuplesResultWidget::exportData(const QString &file_name) const +{ + QFile file(file_name); + if (file.open(QIODevice::WriteOnly)) { + QTextStream out(&file); + ::exportTable(ui->ResultView, out); + } +} + + diff --git a/tuplesresultwidget.h b/tuplesresultwidget.h index 15cd447..e1414af 100644 --- a/tuplesresultwidget.h +++ b/tuplesresultwidget.h @@ -17,6 +17,7 @@ public: ~TuplesResultWidget(); void setResult(std::shared_ptr res, float ms); + void exportData(const QString &file_name) const; private: Ui::TuplesResultWidget *ui; diff --git a/util.cpp b/util.cpp index cc3cd7a..f5a16d6 100644 --- a/util.cpp +++ b/util.cpp @@ -53,6 +53,28 @@ QString msfloatToHumanReadableString(float ms) return result + unit; } +void exportTable(const QTableView *view, QTextStream &out) +{ + auto model = view->model(); + if (model) { + CsvWriter csv(&out); + csv.setSeperator('\t'); + csv.setQuote('"'); + + const int cols = model->columnCount(); + const int rows = model->rowCount(); + for (int row = 0; row < rows; ++row) { + for (int col = 0; col < cols; ++col) { + auto idx = model->index(row, col); + auto display_text = idx.data(Qt::DisplayRole).toString(); + csv.writeField(display_text); + } + csv.nextRow(); + } + out.flush(); + } +} + void copySelectionToClipboard(const QTableView *view) { //QAbstractItemModel * model = resultModel; //view->model(); diff --git a/util.h b/util.h index 00d7308..33ee207 100644 --- a/util.h +++ b/util.h @@ -7,5 +7,6 @@ QString msfloatToHumanReadableString(float ms); void copySelectionToClipboard(const QTableView *view); QString ConvertToMultiLineCString(const QString &in); +void exportTable(const QTableView *view, QTextStream &out); #endif // UTIL_H