I can suggest a PyQGIS solution. It utilizes the [`openpyxl`](https://pypi.org/project/openpyxl/) Python package. Let's assume there is an Excel file called *'testbook'* with the following data provided on the *'Sheet1'*: [![input][1]][1] Proceed with `Plugins > Python Console > Show Editor` ([see documentation](https://docs.qgis.org/latest/en/docs/pyqgis_developer_cookbook/intro.html#scripting-in-the-python-console)) and paste the script below: <!-- language: pyqgis --> # imports from os.path import realpath, isfile from openpyxl import load_workbook from qgis.core import QgsVectorLayer, QgsField, QgsFeature, QgsPointXY from qgis.PyQt.QtCore import QVariant from qgis.utils import iface # providing a path to the Excel file path_to_excel = realpath("D:/qgis_test/testbook.xlsx") # loading Excel file with a coresponding sheet if isfile(path_to_excel): book = load_workbook(path_to_excel) sheet = book.get_sheet_by_name("Sheet1") # getting field names and data from the Excel file data = [list(value) for value in sheet.values] attrs, records = data[0], data[1:] # creating a vector layer layer = QgsVectorLayer("LineString?crs=epsg:4326", "flows", "memory") # accessing the vector layer provider provider = layer.dataProvider() layer.startEditing() # adding attributes to the vector layer for attr in attrs: if attr == 'id': provider.addAttributes([QgsField(attr, QVariant.Int)]) elif any(i in attr for i in 'XY'): provider.addAttributes([QgsField(attr, QVariant.Double)]) else: provider.addAttributes([QgsField(attr, QVariant.String)]) layer.updateFields() # adding data to the vector layer attributes for record in records: feat = QgsFeature() # creating a feature feat.setAttributes(record) # feeding feature with attribute values pt_from = QgsPointXY(record[4], record[3]) # starting point geometry pt_to = QgsPointXY(record[6], record[5]) # ending point geometry feat.setGeometry(QgsGeometry.fromPolylineXY([pt_from, pt_to])) # creating line geometry if feat.isValid(): # adding feature to the vector layer provider.addFeature(feat) layer.updateExtents() layer.commitChanges() if layer.isValid(): # adding layer to the Project QgsProject.instance().addMapLayer(layer) iface.zoomToActiveLayer() In the code above, please do not forget to change the `"D:/qgis_test/testbook.xlsx"` and `"Sheet1"` variables before running it. Press `Run script` [![run script][2]][2] and get the following output: [![result][3]][3] ---------- **References:** - https://gis.stackexchange.com/questions/222353/reading-excel-data-using-pyqgis - https://gis.stackexchange.com/questions/445087/adding-linestring-from-points-using-pyqgis - [PyQGIS 101: Creating & editing a new vector layer](https://anitagraser.com/pyqgis-101-introduction-to-qgis-python-programming-for-non-programmers/pyqgis101-creating-editing-a-new-vector-layer/) - https://gis.stackexchange.com/questions/468996/joining-vector-layer-with-csv-file-that-contain-duplicates-in-qgis - https://gis.stackexchange.com/questions/30261/creating-new-empty-vector-layer-with-pyqgis - https://gis.stackexchange.com/questions/445087/adding-linestring-from-points-using-pyqgis [1]: https://i.sstatic.net/8MfqX2wT.png [2]: https://i.sstatic.net/vHkKx.png [3]: https://i.sstatic.net/izqrp9j8.png