C# 将 Word 转文本存储到数据库并进行管理
目录
功能需求
范例运行环境
设计数据表
关键代码
组件库引入
Word文件内容转文本
上传及保存举例
得到文件Byte[]数据方法
查询并下载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]
GOALTER 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下载链接的方法。
这些代码我们提供了一些操作WORD及数据表的相关的关键方法,这里仅作参考,欢迎大家评论指教!
相关文章:
C# 将 Word 转文本存储到数据库并进行管理
目录 功能需求 范例运行环境 设计数据表 关键代码 组件库引入 Word文件内容转文本 上传及保存举例 得到文件Byte[]数据方法 查询并下载Word文件 总结 功能需求 将 WORD 文件的二进制信息存储到数据库里,即方便了统一管理文件,又可以实行权限控…...
VRRP协议
目录 VRRP协议基本概述 VRRP的基本结构 设备类型 VRRP工作原理 VRRP配置的实现 VRRP的实验 VRRP协议基本概述 1.VRRP能够在不改变组网的情况下,将多台路由器虚拟成一个虚拟路由器,通过配置虚拟路由器 的IP地址为默认网关,实现网关的备…...
Python学习之-基础语法
第1关:行与缩进 任务描述 本关任务:改正代码中不正确的缩进,使其能够正常编译,并输出正确的结果。 编程要求 根据提示,改正右侧编辑器中代码的缩进错误,使其能够正确运行,并输出结果。 测试说明…...
Java八股文(SpringCloud Alibaba)
Java八股文のSpringCloud Alibaba SpringCloud Alibaba SpringCloud Alibaba Spring Cloud Alibaba与Spring Cloud有什么区别? Spring Cloud Alibaba是Spring Cloud的衍生版本,它是由Alibaba开发和维护的,相比于Spring Cloud,它在…...
【物联网开源平台】tingsboard安装与编译
别看这篇了,这篇就当我的一个记录,我有空我再写过一篇,编译的时候出现了一个错误,然后我针对那一个错误执行了一个命令,出现了绿色的succes,我就以为整个tingsboard项目编译成功了,后面发现的时候ÿ…...
俚语加密漫谈
俚语加密是一种古老而有效的通信方式,将特定词语或短语在群体内赋予特殊含义,从而隐藏真实信息。类似于方言,它在历史上的应用不可忽视。随着计算机时代的到来,现代密码学通过数学运算编织密语,使得加密变得更加高深莫…...
【Java程序设计】【C00368】基于(JavaWeb)Springboot的箱包存储系统(有论文)
TOC 博主介绍:java高级开发,从事互联网行业六年,已经做了六年的毕业设计程序开发,开发过上千套毕业设计程序,博客中有上百套程序可供参考,欢迎共同交流学习。 项目简介 项目获取 🍅文末点击卡片…...
Mysql中的执行计划怎么分析?
一、背景 在我们日常工作中,我们可能会遇到一些慢SQL语句或者要对一些SQL进行性能优化,那么就需要使用explain对SQL进行执行计划分析了。Mysql中的执行计划可以通过EXPLAIN或DESCRIBE关键字获取,当我们拿到执行计划后可以帮助我们分析这条sq…...
sever00启动AList
sever00启动AList cd ~/domains/alist && ~/.npm-global/bin/pm2 start ./alist -- server 其他 Serv00是一个提供免费的Virtual Host的平台,其托管平台使用的是FreeBSD系统,并不是Linux。每个账号有效期10年,超过三个月不登入Pan…...
【产品经理】进阶为一名优秀的数字孪生与仿真产品经理
数字孪生和仿真这个领域的内容太前沿了,很多经验、心得都没有对外流传。对于想成为这种产品经理的同学来说比较困难。 数字孪生:百度的解释是,数字孪生是充分利用物理模型、传感器更新、运行历史等数据,集成多学科、多物理量、多尺…...
CloudCompare 二次开发(29)——最小二乘拟合平面
目录 一、概述二、代码集成三、结果展示一、概述 使用CloudCompare实现的最小二乘拟合平面。具体计算原理见:PCL 最小二乘拟合平面。 二、代码集成 1、mainwindow.h文件public中添加: void doActionPCLLeastSquareFitPlane(); // 最小二乘拟合平面2、mainwindow.cpp文件…...
代码随想录算法训练营第三十五天|860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球
860.柠檬水找零 本题看上好像挺难,其实挺简单的,大家先尝试自己做一做。 https://programmercarl.com/0860.%E6%9F%A0%E6%AA%AC%E6%B0%B4%E6%89%BE%E9%9B%B6.html 题目大意: 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。 顾客排…...
28位驻华大使、公使参访苏州金龙 点赞刚刚全球发布的新V系大巴
3月26日下午,由外交部组织的“驻华使节团参访江苏”活动走进苏州金龙。来自28个国家和国际组织的驻华大使、公使参观了苏州金龙展厅,并试乘体验了苏州金龙全新V系大巴。外交部中国政府欧洲事务特别代表吴红波,外交部礼宾司、翻译司、非洲司、…...
jenkins权限分配
1.安装权限插件 Role-Based Strategy 2.创建用户 3.修改全局安全配置中的授权策略为Role-Based Strategy 4.进入Manage and Assign Roles创建Global roles和Item roles 4.进入Assign Roles给用户分配role...
感受精酿啤酒的啤酒屋那份与众不同的宁静与惬意
在繁华的都市中,隐藏着一片天地,那就是Fendi Club啤酒的啤酒屋。这里不仅提供上好的啤酒,还有与众不同的氛围和服务,让每一位顾客都能享受到宾至如归的感觉。 走进Fendi Club啤酒的啤酒屋,你会被其与众不同的装饰风格所…...
大数加法C++实现
题目:假设输入是2个数字,可能超过long long类型能表示的范围,请输出两数相加的运算结果。 思路:2个数输入的时候,肯定都是用string存的,先将短的数在末尾补0,使得二者一样长。然后挨个位相加&am…...
如何使用CHAT-AI?
伴随着CHAT-GPT的出现,人们都喜欢上了CHAT-AI。嗯?你还不会用?! 教程来喽! 首先点这里的 … 点击扩展 接着选择“管理扩展” 点击之后搜索“wetab” 最后你需要注册一个号,然后就可以使用CHAT-AI啦&#x…...
文献速递:基于SAM的医学图像分割--SAMUS:适应临床友好型和泛化的超声图像分割的Segment Anything模型
Title 题目 SAMUS: Adapting Segment Anything Model for Clinically-Friendly and Generalizable Ultrasound Image Segmentation SAMUS:适应临床友好型和泛化的超声图像分割的Segment Anything模型 01 文献速递介绍 医学图像分割是一项关键技术,用…...
23届嵌入式被裁,有什么好的就业建议?
最近看到了一个提问,原话如下: 本人23届毕业生,就业方向嵌入式软件,坐标深圳,工作3月公司裁员,目前接近12月开始找工作。 boss上投递简历,校招岗,比较有规模的好公司基本已读不回&am…...
你的 Python 代码需要解释一下了!
Python 是一种相对简单的编程语言。它主要以解释型语言著称,这意味着每行代码都要通过解释器逐行执行。不过在某些时候,将 Python 代码翻译成计算机可以理解的内容,然后再逐行执行,可以减少繁琐。 在这种情况下,编译器…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
