Asp.net-显示存储在SQL Server中的Word文档内容

时间:2018-08-11 18:52:24

标签: asp.net

我们已将Worddocument(办公doc / docx文件)存储为varbinary(max)在SQL Server中,但是当我们以无格式方式显示其显示数据以及一些加密文本时……

文档内容,例如:

Description about the document :
(a) SQL Server 2016 to be used for all upcoming projects;
(b) SQL Server 2016 Enterprise edition will be used on all servers
(c) Assumptions:
(i) SQL Server will be installed on VM instances

Saved in SQL Server with below code:

create table Documents(id int identity(1,1), document VARBINARY(MAX))
go 

--Insert Word document into database
INSERT INTO Documents(document) 
SELECT * FROM OPENROWSET(BULK 'D:\found.docx', SINGLE_BLOB) AS doc

select * from documents

        string sConn = @"server=.; database=DocumentManagement; Integrated Security=True";
        SqlConnection objConn = new SqlConnection(sConn);
        objConn.Open();
         SqlCommand objCmd = new SqlCommand("BLOBViewer", objConn);
        objCmd.CommandType = CommandType.StoredProcedure;
        SqlDataReader dr = objCmd.ExecuteReader();
        while (dr.Read())
        {
            Response.BinaryWrite((byte[])dr["Document"]);
        }
            Response.Flush();
            Response.Close();
            Response.End();

2 个答案:

答案 0 :(得分:3)

.NET原生不支持阅读Word文档。 您必须使用一些第三方工具来实现此目的。 我们主要使用Aspose.Word,它不仅让您阅读内容,还可以做更多的事情;您也可以操作它。但这是有代价的。

如果您正在寻找免费的东西,那么我建议您将Word文档转换为PDF,然后将其存储在DB中。您可以使用大量免费的库来阅读PDF文件的内容。 PDFSharpiTextSharp只是两个示例。

答案 1 :(得分:1)

这是您如何整齐地下载文件的方法。假设它已正确存储在SQL中。

但是,一次只能处理1个文件。您不能选择带有select * from documents的所有文件,并且不能期望将它们下载为单个文件,它不能那样工作。因此,您必须创建一个存储过程,一次选择一个文件:select * from documents WHERE (Name = 'FileName')或类似的文件。

//declare an empty byte array and filename
byte[] bin = new byte[0];
string fileName = "";

//use 'using' to properly close and dispose connections and objects
using (SqlConnection objConn = new SqlConnection(sConn))
using (SqlCommand objCmd = new SqlCommand("BLOBViewer", objConn))
{
    objCmd.CommandType = CommandType.StoredProcedure;
    objConn.Open();

    using (SqlDataReader dr = objCmd.ExecuteReader())
    {
        while (dr.Read())
        {
            bin = (byte[])dr["Document"];
            fileName = dr["Name"].ToString();
        }
    }
}

//check if there is a file
if (bin.Length == 0)
{
    Label1.Text = "No file found";
    return;
}

//send the file to the browser
Response.ClearHeaders();
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/msword";
Response.AddHeader("content-length", bin.Length.ToString());
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + "\"");
Response.OutputStream.Write(bin, 0, bin.Length);
Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();