There are other good answers about the issues around javascript:void(0)
but for me, the question about whether or not it is more appropriate to use a link or a button comes down to whether the download is simply a URL (in which case a link should be used) or something more complex (POST request, API action, etc.) in which case a button is more appropriate.
Basically, if I can access the file simply by pasting a URL into my address bar, then I would expect to see a link to that file, rather than obfuscating it via JavaScript.
I think it is reasonable to use styling to stop it looking like a standard link and more of a call to action - even to the extent that it looks like a button, if that is more intuitive for your audience - but you should ensure the underlying semantics are appropriate, first.
(FWIW I've also done it the other way round, e.g. where - for technical reasons - I've needed to implement 'cancel' as a button. However, as it is conceptually just a link back to some other page, I styled it to look like a normal anchor tag.)