2

In QGIS I want to select features from multiple layers (how many layers and what layers changes depending on the work) merge them into 1 layer (attribute only) then export to a spreadsheet.

I know i can select the features then right click each layer and save selected features as, then merge the resulting spreadsheets but that is slow and cumbersome. i also know i can run extract selected features in a batch process then run merge vector layers and output the result as a spreadsheet but that is also slow and cumbersome.

I'm looking at running the extract selected features in model builder with merge vector layers, the issue I'm facing is that I can't set extract selected features to allow for multiple inputs. If i run the model as a batch process each layer gets extract selected features run on it then each selection form each layer get merge vector layers run on it resulting in individual layers instead of 1 combined layer.

What is the best way to go about this?

I tried setting the input for Extract selected features to a pre-calculated value of @map_layers but it errors out when running. I also tried the Multiple input but the Extract selected features doesn't recognize it as a valid input.

enter image description here

enter image description here

Taras
35.8k5 gold badges77 silver badges151 bronze badges
asked Sep 27, 2023 at 5:08
2
  • Do all layers have the same attributes? Do you want all attributes from each layer in the final output? Commented Sep 29, 2023 at 21:00
  • @OGmaps No they do not have all the same attributes and yes i do want all the attributes. Commented Oct 3, 2023 at 19:40

1 Answer 1

0

You asked how to do this using QGIS Model Builder - but it is likely simpler using pyqgis.

Executing the following code in the QGIS Python script editor will generate an xlsx file with fields from all selected features placed in a sheet with the corresponding name.

import json
import pandas as pd
from datetime import datetime
output_dir = r'C:temp'
filename = 'output_{}.xlsx'.format(datetime.now().strftime('%m%d%Y%H%M%S'))
writer = pd.ExcelWriter('{}/{}'.format(output_dir, filename))
for layer in QgsProject.instance().mapLayers().values():
 if layer.type() == QgsMapLayer.VectorLayer:
 if layer.selectedFeatureCount()> 0:
 selected = {f.id(): json.loads(QgsJsonUtils.exportAttributes(f)) for f in layer.getSelectedFeatures()}
 df = pd.DataFrame.from_dict(selected).T
 df.to_excel(writer, layer.name(),index=False)
writer.save()

Since each layer may or may not have the same fields - you will have to figure out a way to organize the data if a single worksheet is part of your requirement.

Example Output

enter image description here

Tested on QGIS v3.28

answered Oct 5, 2023 at 4:54
3
  • This works perfectly. I had a bunch of trouble installing openpyxl in my QGIS environment. For anyone that has the same issue open your OSGeo4W shell and run python -m pip install openpyxl. That was how i was able to install openpyxl in my QGIS python environment. Commented Oct 5, 2023 at 23:17
  • I've tried to save this script in my processing toolbox but it doesn't show up. Is there anything that needs to be added to the script so it can be saved in the processing toolbox? I have made sure the processing options is looking at the folder where the script is saved. Commented Oct 5, 2023 at 23:40
  • When i run the script in the python console it works. But if i run it by left clicking the python icon in processing toolbox and hitting create new script then copying the code into it doesn't work and produces several errors. Commented Oct 5, 2023 at 23:48

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.