You have to construct your table row by row, not column by column. That also means that all_data should be a list of rows, not a dictionary of columns (which it seems to be now). So you want to construct all_data like this:
[
{'name': 'Mr. Shaw', 'office': 'Orange LLP', 'address': '123 Main Str'},
{'name': 'Bill', 'office': 'Apple LLP', 'address': '124 Bone St'},
... ]
instead of like this:
{
'name': ['Mr. Shaw', 'Bill', ...],
'office': ['Orange LLP', 'Apple LLP', ...],
'address': ['123 Bone St', ...]
}
If you're sure the lengths of your lists are all the same (it looks like it), you can transpose the second format to the first using:
all_data = [{'name': all_data['name'][i], 'office': all_data['office'][i], ...} for i in range(len(all_data['name']))]
or there's surely a function on DataFrame to do this (transpose()?)
Then in your template you just have one loop:
{% for solicitor in all_data %}
{{ solicitor.name }}{{ solicitor.office }}...
{% endfor %}