When joining two layers, you can set a prefix for the joined attribute fields. The standard is the name of the joined layer. This ensures, that all fields will be joined together. In addition to that, shapefiles field names are restricted to 10 characters.
Thus the field "meaningful_fieldname" from a layer "my_long_layername" will be something like "my_long__1" which is not meaningful at all.
A solution could be, that you set the Coustum field name prefix under Joins as something like "_" as shown in the image which will result in "_meaningfu"
Ss Joseph suggests using an alias will make the names readable again and will show in the Label and styling tabs of the layer context menu. However, they are not preserved with a simple Save as.. command in QGIS. You need to either save a style file or define the default style with the alias in the style menu.
The workflow for the whole process could be something like this:
- Join your table and the shapefile
- Save the layer with the joined fields.
- Set the style and the alias for the fields
- follow my first edit to save this as a default styling
- Result: Now when you load the data the styling and the aliases should be preserved (tested with QGIS 2.18.13)
A funny sidenote: When you choose a long alias, it will be correctly displayed in the drop-down menu for style and labels but the old name will be displayed when selected.