C# 从SQL SELECT查询在SQL server中创建Excel二进制文件

C# 从SQL SELECT查询在SQL server中创建Excel二进制文件,c#,sql,sql-server,excel,C#,Sql,Sql Server,Excel,虽然我很清楚如何从SQL server创建Excel文件,但这一特殊要求是创建二进制文件,而无需保存到文件系统 伪代码如下所示: DECLARE @ExcelBinaryData varbinary(max) SELECT * FROM someTable FOR EXPORT to @ExcelBinaryData string connectionString = "your connection string"; int id = 1; SqlConnection conn = new

虽然我很清楚如何从SQL server创建Excel文件,但这一特殊要求是创建二进制文件,而无需保存到文件系统

伪代码如下所示:

DECLARE @ExcelBinaryData varbinary(max)
SELECT * FROM someTable FOR EXPORT to @ExcelBinaryData
string connectionString = "your connection string";
int id = 1;
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT [ExcelData] FROM [SavedFiles] WHERE ID = @ID";
cmd.Parameters.AddWithValue("@ID", id);
SqlDataReader dr = cmd.ExecuteReader();

if (dr.Read())
{
    byte[] bytes = (byte[])dr["ExcelData"];
    Response.Buffer = true;
    Response.Charset = "";
    Response.AddHeader("content-disposition", @"attachment;filename=""file.xlsx""");
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.BinaryWrite(bytes);
    Response.End();
}
我想把这个二进制文件返回给C应用程序下载

对于不需要将文件保存到服务器的解决方案,我们将不胜感激。我知道如何保存文件,然后读取二进制文件。但这一要求是在不向文件系统写入任何内容的情况下执行


提前感谢。

从数据库中选择二进制数据后,将其添加到响应中。 大概是这样的:

DECLARE @ExcelBinaryData varbinary(max)
SELECT * FROM someTable FOR EXPORT to @ExcelBinaryData
string connectionString = "your connection string";
int id = 1;
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT [ExcelData] FROM [SavedFiles] WHERE ID = @ID";
cmd.Parameters.AddWithValue("@ID", id);
SqlDataReader dr = cmd.ExecuteReader();

if (dr.Read())
{
    byte[] bytes = (byte[])dr["ExcelData"];
    Response.Buffer = true;
    Response.Charset = "";
    Response.AddHeader("content-disposition", @"attachment;filename=""file.xlsx""");
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.BinaryWrite(bytes);
    Response.End();
}

请记住,这不是一个完整的解决方案,只是一个提示,我没有时间测试它。

好的,为了防止其他人需要这样做,我已经决定妥协,使用OLE DB和ACE驱动程序写入Excel临时文件,然后发送到SQL。Excel文件操作如下所示

PS:如果你和我一样为主要客户编写代码,我们倾向于避免随机编写的库,因为这些库可能会给系统带来安全漏洞。此代码使用MS库,不使用其他外部源

string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;c:\\someFile.xlsx";Extended Properties=\"Excel 12.0 Xml;HDR=NO;IMEX=1\"";
     using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                conn.Open();
                OleDbCommand cmd = new OleDbCommand();
                cmd.Connection = conn;

                cmd.CommandText = "CREATE TABLE [table1] (id INT, name VARCHAR, datecol DATE );";
                cmd.ExecuteNonQuery();

                cmd.CommandText = "INSERT INTO [table1](id,name,datecol) VALUES(1,'AAAA','2014-01-01');";
                cmd.ExecuteNonQuery();

                cmd.CommandText = "INSERT INTO [table1](id,name,datecol) VALUES(2, 'BBBB','2014-01-03');";
                cmd.ExecuteNonQuery();

                cmd.CommandText = "INSERT INTO [table1](id,name,datecol) VALUES(3, 'CCCC','2014-01-03');";
                cmd.ExecuteNonQuery();

                cmd.CommandText = "UPDATE [table1] SET name = 'DDDD' WHERE id = 3;";
                cmd.ExecuteNonQuery();

                conn.Close();
            }

是的,当您将二进制文件保存在Excel中时,就很容易了。如上所述,我有一个SELECT语句,如SELECT name、USTERNAME,我想将其保存到Excel二进制文件并返回到我的C应用程序。我使用HttpMessage将二进制MIME类型的文件名发送到浏览器。我缺少的是需要从头创建的Excel二进制文件。这并不是那么简单。谷歌的NPOI库,你们会发现图书馆创建Excel文件。而且,我记得没错,您必须将创建的excel保存到文件系统。。。