34       QStringList formattersAllowList{ QStringLiteral( 
"KeyValue" ),
 
   35                                        QStringLiteral( 
"List" ),
 
   36                                        QStringLiteral( 
"ValueRelation" ),
 
   37                                        QStringLiteral( 
"ValueMap" ) };
 
   39       for ( 
int i = 0; i < mLayer->fields().count(); ++i )
 
   43         if ( formattersAllowList.contains( fieldFormatter->
id() ) )
 
   45           mFormatters[i] = fieldFormatter;
 
   46           mConfig[i] = setup.
config();
 
   56       int idx = mLayer->fields().indexFromName( 
field.
name() );
 
   57       if ( mFormatters.contains( idx ) )
 
   64     QVariant 
convert( 
int i, 
const QVariant &value )
 override 
   71       if ( mCaches.contains( i ) )
 
   73         cache = mCaches.value( i );
 
   77         cache = 
formatter->createCache( mLayer.data(), i, mConfig.value( i ) );
 
   81       return formatter->representValue( mLayer.data(), i, mConfig.value( i ), cache, value );
 
   84     FieldValueConverter *
clone()
 const override 
   90     QPointer< QgsVectorLayer > 
mLayer;
 
   91     QMap< int, const QgsFieldFormatter * > mFormatters;
 
   92     QMap< int, QVariantMap > mConfig;
 
   93     QMap< int, QVariant > mCaches;
 
   96 QString QgsExportToSpreadsheetAlgorithm::name()
 const 
   98   return QStringLiteral( 
"exporttospreadsheet" );
 
  101 QString QgsExportToSpreadsheetAlgorithm::displayName()
 const 
  103   return QObject::tr( 
"Export to spreadsheet" );
 
  106 QStringList QgsExportToSpreadsheetAlgorithm::tags()
 const 
  108   return QObject::tr( 
"microsoft,excel,xls,xlsx,calc,open,office,libre,ods" ).split( 
',' );
 
  111 QString QgsExportToSpreadsheetAlgorithm::group()
 const 
  113   return QObject::tr( 
"Layer tools" );
 
  116 QString QgsExportToSpreadsheetAlgorithm::groupId()
 const 
  118   return QStringLiteral( 
"layertools" );
 
  121 void QgsExportToSpreadsheetAlgorithm::initAlgorithm( 
const QVariantMap & )
 
  124   addParameter( 
new QgsProcessingParameterBoolean( QStringLiteral( 
"USE_ALIAS" ), QObject::tr( 
"Use field aliases as column headings" ), 
false ) );
 
  125   addParameter( 
new QgsProcessingParameterBoolean( QStringLiteral( 
"FORMATTED_VALUES" ), QObject::tr( 
"Export formatted values instead of raw values" ), 
false ) );
 
  127   outputParameter->
setMetadata( QVariantMap( {{QStringLiteral( 
"widget_wrapper" ), QVariantMap( {{QStringLiteral( 
"dontconfirmoverwrite" ), 
true }} ) }} ) );
 
  128   addParameter( outputParameter );
 
  133 QString QgsExportToSpreadsheetAlgorithm::shortHelpString()
 const 
  135   return QObject::tr( 
"This algorithm collects a number of existing layers and exports them into a spreadsheet document.\n\n" 
  136                       "Optionally the layers can be appended to an existing spreadsheet as additional sheets.\n\n" );
 
  139 QgsExportToSpreadsheetAlgorithm *QgsExportToSpreadsheetAlgorithm::createInstance()
 const 
  141   return new QgsExportToSpreadsheetAlgorithm();
 
  146   const QList< QgsMapLayer * > layers = parameterAsLayerList( parameters, QStringLiteral( 
"LAYERS" ), context );
 
  149     mLayers.emplace_back( layer->clone() );
 
  152   if ( mLayers.empty() )
 
  153     feedback->
reportError( QObject::tr( 
"No layers selected, spreadsheet will be empty" ), 
false );
 
  160   const bool overwrite = parameterAsBoolean( parameters, QStringLiteral( 
"OVERWRITE" ), context );
 
  161   QString outputPath = parameterAsString( parameters, QStringLiteral( 
"OUTPUT" ), context );
 
  162   if ( outputPath.isEmpty() )
 
  165   const bool useAlias = parameterAsBoolean( parameters, QStringLiteral( 
"USE_ALIAS" ), context );
 
  166   const bool formattedValues = parameterAsBoolean( parameters, QStringLiteral( 
"FORMATTED_VALUES" ), context );
 
  167   bool createNew = 
true;
 
  169   if ( overwrite && QFile::exists( outputPath ) )
 
  171     feedback->
pushInfo( QObject::tr( 
"Removing existing file '%1'" ).arg( outputPath ) );
 
  172     if ( !QFile( outputPath ).remove() )
 
  177   else if ( QFile::exists( outputPath ) )
 
  182   QFileInfo fi( outputPath );
 
  185   OGRSFDriverH hDriver = OGRGetDriverByName( driverName.toLocal8Bit().constData() );
 
  188     if ( driverName == QLatin1String( 
"ods" ) )
 
  196   if ( !QFile::exists( outputPath ) )
 
  200       throw QgsProcessingException( QObject::tr( 
"Creation of spreadsheet %1 failed (OGR error: %2)" ).arg( outputPath, QString::fromUtf8( CPLGetLastErrorMsg() ) ) );
 
  203   bool errored = 
false;
 
  207   QStringList outputLayers;
 
  209   for ( 
const auto &layer : mLayers )
 
  214     multiStepFeedback.setCurrentStep( i );
 
  220       feedback->
pushDebugInfo( QObject::tr( 
"Error retrieving map layer." ) );
 
  225     feedback->
pushInfo( QObject::tr( 
"Exporting layer %1/%2: %3" ).arg( i ).arg( mLayers.size() ).arg( layer ? layer->name() : QString() ) );
 
  227     FieldValueConverter converter( qobject_cast< QgsVectorLayer * >( layer.get() ) );
 
  229     if ( !exportVectorLayer( qobject_cast< QgsVectorLayer * >( layer.get() ), outputPath,
 
  230                              context, &multiStepFeedback, driverName, createNew, useAlias, formattedValues ? &converter : 
nullptr ) )
 
  234       outputLayers.append( QStringLiteral( 
"%1|layername=%2" ).arg( outputPath, layer->name() ) );
 
  243   outputs.insert( QStringLiteral( 
"OUTPUT" ), outputPath );
 
  244   outputs.insert( QStringLiteral( 
"OUTPUT_LAYERS" ), outputLayers );
 
  266     feedback->
reportError( QObject::tr( 
"Exporting layer failed: %1" ).arg( error ) );
 
static QgsFieldFormatterRegistry * fieldFormatterRegistry()
Gets the registry of available field formatters.
bool isCanceled() const SIP_HOLDGIL
Tells whether the operation has been canceled already.
Encapsulate a field in an attribute table or data source.
Base class for all map layer types.
Contains information about the context in which a processing algorithm is executed.
QString defaultEncoding() const
Returns the default encoding to use for newly created files.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context.
Custom exception class for processing related exceptions.
Base class for providing feedback from a processing algorithm.
virtual void pushInfo(const QString &info)
Pushes a general informational message from the algorithm.
virtual void pushDebugInfo(const QString &info)
Pushes an informational message containing debugging helpers from the algorithm.
virtual void reportError(const QString &error, bool fatalError=false)
Reports that the algorithm encountered an error while executing.
Processing feedback object for multi-step operations.
A multi-layer output for processing algorithms which create map layers, when the number and nature of...
A boolean parameter for processing algorithms.
void setMetadata(const QVariantMap &metadata)
Sets the parameter's freeform metadata.
A generic file based destination parameter, for specifying the destination path for a file (non-map l...
A parameter for processing algorithms which accepts multiple map layers.
@ TypeVector
Tables (i.e. vector layers with or without geometry). When used for a sink this indicates the sink ha...
Interface to convert raw field values to their user-friendly value.
FieldValueConverter()=default
Constructor.
virtual QVariant convert(int fieldIdxInLayer, const QVariant &value)
Convert the provided value, for field fieldIdxInLayer.
virtual QgsVectorFileWriter::FieldValueConverter * clone() const
Creates a clone of the FieldValueConverter.
virtual QgsField fieldDefinition(const QgsField &field)
Returns a possibly modified field definition.
Options to pass to writeAsVectorFormat()
QString fileEncoding
Encoding to use.
FieldNameSource fieldNameSource
Source for exported field names.
QString driverName
OGR driver to use.
QString layerName
Layer name. If let empty, it will be derived from the filename.
QgsVectorFileWriter::FieldValueConverter * fieldValueConverter
Field value converter.
QgsVectorFileWriter::ActionOnExistingFile actionOnExistingFile
Action on existing file.
QgsFeedback * feedback
Optional feedback object allowing cancellation of layer save.
static QgsVectorFileWriter::WriterError writeAsVectorFormatV3(QgsVectorLayer *layer, const QString &fileName, const QgsCoordinateTransformContext &transformContext, const QgsVectorFileWriter::SaveVectorOptions &options, QString *errorMessage=nullptr, QString *newFilename=nullptr, QString *newLayer=nullptr)
Writes a layer out to a vector file.
static QString driverForExtension(const QString &extension)
Returns the OGR driver name for a specified file extension.
@ PreferAlias
Use the field alias as the exported field name, wherever one is set. Otherwise use the original field...
@ Original
Use original field names.
@ CreateOrOverwriteLayer
Create or overwrite layer.
@ CreateOrOverwriteFile
Create or overwrite file.
Represents a vector layer which manages a vector based data sets.
std::unique_ptr< std::remove_pointer< OGRDataSourceH >::type, OGRDataSourceDeleter > ogr_datasource_unique_ptr
Scoped OGR data source.