当前位置: 首页 > news >正文

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 文件的二进制信息存储到数据库里&#xff0c;即方便了统一管理文件&#xff0c;又可以实行权限控…...

VRRP协议

目录 VRRP协议基本概述 VRRP的基本结构 设备类型 VRRP工作原理 VRRP配置的实现 VRRP的实验 VRRP协议基本概述 1.VRRP能够在不改变组网的情况下&#xff0c;将多台路由器虚拟成一个虚拟路由器&#xff0c;通过配置虚拟路由器 的IP地址为默认网关&#xff0c;实现网关的备…...

Python学习之-基础语法

第1关&#xff1a;行与缩进 任务描述 本关任务&#xff1a;改正代码中不正确的缩进&#xff0c;使其能够正常编译&#xff0c;并输出正确的结果。 编程要求 根据提示&#xff0c;改正右侧编辑器中代码的缩进错误&#xff0c;使其能够正确运行&#xff0c;并输出结果。 测试说明…...

Java八股文(SpringCloud Alibaba)

Java八股文のSpringCloud Alibaba SpringCloud Alibaba SpringCloud Alibaba Spring Cloud Alibaba与Spring Cloud有什么区别&#xff1f; Spring Cloud Alibaba是Spring Cloud的衍生版本&#xff0c;它是由Alibaba开发和维护的&#xff0c;相比于Spring Cloud&#xff0c;它在…...

【物联网开源平台】tingsboard安装与编译

别看这篇了&#xff0c;这篇就当我的一个记录&#xff0c;我有空我再写过一篇&#xff0c;编译的时候出现了一个错误&#xff0c;然后我针对那一个错误执行了一个命令&#xff0c;出现了绿色的succes,我就以为整个tingsboard项目编译成功了&#xff0c;后面发现的时候&#xff…...

俚语加密漫谈

俚语加密是一种古老而有效的通信方式&#xff0c;将特定词语或短语在群体内赋予特殊含义&#xff0c;从而隐藏真实信息。类似于方言&#xff0c;它在历史上的应用不可忽视。随着计算机时代的到来&#xff0c;现代密码学通过数学运算编织密语&#xff0c;使得加密变得更加高深莫…...

【Java程序设计】【C00368】基于(JavaWeb)Springboot的箱包存储系统(有论文)

TOC 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;博客中有上百套程序可供参考&#xff0c;欢迎共同交流学习。 项目简介 项目获取 &#x1f345;文末点击卡片…...

Mysql中的执行计划怎么分析?

一、背景 在我们日常工作中&#xff0c;我们可能会遇到一些慢SQL语句或者要对一些SQL进行性能优化&#xff0c;那么就需要使用explain对SQL进行执行计划分析了。Mysql中的执行计划可以通过EXPLAIN或DESCRIBE关键字获取&#xff0c;当我们拿到执行计划后可以帮助我们分析这条sq…...

sever00启动AList

sever00启动AList cd ~/domains/alist && ~/.npm-global/bin/pm2 start ./alist -- server 其他 Serv00是一个提供免费的Virtual Host的平台&#xff0c;其托管平台使用的是FreeBSD系统&#xff0c;并不是Linux。每个账号有效期10年&#xff0c;超过三个月不登入Pan…...

【产品经理】进阶为一名优秀的数字孪生与仿真产品经理

数字孪生和仿真这个领域的内容太前沿了&#xff0c;很多经验、心得都没有对外流传。对于想成为这种产品经理的同学来说比较困难。 数字孪生&#xff1a;百度的解释是&#xff0c;数字孪生是充分利用物理模型、传感器更新、运行历史等数据&#xff0c;集成多学科、多物理量、多尺…...

CloudCompare 二次开发(29)——最小二乘拟合平面

目录 一、概述二、代码集成三、结果展示一、概述 使用CloudCompare实现的最小二乘拟合平面。具体计算原理见:PCL 最小二乘拟合平面。 二、代码集成 1、mainwindow.h文件public中添加: void doActionPCLLeastSquareFitPlane(); // 最小二乘拟合平面2、mainwindow.cpp文件…...

代码随想录算法训练营第三十五天|860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

860.柠檬水找零 本题看上好像挺难&#xff0c;其实挺简单的&#xff0c;大家先尝试自己做一做。 https://programmercarl.com/0860.%E6%9F%A0%E6%AA%AC%E6%B0%B4%E6%89%BE%E9%9B%B6.html 题目大意&#xff1a; 在柠檬水摊上&#xff0c;每一杯柠檬水的售价为 5 美元。 顾客排…...

28位驻华大使、公使参访苏州金龙 点赞刚刚全球发布的新V系大巴

3月26日下午&#xff0c;由外交部组织的“驻华使节团参访江苏”活动走进苏州金龙。来自28个国家和国际组织的驻华大使、公使参观了苏州金龙展厅&#xff0c;并试乘体验了苏州金龙全新V系大巴。外交部中国政府欧洲事务特别代表吴红波&#xff0c;外交部礼宾司、翻译司、非洲司、…...

jenkins权限分配

1.安装权限插件 Role-Based Strategy 2.创建用户 3.修改全局安全配置中的授权策略为Role-Based Strategy 4.进入Manage and Assign Roles创建Global roles和Item roles 4.进入Assign Roles给用户分配role...

感受精酿啤酒的啤酒屋那份与众不同的宁静与惬意

在繁华的都市中&#xff0c;隐藏着一片天地&#xff0c;那就是Fendi Club啤酒的啤酒屋。这里不仅提供上好的啤酒&#xff0c;还有与众不同的氛围和服务&#xff0c;让每一位顾客都能享受到宾至如归的感觉。 走进Fendi Club啤酒的啤酒屋&#xff0c;你会被其与众不同的装饰风格所…...

大数加法C++实现

题目&#xff1a;假设输入是2个数字&#xff0c;可能超过long long类型能表示的范围&#xff0c;请输出两数相加的运算结果。 思路&#xff1a;2个数输入的时候&#xff0c;肯定都是用string存的&#xff0c;先将短的数在末尾补0&#xff0c;使得二者一样长。然后挨个位相加&am…...

如何使用CHAT-AI?

伴随着CHAT-GPT的出现&#xff0c;人们都喜欢上了CHAT-AI。嗯&#xff1f;你还不会用&#xff1f;&#xff01; 教程来喽&#xff01; 首先点这里的 … 点击扩展 接着选择“管理扩展” 点击之后搜索“wetab” 最后你需要注册一个号&#xff0c;然后就可以使用CHAT-AI啦&#x…...

文献速递:基于SAM的医学图像分割--SAMUS:适应临床友好型和泛化的超声图像分割的Segment Anything模型

Title 题目 SAMUS: Adapting Segment Anything Model for Clinically-Friendly and Generalizable Ultrasound Image Segmentation SAMUS&#xff1a;适应临床友好型和泛化的超声图像分割的Segment Anything模型 01 文献速递介绍 医学图像分割是一项关键技术&#xff0c;用…...

23届嵌入式被裁,有什么好的就业建议?

最近看到了一个提问&#xff0c;原话如下&#xff1a; 本人23届毕业生&#xff0c;就业方向嵌入式软件&#xff0c;坐标深圳&#xff0c;工作3月公司裁员&#xff0c;目前接近12月开始找工作。 boss上投递简历&#xff0c;校招岗&#xff0c;比较有规模的好公司基本已读不回&am…...

你的 Python 代码需要解释一下了!

Python 是一种相对简单的编程语言。它主要以解释型语言著称&#xff0c;这意味着每行代码都要通过解释器逐行执行。不过在某些时候&#xff0c;将 Python 代码翻译成计算机可以理解的内容&#xff0c;然后再逐行执行&#xff0c;可以减少繁琐。 在这种情况下&#xff0c;编译器…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...