I don't know about doing this via ajax, but you can do this easily with a hidden iframe on your page:
page1.aspx:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
function test() {
document.getElementById("ifr").src = "page2.aspx";
}
</script>
</head>
<body >
<form id="form1" runat="server">
<asp:Button ID="doit" runat="server" OnClientClick="test(); return false;" />
<iframe id="ifr" style="display:none" />
</form>
</body>
</html>
Page2.aspx:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Page2.aspx.vb" Inherits="Page2" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
page2.aspx.vb:
Partial Class Page2
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Response.Clear()
Response.AddHeader("content-disposition", "attachment;filename=FileName.xls")
Response.ContentType = "application/vnd.xls"
Response.Write("FirstName")
Response.Write(Environment.NewLine)
Response.Write("Igor")
Response.End()
End Sub
End Class