34      const QStringList formattersAllowList { QStringLiteral( 
"KeyValue" ), QStringLiteral( 
"List" ), QStringLiteral( 
"ValueRelation" ), QStringLiteral( 
"ValueMap" ) };
 
   36      for ( 
int i = 0; i < mLayer->fields().count(); ++i )
 
   40        if ( formattersAllowList.contains( fieldFormatter->
id() ) )
 
   42          mFormatters[i] = fieldFormatter;
 
   43          mConfig[i] = setup.
config();
 
   53      const int idx = mLayer->fields().indexFromName( field.
name() );
 
   54      if ( mFormatters.contains( idx ) )
 
   56        QgsField newField( field.
name(), QMetaType::Type::QString );
 
   57        newField.setAlias( field.
alias() );
 
   63    QVariant 
convert( 
int i, 
const QVariant &value )
 override 
   70      if ( mCaches.contains( i ) )
 
   72        cache = mCaches.value( i );
 
   76        cache = formatter->
createCache( mLayer.data(), i, mConfig.value( i ) );
 
   80      return formatter->
representValue( mLayer.data(), i, mConfig.value( i ), cache, value );
 
   83    FieldValueConverter *
clone()
 const override 
   89    QPointer<QgsVectorLayer> 
mLayer;
 
   90    QMap<int, const QgsFieldFormatter *> mFormatters;
 
   91    QMap<int, QVariantMap> mConfig;
 
   92    QMap<int, QVariant> mCaches;
 
   95QString QgsExportToSpreadsheetAlgorithm::name()
 const 
   97  return QStringLiteral( 
"exporttospreadsheet" );
 
  100QString QgsExportToSpreadsheetAlgorithm::displayName()
 const 
  102  return QObject::tr( 
"Export to spreadsheet" );
 
  105QStringList QgsExportToSpreadsheetAlgorithm::tags()
 const 
  107  return QObject::tr( 
"microsoft,excel,xls,xlsx,calc,open,office,libre,ods" ).split( 
',' );
 
  110QString QgsExportToSpreadsheetAlgorithm::group()
 const 
  112  return QObject::tr( 
"Layer tools" );
 
  115QString QgsExportToSpreadsheetAlgorithm::groupId()
 const 
  117  return QStringLiteral( 
"layertools" );
 
  120void QgsExportToSpreadsheetAlgorithm::initAlgorithm( 
const QVariantMap & )
 
  123  addParameter( 
new QgsProcessingParameterBoolean( QStringLiteral( 
"USE_ALIAS" ), QObject::tr( 
"Use field aliases as column headings" ), 
false ) );
 
  124  addParameter( 
new QgsProcessingParameterBoolean( QStringLiteral( 
"FORMATTED_VALUES" ), QObject::tr( 
"Export formatted values instead of raw values" ), 
false ) );
 
  126  outputParameter->
setMetadata( QVariantMap( { { QStringLiteral( 
"widget_wrapper" ), QVariantMap( { { QStringLiteral( 
"dontconfirmoverwrite" ), 
true } } ) } } ) );
 
  127  addParameter( outputParameter );
 
  132QString QgsExportToSpreadsheetAlgorithm::shortHelpString()
 const 
  134  return QObject::tr( 
"This algorithm collects a number of existing layers and exports them to a spreadsheet document.\n\n" 
  135                      "Optionally the layers can be appended to an existing spreadsheet as additional sheets.\n\n" );
 
  138QString QgsExportToSpreadsheetAlgorithm::shortDescription()
 const 
  140  return QObject::tr( 
"Collects a number of existing layers and exports them to a spreadsheet document." );
 
  143QgsExportToSpreadsheetAlgorithm *QgsExportToSpreadsheetAlgorithm::createInstance()
 const 
  145  return new QgsExportToSpreadsheetAlgorithm();
 
  150  const QList<QgsMapLayer *> layers = parameterAsLayerList( parameters, QStringLiteral( 
"LAYERS" ), context );
 
  153    mLayers.emplace_back( layer->clone() );
 
  156  if ( mLayers.empty() )
 
  157    feedback->
reportError( QObject::tr( 
"No layers selected, spreadsheet will be empty" ), 
false );
 
  164  const bool overwrite = parameterAsBoolean( parameters, QStringLiteral( 
"OVERWRITE" ), context );
 
  165  const QString outputPath = parameterAsString( parameters, QStringLiteral( 
"OUTPUT" ), context );
 
  166  if ( outputPath.isEmpty() )
 
  169  const bool useAlias = parameterAsBoolean( parameters, QStringLiteral( 
"USE_ALIAS" ), context );
 
  170  const bool formattedValues = parameterAsBoolean( parameters, QStringLiteral( 
"FORMATTED_VALUES" ), context );
 
  171  bool createNew = 
true;
 
  173  if ( overwrite && QFile::exists( outputPath ) )
 
  175    feedback->
pushInfo( QObject::tr( 
"Removing existing file '%1'" ).arg( outputPath ) );
 
  176    if ( !QFile( outputPath ).remove() )
 
  181  else if ( QFile::exists( outputPath ) )
 
  186  const QFileInfo fi( outputPath );
 
  189  OGRSFDriverH hDriver = OGRGetDriverByName( driverName.toLocal8Bit().constData() );
 
  192    if ( driverName == QLatin1String( 
"ods" ) )
 
  200  if ( !QFile::exists( outputPath ) )
 
  204      throw QgsProcessingException( QObject::tr( 
"Creation of spreadsheet %1 failed (OGR error: %2)" ).arg( outputPath, QString::fromUtf8( CPLGetLastErrorMsg() ) ) );
 
  207  bool errored = 
false;
 
  211  QStringList outputLayers;
 
  213  for ( 
const auto &layer : mLayers )
 
  218    multiStepFeedback.setCurrentStep( i );
 
  224      feedback->
pushDebugInfo( QObject::tr( 
"Error retrieving map layer." ) );
 
  229    feedback->
pushInfo( QObject::tr( 
"Exporting layer %1/%2: %3" ).arg( i ).arg( mLayers.size() ).arg( layer ? layer->name() : QString() ) );
 
  231    FieldValueConverter converter( qobject_cast<QgsVectorLayer *>( layer.get() ) );
 
  233    if ( !exportVectorLayer( qobject_cast<QgsVectorLayer *>( layer.get() ), outputPath, context, &multiStepFeedback, driverName, createNew, useAlias, formattedValues ? &converter : nullptr ) )
 
  237      outputLayers.append( QStringLiteral( 
"%1|layername=%2" ).arg( outputPath, layer->name() ) );
 
  246  outputs.insert( QStringLiteral( 
"OUTPUT" ), outputPath );
 
  247  outputs.insert( QStringLiteral( 
"OUTPUT_LAYERS" ), outputLayers );
 
  268    feedback->
reportError( QObject::tr( 
"Exporting layer failed: %1" ).arg( error ) );
 
@ Vector
Tables (i.e. vector layers with or without geometry). When used for a sink this indicates the sink ha...
 
static QgsFieldFormatterRegistry * fieldFormatterRegistry()
Gets the registry of available field formatters.
 
bool isCanceled() const
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.
 
Interface to convert raw field values to their user-friendly values.
 
FieldValueConverter()=default
 
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 QgsVectorFileWriter::writeAsVectorFormat().
 
QString fileEncoding
Encoding to use.
 
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.
 
QgsVectorFileWriter::FieldNameSource fieldNameSource
Source for exported field names.
 
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 dataset.
 
std::unique_ptr< std::remove_pointer< OGRDataSourceH >::type, OGRDataSourceDeleter > ogr_datasource_unique_ptr
Scoped OGR data source.