What you refer to as the "traditional" way is what everyone else calls the "wrong" way. :)
You are generating an HTML table, but lying to the browser and telling it you've sent an Excel file. The browser passes the response to Excel, which does its best to convert that HTML into a read Excel file, but it won't be perfect, and it will display a "wrong file type" warning.
Rather than trying to create and export a Crystal report to mimic your grid, use something like
ClosedXML[
^] to generate a real Excel file, and send that instead.