[kde-doc-english] [labplot] /: Implemented spreadsheet export.

Alexander Semke alexander.semke at web.de
Sat Dec 13 21:48:48 UTC 2014


Git commit b71e8d46cc8ddfb7c25c57ce6b6dfcc181f250c0 by Alexander Semke.
Committed on 12/12/2014 at 20:36.
Pushed by asemke into branch 'master'.

Implemented spreadsheet export.

M  +2    -1    ChangeLog
M  +11   -1    doc/index.docbook
M  +2    -0    src/CMakeLists.txt
M  +35   -1    src/commonfrontend/spreadsheet/SpreadsheetView.cpp
M  +1    -0    src/commonfrontend/spreadsheet/SpreadsheetView.h
M  +17   -1    src/kdefrontend/MainWin.cpp
A  +204  -0    src/kdefrontend/spreadsheet/ExportSpreadsheetDialog.cpp     [License: GPL (v2+)]
A  +59   -0    src/kdefrontend/spreadsheet/ExportSpreadsheetDialog.h     [License: GPL (v2+)]
A  +128  -0    src/kdefrontend/ui/spreadsheet/exportspreadsheetwidget.ui

http://commits.kde.org/labplot/b71e8d46cc8ddfb7c25c57ce6b6dfcc181f250c0

diff --git a/ChangeLog b/ChangeLog
index 7bf3f44..61510e7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -13,6 +13,7 @@ New features:
 	* Fill columns with uniform and non-uniform random numbers, several distributions are available.
 	* Fill columns with function values
 	* Allow custom resolutions for PNG-export
+	* Export of the spreadsheet to a text file.
 
 Bug fixes:
 	* Don't crash when trying to create a plot in case no rc-file was installed.
@@ -47,4 +48,4 @@ Brief summary of features and capabilities of LabPlot2 implemented in the first
 	* legend for xy-plots
 	* a lot of properties of the worksheet elements can be edited in a very easy way in the corresponding dock widgets
 	* plots on the worksheet can be put into a horizontal, vertical or grid layouts
-	* export of worksheet (entire worksheet or current seleciton) to pdf, eps, png and svg
\ No newline at end of file
+	* export of worksheet (entire worksheet or current seleciton) to pdf, eps, png and svg
diff --git a/doc/index.docbook b/doc/index.docbook
index 58d61ca..8e64501 100644
--- a/doc/index.docbook
+++ b/doc/index.docbook
@@ -223,7 +223,7 @@ Masked data is not plotted and is also excluded from data analysis functions lik
 <para>
 Any spreadsheet function can be reached via the context menu (&RMB; click).
 You can cut, copy and paste between spreadsheets, generate, normalize and sort data and finally make plots out of your data.
-Of course you can also export the data in the spreadsheet.
+Of course you can also <link linkend="exportdialog">export</link> the data in the spreadsheet to an external file.
 </para>
 
 <screenshot><mediaobject><imageobject>
@@ -637,6 +637,16 @@ files. You can also specify the type of the data, the filter, the separating cha
 </para>
 </sect1>
 
+<!-- TODO:
+	Describe the export of worksheet and spreadsheet.
+-->
+<sect1 id="exportdialog">
+<title>Export Dialog</title>
+<para>
+	
+</para>
+</sect1>
+
 </chapter>
 
 <!-- TODO:
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 7b14de4..200c53d 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -32,6 +32,7 @@ set(GUI_SOURCES
 	${KDEFRONTEND_DIR}/dockwidgets/XYEquationCurveDock.cpp
 	${KDEFRONTEND_DIR}/dockwidgets/WorksheetDock.cpp
 	${KDEFRONTEND_DIR}/spreadsheet/EquidistantValuesDialog.cpp
+	${KDEFRONTEND_DIR}/spreadsheet/ExportSpreadsheetDialog.cpp
 	${KDEFRONTEND_DIR}/spreadsheet/FunctionValuesDialog.cpp
 	${KDEFRONTEND_DIR}/spreadsheet/RandomValuesDialog.cpp
 	${KDEFRONTEND_DIR}/spreadsheet/SortDialog.cpp
@@ -68,6 +69,7 @@ set(UI_SOURCES
 	${KDEFRONTEND_DIR}/ui/dockwidgets/xyequationcurvedockgeneraltab.ui
 	${KDEFRONTEND_DIR}/ui/dockwidgets/worksheetdock.ui
 	${KDEFRONTEND_DIR}/ui/spreadsheet/equidistantvalueswidget.ui
+	${KDEFRONTEND_DIR}/ui/spreadsheet/exportspreadsheetwidget.ui
 	${KDEFRONTEND_DIR}/ui/spreadsheet/functionvalueswidget.ui
 	${KDEFRONTEND_DIR}/ui/spreadsheet/randomvalueswidget.ui
 	${KDEFRONTEND_DIR}/ui/worksheet/exportworksheetwidget.ui
diff --git a/src/commonfrontend/spreadsheet/SpreadsheetView.cpp b/src/commonfrontend/spreadsheet/SpreadsheetView.cpp
index f641d0b..67c9da8 100644
--- a/src/commonfrontend/spreadsheet/SpreadsheetView.cpp
+++ b/src/commonfrontend/spreadsheet/SpreadsheetView.cpp
@@ -55,7 +55,8 @@
 #include <QPainter>
 #include <QPrinter>
 #include <QToolBar>
-#include <QInputDialog>
+#include <QTextStream>
+#include <QDebug>
 
 #ifdef ACTIVATE_SCIDAVIS_SPECIFIC_CODE
 #include "spreadsheetview_qactions.h"
@@ -1631,3 +1632,36 @@ void SpreadsheetView::print(QPrinter* printer) const{
 		}
 	}
 }
+
+void SpreadsheetView::exportToFile(const QString& path, const bool exportHeader, const QString& separator) const {
+	QFile file(path);
+	if (!file.open(QFile::WriteOnly | QFile::Truncate))
+		return;
+
+	QTextStream out(&file);
+	const int cols = m_spreadsheet->columnCount();
+
+	QString sep = separator;
+	sep = sep.replace(QString("TAB"), QString("\t"), Qt::CaseInsensitive);
+	sep = sep.replace(QString("SPACE"), QString(" "), Qt::CaseInsensitive);
+
+	//export header (column names)
+	if (exportHeader) {
+		for (int j=0; j<cols; ++j) {
+			out << m_spreadsheet->column(j)->name();
+			if (j!=cols-1)
+				out<<sep;
+		}
+		out << '\n';
+	}
+
+	//export values
+	for (int i=0; i<m_spreadsheet->rowCount(); ++i) {
+		for (int j=0; j<cols; ++j) {
+			out << m_spreadsheet->column(j)->asStringColumn()->textAt(i);
+			if (j!=cols-1)
+				out<<sep;
+		}
+		out << '\n';
+	}
+}
diff --git a/src/commonfrontend/spreadsheet/SpreadsheetView.h b/src/commonfrontend/spreadsheet/SpreadsheetView.h
index d032f2c..f82c292 100644
--- a/src/commonfrontend/spreadsheet/SpreadsheetView.h
+++ b/src/commonfrontend/spreadsheet/SpreadsheetView.h
@@ -74,6 +74,7 @@ class SpreadsheetView : public QWidget{
 		void setCellSelected(int row, int col, bool select = true);
 		void setCellsSelected(int first_row, int first_col, int last_row, int last_col, bool select = true);
 		void getCurrentCell(int * row, int * col);
+		void exportToFile(const QString&, const bool, const QString&) const;
 
 	private:
 	  	void init();
diff --git a/src/kdefrontend/MainWin.cpp b/src/kdefrontend/MainWin.cpp
index 2cfabc9..a4e9b3c 100644
--- a/src/kdefrontend/MainWin.cpp
+++ b/src/kdefrontend/MainWin.cpp
@@ -45,6 +45,7 @@
 #include "commonfrontend/worksheet/WorksheetView.h"
 
 #include "kdefrontend/worksheet/ExportWorksheetDialog.h"
+#include "kdefrontend/spreadsheet/ExportSpreadsheetDialog.h"
 #include "kdefrontend/datasources/ImportFileDialog.h"
 #include "kdefrontend/dockwidgets/ProjectDock.h"
 #include "kdefrontend/HistoryDialog.h"
@@ -1290,7 +1291,22 @@ void MainWin::exportDialog(){
 			RESET_CURSOR;
 		}
 	}else{//Spreadsheet
-		//TODO
+		Spreadsheet* s = this->activeSpreadsheet();
+		if (!s)
+			return;
+
+		ExportSpreadsheetDialog* dlg = new ExportSpreadsheetDialog(this);
+		dlg->setFileName(s->name());
+		if (dlg->exec()==QDialog::Accepted){
+			QString path = dlg->path();
+			const bool exportHeader = dlg->exportHeader();
+			QString separator = dlg->separator();
+
+			SpreadsheetView* view = qobject_cast<SpreadsheetView*>(s->view());
+			WAIT_CURSOR;
+			view->exportToFile(path, exportHeader, separator);
+			RESET_CURSOR;
+		}
 	}
 }
 
diff --git a/src/kdefrontend/spreadsheet/ExportSpreadsheetDialog.cpp b/src/kdefrontend/spreadsheet/ExportSpreadsheetDialog.cpp
new file mode 100644
index 0000000..030cad7
--- /dev/null
+++ b/src/kdefrontend/spreadsheet/ExportSpreadsheetDialog.cpp
@@ -0,0 +1,204 @@
+/***************************************************************************
+    File                 : ExportSpreadsheetDialog.cpp
+    Project              : LabPlot
+    Description          : export spreadsheet dialog
+    --------------------------------------------------------------------
+    Copyright            : (C) 2014 by Alexander Semke (alexander.semke at web.de)
+
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *  This program is free software; you can redistribute it and/or modify   *
+ *  it under the terms of the GNU General Public License as published by   *
+ *  the Free Software Foundation; either version 2 of the License, or      *
+ *  (at your option) any later version.                                    *
+ *                                                                         *
+ *  This program is distributed in the hope that it will be useful,        *
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *  GNU General Public License for more details.                           *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the Free Software           *
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor,                    *
+ *   Boston, MA  02110-1301  USA                                           *
+ *                                                                         *
+ ***************************************************************************/
+
+#include "ExportSpreadsheetDialog.h"
+
+#include <QFileDialog>
+#include <KUrlCompletion>
+#include <KMessageBox>
+#include <KPushButton>
+#include <QStringList>
+
+/*!
+	\class ExportSpreadsheetDialog
+	\brief Dialog for exporting a spreadsheet to a file.
+
+	\ingroup kdefrontend
+*/
+
+ExportSpreadsheetDialog::ExportSpreadsheetDialog(QWidget* parent) : KDialog(parent) {
+	mainWidget = new QWidget(this);
+	ui.setupUi(mainWidget);
+	ui.gbOptions->hide();
+
+	KUrlCompletion *comp = new KUrlCompletion();
+    ui.kleFileName->setCompletionObject(comp);
+
+	ui.cbFormat->addItem("ASCII");
+	ui.cbFormat->addItem("Binary");
+	//TODO: implement later
+	ui.lFormat->hide();
+	ui.cbFormat->hide();
+
+	ui.cbSeparator->addItem("TAB");
+	ui.cbSeparator->addItem("SPACE");
+	ui.cbSeparator->addItem(",");
+	ui.cbSeparator->addItem(";");
+	ui.cbSeparator->addItem(":");
+	ui.cbSeparator->addItem(",TAB");
+	ui.cbSeparator->addItem(";TAB");
+	ui.cbSeparator->addItem(":TAB");
+	ui.cbSeparator->addItem(",SPACE");
+	ui.cbSeparator->addItem(";SPACE");
+	ui.cbSeparator->addItem(":SPACE");
+
+	ui.bOpen->setIcon( KIcon("document-open") );
+
+	setMainWidget( mainWidget );
+
+	setButtons( KDialog::Ok | KDialog::User1 | KDialog::Cancel );
+	setButtonText(KDialog::User1,i18n("Options >>"));
+
+	connect( ui.bOpen, SIGNAL(clicked()), this, SLOT (selectFile()) );
+	connect( ui.kleFileName, SIGNAL(textChanged(QString)), this, SLOT(fileNameChanged(QString)) );
+	connect(this,SIGNAL(user1Clicked()), this, SLOT(toggleOptions()));
+
+	setCaption(i18n("Export spreadsheet"));
+	setWindowIcon(KIcon("document-export-database"));
+
+	KConfigGroup conf(KSharedConfig::openConfig(), "ExportSpreadsheetDialog");
+	ui.cbFormat->setCurrentIndex(conf.readEntry("Format", 0));
+// 	ui.chkExportHeader->setChecked(conf.readEntry("Header", "").toInt());
+	ui.chkExportHeader->setChecked(conf.readEntry("Header", true));
+	ui.cbSeparator->setCurrentItem(conf.readEntry("Separator", ""));
+
+	resize( QSize(500,0).expandedTo(minimumSize()) );
+}
+
+void ExportSpreadsheetDialog::setFileName(const QString& name){
+	KConfigGroup conf(KSharedConfig::openConfig(), "ExportSpreadsheetDialog");
+	QString dir = conf.readEntry("LastDir", "");
+	if (dir.isEmpty()) dir = QDir::homePath();
+	ui.kleFileName->setText(dir + QDir::separator() +  name);
+	this->formatChanged(ui.cbFormat->currentIndex());
+}
+
+QString ExportSpreadsheetDialog::path() const{
+	return ui.kleFileName->text();
+}
+
+bool ExportSpreadsheetDialog::exportHeader() const {
+	return ui.chkExportHeader->isChecked();
+}
+
+const QString& ExportSpreadsheetDialog::separator() const {
+	return ui.cbSeparator->currentText();
+}
+
+void ExportSpreadsheetDialog::slotButtonClicked(int button) {
+	if (button == KDialog::Ok)
+		okClicked();
+	else
+		KDialog::slotButtonClicked(button);
+}
+
+//SLOTS
+void ExportSpreadsheetDialog::okClicked(){
+	if ( QFile::exists(ui.kleFileName->text()) ){
+		int r=KMessageBox::questionYesNo(this, i18n("The file already exists. Do you really want to overwrite it?"), i18n("Export"));
+		if (r==KMessageBox::No) {
+			return;
+		}
+	}
+
+    KConfigGroup conf(KSharedConfig::openConfig(), "ExportSpreadsheetDialog");
+    conf.writeEntry("Format", ui.cbFormat->currentIndex());
+	conf.writeEntry("Header", ui.chkExportHeader->isChecked());
+	conf.writeEntry("Separator", ui.cbSeparator->currentText());
+
+    QString path = ui.kleFileName->text();
+    if (!path.isEmpty()) {
+		QString dir = conf.readEntry("LastDir", "");
+		ui.kleFileName->setText(path);
+		int pos = path.lastIndexOf(QDir::separator());
+		if (pos!=-1) {
+			QString newDir = path.left(pos);
+			if (newDir!=dir)
+				conf.writeEntry("LastDir", newDir);
+		}
+	}
+
+	accept();
+}
+
+/*!
+	Shows/hides the GroupBox with export options in this dialog.
+*/
+void ExportSpreadsheetDialog::toggleOptions(){
+	if (ui.gbOptions->isVisible()){
+		ui.gbOptions->hide();
+		setButtonText(KDialog::User1,i18n("Options >>"));
+	}else{
+		ui.gbOptions->show();
+		setButtonText(KDialog::User1,i18n("Options <<"));
+	}
+
+	//resize the dialog
+	mainWidget->resize(layout()->minimumSize());
+	layout()->activate();
+ 	resize( QSize(this->width(),0).expandedTo(minimumSize()) );
+}
+
+/*!
+	opens a file dialog and lets the user select the file.
+*/
+void ExportSpreadsheetDialog::selectFile() {
+	KConfigGroup conf(KSharedConfig::openConfig(), "ExportSpreadsheetDialog");
+	QString dir = conf.readEntry("LastDir", "");
+    QString path = QFileDialog::getOpenFileName(this, i18n("Export to file"), dir);
+    if (!path.isEmpty()) {
+		ui.kleFileName->setText(path);
+
+		int pos = path.lastIndexOf(QDir::separator());
+		if (pos!=-1) {
+			QString newDir = path.left(pos);
+			if (newDir!=dir)
+				conf.writeEntry("LastDir", newDir);
+		}
+	}
+}
+
+/*!
+	called when the output format was changed. Adjusts the extension for the specified file.
+ */
+void ExportSpreadsheetDialog::formatChanged(int index){
+	QStringList extensions;
+	extensions<<".txt"<<".bin";
+	QString path = ui.kleFileName->text();
+	int i = path.indexOf(".");
+	if (i==-1)
+		path = path + extensions.at(index);
+	else
+		path=path.left(i) + extensions.at(index);
+
+	ui.kleFileName->setText(path);
+}
+
+void ExportSpreadsheetDialog::fileNameChanged(const QString& name) {
+	enableButtonOk( !name.simplified().isEmpty() );
+}
diff --git a/src/kdefrontend/spreadsheet/ExportSpreadsheetDialog.h b/src/kdefrontend/spreadsheet/ExportSpreadsheetDialog.h
new file mode 100644
index 0000000..2552e64
--- /dev/null
+++ b/src/kdefrontend/spreadsheet/ExportSpreadsheetDialog.h
@@ -0,0 +1,59 @@
+/***************************************************************************
+    File                 : ExportSpreadsheetDialog.h
+    Project              : LabPlot
+    Description          : export spreadsheet dialog
+    --------------------------------------------------------------------
+    Copyright            : (C) 2014 by Alexander Semke (alexander.semke at web.de)
+
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *  This program is free software; you can redistribute it and/or modify   *
+ *  it under the terms of the GNU General Public License as published by   *
+ *  the Free Software Foundation; either version 2 of the License, or      *
+ *  (at your option) any later version.                                    *
+ *                                                                         *
+ *  This program is distributed in the hope that it will be useful,        *
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *  GNU General Public License for more details.                           *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the Free Software           *
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor,                    *
+ *   Boston, MA  02110-1301  USA                                           *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef EXPORTSPREADSHEETDIALOG_H
+#define EXPORTSPREADSHEETDIALOG_H
+
+#include <KDialog>
+#include "ui_exportspreadsheetwidget.h"
+#include "commonfrontend/spreadsheet/SpreadsheetView.h"
+
+class ExportSpreadsheetDialog: public KDialog{
+  Q_OBJECT
+
+  public:
+	explicit ExportSpreadsheetDialog(QWidget*);
+	QString path() const;
+	void setFileName(const QString&);
+	bool exportHeader() const;
+	const QString& separator() const;
+
+  private:
+	QWidget* mainWidget;
+	Ui::ExportSpreadsheetWidget ui;
+
+  private slots:
+	void slotButtonClicked(int);
+	void okClicked();
+	void toggleOptions();
+	void selectFile();
+	void formatChanged(int);
+	void fileNameChanged(const QString&);
+};
+
+#endif
diff --git a/src/kdefrontend/ui/spreadsheet/exportspreadsheetwidget.ui b/src/kdefrontend/ui/spreadsheet/exportspreadsheetwidget.ui
new file mode 100644
index 0000000..94709ac
--- /dev/null
+++ b/src/kdefrontend/ui/spreadsheet/exportspreadsheetwidget.ui
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ExportSpreadsheetWidget</class>
+ <widget class="QWidget" name="ExportSpreadsheetWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>370</width>
+    <height>201</height>
+   </rect>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QGroupBox" name="gbExport">
+     <property name="title">
+      <string>Export</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0">
+       <widget class="QLabel" name="lFormat">
+        <property name="text">
+         <string>Format</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="KComboBox" name="cbFormat"/>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="lFileName">
+        <property name="text">
+         <string>File name</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="KLineEdit" name="kleFileName">
+        <property name="toolTip">
+         <string>Specify the name of the file to import.</string>
+        </property>
+        <property name="showClearButton" stdset="0">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="2">
+       <widget class="QPushButton" name="bOpen">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Minimum" vsizetype="Minimum">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+        <property name="toolTip">
+         <string> Select the file to import</string>
+        </property>
+        <property name="text">
+         <string/>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="gbOptions">
+     <property name="title">
+      <string>Options</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="0">
+       <widget class="QLabel" name="lExportHeader">
+        <property name="toolTip">
+         <string>Check this option if the worksheet background should be exported.</string>
+        </property>
+        <property name="text">
+         <string>Export header</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QCheckBox" name="chkExportHeader">
+        <property name="toolTip">
+         <string>Check this option if the worksheet background should be exported.</string>
+        </property>
+        <property name="text">
+         <string/>
+        </property>
+        <property name="checked">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="lSeparator">
+        <property name="text">
+         <string>Separating character</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="KComboBox" name="cbSeparator">
+        <property name="editable">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>KComboBox</class>
+   <extends>QComboBox</extends>
+   <header>kcombobox.h</header>
+  </customwidget>
+  <customwidget>
+   <class>KLineEdit</class>
+   <extends>QLineEdit</extends>
+   <header>klineedit.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>


More information about the kde-doc-english mailing list