我正在尝试使用for循环执行查询。对于每个循环,它应该下载一个excel文件。该解决方案工作正常,但只下载了第一个文件,而没有下载其他两个文件。我还附上了下面的完整代码。
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Btn_Click(object sender, EventArgs e)
{
DataTable it = GetList();
foreach(DataRow dr in it.Rows)
{
string a = dr[0].ToString();
for (int i = 0; i < 3; i++)
{
string inm = it.Rows[i][0].ToString();
DataTable gt = GetData(inm);
ExportToSpreadsheet(gt, "Samples");
}
}
}
public DataTable GetData(string i)
{
SqlCommand command = null;
SqlConnection conn = null;
conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
conn.Open();
command = new SqlCommand("SELECT id, name, class FROM StudentTable WHERE (id = " + i + ") ORDER BY name";
DataTable dt = new DataTable();
SqlDataAdapter ada = new SqlDataAdapter(command);
ada.Fill(dt);
return dt;
}
public static void ExportToSpreadsheet(DataTable table, string name)
{
HttpContext context = HttpContext.Current;
context.Response.ClearContent();
context.Response.ContentType = "text/vnd.ms-excel";
context.Response.AppendHeader("Content-Disposition", "attachment; filename=" + name + ".xls");
string tab = "";
foreach (DataColumn dc in table.Columns)
{
context.Response.Write(tab + dc.ColumnName);
tab = "\t";
}
context.Response.Write("\n");
context.Response.Write("\n");
int i;
foreach (DataRow dr in table.Rows)
{
tab = "";
for (i = 0; i < table.Columns.Count; i++)
{
context.Response.Write(tab + dr[i].ToString());
tab = "\t";
}
context.Response.Write("\n");
}
context.Response.End();
}
我见过类似的帖子。有人建议,可以在服务器上创建zip文件,并在“zip”文件夹中下载多个excel文件。如果可能,我该如何实现上述解决方案呢?
答案 0 :(得分:1)
你在创建第一个文件后调用response.end - 它会中止进程的其余部分。
我认为您无法使用此方法创建3个Excel文件供下载。
作为替代方案,您可以在磁盘上创建3个CSV文件,然后使用zip库将其压缩。 见zipping files
或者您可以将JET与Excel连接字符串一起使用,并使用SQL Insert语句将数据推送到空的Excel文件中。并为每个表使用不同的工作表
write to excel with JET(但这会将你限制在32位)
或者你可以使用第三方控件来编写一个excel文件,将三个表作为工作表
但如果我是你 - 我只是向用户展示他们可以点击的3个不同的链接。