使用C#实现将Word 转文本存储到数据库并进行管理

 更新时间:2024年03月25日 08:40:32   作者:初九之潜龙勿用  
这篇文章主要为大家详细介绍了如何使用C#实现将Word 转文本存储到数据库并进行管理,文中的示例代码讲解详细,需要的小伙伴可以参考一下

功能需求

将 WORD 文件的二进制信息存储到数据库里,即方便了统一管理文件,又可以实行权限控制效果,此外,将 WORD 文件转化为文本存储,可以进一步实现对已存储文件的全文检索。 在应用项目里,我们将实现如下需求:

1、上传WORD文件,获取二进制数据和文本数据。

2、将二进制数据和文本数据保存到数据表中。

3、查询需要的数据文件,可提供下载功能。

范例运行环境

操作系统: Windows Server 2019 DataCenter

操作系统上安装 Office Word 2016

数据库:Microsoft SQL Server 2016

.net版本: .netFramework4.7.1 或以上

开发工具:VS2019  C#

设计数据表

打开 Microsoft SQL Server 2016 查询分析器,执行如下代码创建表:

代码片断如下: 

CREATE TABLE [dbo].[f_words](
    [cid] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [filename] [nvarchar](100) NOT NULL,
    [bfile] [image] NULL,
    [fcontent] [nvarchar](max) NULL,
    [sys_instime] [datetime] NULL,
 CONSTRAINT [PK_f_words] PRIMARY KEY CLUSTERED 
(
    [cid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
 
ALTER TABLE [dbo].[f_words] ADD  CONSTRAINT [DF_f_words_cid]  DEFAULT (newid()) FOR [cid]
GO

创建成功后,右击f_words表,点击设计,呈现视图如下:

如图字段CID为唯一标识;filename存储上传时获取的文件名;bfile存储Word文件的二进制数据;fcontent存储WORD文件的文本转化信息;sys_instime存储添加的时间。 

关键代码

组件库引入

Word文件内容转文本

public string getWordTxt(string _filename,bool getHtmlContent) 方法,参数1 传入要读取的 WORD 文件路径,参数2 设定是否获取HTML格式的文本。

public string getWordTxt(string _filename,bool getHtmlContent)
        {
            resultReport = "";
            Object Nothing = System.Reflection.Missing.Value;
 
            object filename = _filename;
            //创建一个名为WordApp的组件对象
            DateTime beforetime = DateTime.Now;
            Word.Application WordApp = new Word.Application();
            //创建一个名为WordDoc的文档对象
            WordApp.DisplayAlerts = Word.WdAlertLevel.wdAlertsNone;
 
            Word.Document WordDoc = WordApp.Documents.Open(ref filename, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing, ref Nothing);
 
            WordDoc.SpellingChecked = false;//关闭拼写检查
 
            WordDoc.ShowSpellingErrors = false;//关闭显示拼写错误提示框
 
            DateTime aftertime = DateTime.Now;
 
            string rv = WordDoc.Content.Text;
            Sys_Custom_DocVar = "";
            Sys_Custom_DocVar2 = "";
            foreach (Word.Variable ov in WordDoc.Variables)
            {
                if (ov.Name == "sys_custom_docvar")
                {
                    //                    WordDoc.Content.Text = ov.Value;
                    Sys_Custom_DocVar = ov.Value;
                } else if (ov.Name == "sys_custom_docvar2")
                {
                    //                    WordDoc.Content.Text = ov.Value;
                    Sys_Custom_DocVar2 = ov.Value;
                }
            }
            foreach (Word.ContentControl cc in WordDoc.ContentControls)
            {
                resultReport += cc.ID + ":" + cc.Tag + "<br>";
 
            }
            string _path = Path.GetDirectoryName(_filename) + "\\";
 
            object _expFile = _path + Guid.NewGuid().ToString() + ".html";
            if (getHtmlContent == true)
            {
                object   wsf = Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatHTML;
                WordDoc.SaveAs2(ref _expFile,ref wsf, ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing,ref Nothing);
            }
            WordDoc.Close(ref Nothing, ref Nothing, ref Nothing);
            //关闭WordApp组件对象
            WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);
 
            KillProcessByStartTime("WINWORD",beforetime,aftertime);
 
            if (File.Exists(_expFile.ToString()) == true)
            {
                FileEx fe = new FileEx();
                rv = fe.LoadFromFile(_expFile.ToString(), Encoding.Default);
                File.Delete(_expFile.ToString());
            }
            return rv;
        }
 
public string KillProcessByStartTime(string processName,DateTime beforetime,DateTime aftertime)
        {
            Process[] ps = Process.GetProcesses();
            foreach (Process p in ps)  
            {
                if(p.ProcessName.ToUpper()!=processName) continue;
                if(p.StartTime > beforetime && p.StartTime < aftertime)
                {
                    try
                    {
                        p.Kill();
                    }
                    catch(Exception e)
                    {
                        return e.Message;
                    }
                }
            }  
            return "";
        }

上传及保存举例

本示例是获取上传的文件并保存,将保存后的文件获取二进制及文本数据存储到数据库中。

示例代码如下:

string filename = Request.PhysicalApplicationPath + "\\app_data\\" + Guid.NewGuid().ToString() + ".docx";  //预生成文件名
//File1为上传控件
File1.PostedFile.SaveAs(filename);  //保存文件
 
//添加SQL参数,此处仅为示例
ArrayList paras = new ArrayList();
paras.Add(new SqlParameter("filename", filename));
paras.Add(new SqlParameter("fcontent", getWordTxt(filename,false)));  //word转文本
paras.Add(new SqlParameter("bfile", GetBinaryData(filename)));  //word的二进制信息
paras.Add(new SqlParameter("sys_instime", System.DateTime.Now));
 
File.Delete(filename);
 
//保存到数据表
ExecDbScripts("INSERT INTO [f_words]([filename],[bfile],[fcontent],[sys_instime])  VALUES(@filename, @bfile,@fcontent,@sys_instime)", paras);
得到文件Byte[]数据方法
public byte[] GetBinaryData(string filename)
{
    if(!File.Exists(filename))
    {
        return null;
    }
    FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
    byte[] imageData = new Byte[fs.Length];
    fs.Read( imageData, 0,Convert.ToInt32(fs.Length));
    fs.Close();
    return imageData;
}        

查询并下载Word文件

我们可以通过 select filename from f_words where fcontent like '%key%' 等语句形式进行查询结果,对于结果中的数据我们可以通过传递CID唯一标识参数,定位二进制信息进行下载,示例代码如下:

 
  string strConn =ConfigurationSettings.AppSettings["Connection"];
  SqlConnection Conn = new SqlConnection(strConn );
  SqlCommand Cmd = new SqlCommand();
 
  Cmd.Connection = Conn;
 
  SqlDataReader myDr;
 
  Cmd.CommandText = " select filename from f_words where  cid=@cid ";
   
 
  SqlParameter   para2=new   SqlParameter("@cid",SqlDbType.UniqueIdentifier);
  para2.Value=(new Guid(_cid));
  Cmd.Parameters.Add(para2);
  try
  {
             Conn.Open();
             myDr = Cmd.ExecuteReader();
             bool _hasrows=myDr.HasRows;
             if (myDr.Read())
             {
 
                 string extendname = "docx";
 
                 byte[] bytes = (byte[])myDr["bfile"];
                 
                 
                 Response.Buffer = true;
                 Response.Charset = "utf-8";
                 Response.AppendHeader("Content-Disposition", "inline;filename=" + HttpUtility.UrlEncode(myDr["filename"].ToString() + "" + extendname)); //把 attachment 改为 online 则在线打开
                 Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");
                 Response.AppendHeader("Content-Length", bytes.Length.ToString());
                 Response.ContentType = "application/octet-stream"; 
                 
                     Page.EnableViewState = false;
                     Response.BinaryWrite(bytes);
                     Response.Flush();
             }
             myDr.Close();
         }
         catch (SqlException ex)
         {
         }
         finally
         {
             Conn.Close();
             Conn.Dispose();
         }
}

总结

上传保存到数据库的代码仅供参考,添加参数仅为抽象调用,需要自行实现数据操作代码。

下载大尺寸文件使用 Response.BinaryWrite() 方法可能会使浏览器无响应,可考虑使用 bytes.Length  判断如果尺寸较大的话,则生成文件到服务器并提供URL下载链接的方法。

以上就是使用C#实现将Word 转文本存储到数据库并进行管理的详细内容,更多关于C# Word 转文本的资料请关注脚本之家其它相关文章!

相关文章

  • C#各种正则表达式验证方法整理大全

    C#各种正则表达式验证方法整理大全

    许多编程语言和工具都包含对正则表达式的支持,C#也不例外,这篇文章主要给大家介绍了关于C#各种正则表达式验证方法整理大全的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • C#将List转换为只读的List方法与技巧

    C#将List转换为只读的List方法与技巧

    在 C# 编程的广阔世界里,数据的安全性与稳定性始终是我们关注的焦点,当涉及到集合数据的处理时,有时我们会面临这样一个关键需求:将List转换为只读的List,所以本文给大家介绍了使用C#将List转换为只读的List的方法与技巧,需要的朋友可以参考下
    2025-01-01
  • 基于C#设计一个双色球选号工具

    基于C#设计一个双色球选号工具

    这篇文章主要为大家详细介绍了如何利用C#设计实现一个双色球选号工具,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • C#拆分字符串正则表达式Regex.Split和String.Split方法

    C#拆分字符串正则表达式Regex.Split和String.Split方法

    这篇文章主要给大家介绍了关于C#拆分字符串正则表达式Regex.Split和String.Split方法的相关资料,在C#中,Regex.Split方法和string.Split方法都用于分割字符串,但它们有一些重要的区别,文中通过代码详细讲解下,需要的朋友可以参考下
    2024-04-04
  • C#中BackgroundWorker类用法总结

    C#中BackgroundWorker类用法总结

    本文详细讲解了C#中BackgroundWorker类用法总结,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • C# DataGridView绑定数据源的方法

    C# DataGridView绑定数据源的方法

    这篇文章主要为大家详细介绍了C# DataGridView绑定数据源的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • C#中Kestrel和IIS服务器下的同步与异步配置

    C#中Kestrel和IIS服务器下的同步与异步配置

    本篇文章主要讲解什么是Kestrel和IIS服务器和特点,以及他们如何配置同步与异步,具有一定的参加价值,感兴趣的可以了解一下
    2023-08-08
  • C#四舍五入MidpointRounding.AwayFromZero解析

    C#四舍五入MidpointRounding.AwayFromZero解析

    这篇文章主要介绍了C#四舍五入MidpointRounding.AwayFromZero,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • C# 正则表达式常用的符号和模式解析(最新推荐)

    C# 正则表达式常用的符号和模式解析(最新推荐)

    这篇文章主要介绍了C# 正则表达式常用的符号和模式解析,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • C#实现鼠标左右键切换效果

    C#实现鼠标左右键切换效果

    这篇文章主要为大家详细介绍了如何利用C#实现鼠标左右键切换功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12

最新评论