【问题标题】:Create Excel binary in SQL server from an SQL SELECT query从 SQL SELECT 查询在 SQL Server 中创建 Excel 二进制文件
【发布时间】:2017-02-16 10:13:20
【问题描述】:

虽然我非常了解如何从 SQL 服务器创建 Excel 文件,但这个特殊要求是创建 BINARIES,而无需保存到文件系统。

类似这样的伪代码:

DECLARE @ExcelBinaryData varbinary(max)
SELECT * FROM someTable FOR EXPORT to @ExcelBinaryData

我希望将此二进制文件返回到 C# 应用程序以供下载。

欣赏不需要将文件保存到服务器的解决方案。我知道如何保存文件然后读取二进制文件。但是这个要求是在不写入文件系统的情况下完成。

提前致谢。

【问题讨论】:

    标签: c# sql sql-server excel


    【解决方案1】:

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

    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();
    }
    

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

    【讨论】:

    • 是的,当您将二进制文件保存在 Excel 中时,这很容易。如上所述,我有一个 SELECT 语句,例如“SELECT name, surname FROM users”,我想将其保存到 Excel 二进制文件并返回到我的 C# 应用程序。我使用 HTTPMessaging 将二进制、MIME 类型、文件名发送到浏览器。缺少的是需要从头开始创建的 Excel 二进制文件。
    • 这不是那么简单。 Google for NPOI 库,您会找到用于创建 Excel 文件的库。而且,我没记错,您必须将创建的 excel 保存到文件系统...
    【解决方案2】:

    好的,以防万一其他人需要这样做,我已经妥协,使用 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();
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-20
      • 2012-05-19
      • 2022-01-20
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多