How about something like this:
import io
import pandas as pd
@anvil.server.callable
def export_to_excel(data, columns):
df = pd.DataFrame(data, columns=columns)
content = io.BytesIO()
df.to_excel(content, index=False)
content.seek(0, 0)
return BlobMedia(content=content.read(), content_type="application/vnd.ms-excel")
and on the client side, you might have this in a click hander for a download button:
def download_button_click(self, **event_args):
result = anvil.server.call("export_to_excel", <pass your data and columns here>)
anvil.media.download(result)