C# 读取Word表格到DataSet

这篇具有很好参考价值的文章主要介绍了C# 读取Word表格到DataSet。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

功能需求

Office 数据源的一些映射关系

范例运行环境

配置Office DCOM

关键代码

组件库引入

​核心代码

杀掉进程

总结


功能需求

在应用项目里,多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求,但某些情况下,也存在使用 Word 进行表格数据编辑的情况。Word 和 Excel 其实各有特点,用户的习惯不同,即使同一数据源,可能提供的数据源文件类型也不同,这其中也包括导入Word内容的功能,比如表格数据导出到DataSet数据集。

Office 数据源的一些映射关系

下图是一个简单的 Office 数据源的映射关系:

1、第一层级比如 WORD / EXCEL 为应用层级(Application)、 DATASET / DATABASE 为数据容器

2、第二层级,比如WORD 包含一个文档对象(Docment)、Excel 包含一个工作簿对象(WorkBook)、DataSet / DataBase 包括一组数据表对象(Tables)

3、第三层级,比如Word里的表格对象(Table)、Excel里的工作表对象(Sheet)

最实际的工作任务,是要将Table或Sheet对象的二维数据对应导出生成到 DataSet 里的 Table 对象,如果有多个则生成对应的集合。最后我们可能会再次导出到 DataBase 的数据表集合里(Tables)。

C# 读取Word表格到DataSet,微软Office计算中心,c#,word,开发语言,.net,windows,visual studio

范例运行环境

操作系统: Windows Server 2019 DataCenter

操作系统上安装 Office Word 2016

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

开发工具:VS2019  C#

配置Office DCOM

对于安装原生Office应用,我们需要对DCOM进行进一步的配置方可使用其API。

打开控制面板、管理工具、组件服务:

C# 读取Word表格到DataSet,微软Office计算中心,c#,word,开发语言,.net,windows,visual studio

点击组件服务、计算机、我的电脑、DCOM配置 

C# 读取Word表格到DataSet,微软Office计算中心,c#,word,开发语言,.net,windows,visual studio

 找到 Microsoft Word97-2003 文档应用程序

C# 读取Word表格到DataSet,微软Office计算中心,c#,word,开发语言,.net,windows,visual studio

 选择属性、打开标识选项卡、选择下列用户选项,设置启动Word应用的用户,点确定即可。

C# 读取Word表格到DataSet,微软Office计算中心,c#,word,开发语言,.net,windows,visual studio

 理论上设置到这里就可以了,但以防万一,可以继续设置启动权限,选择安全选项卡、启动和激活权限,如下图:

C# 读取Word表格到DataSet,微软Office计算中心,c#,word,开发语言,.net,windows,visual studio

关键代码

组件库引入

C# 读取Word表格到DataSet,微软Office计算中心,c#,word,开发语言,.net,windows,visual studio

核心代码

public DataSet WordAsDataSet(string _filename) 方法,传入要读取的 WORD 文件路径即可,方法会遍历该WORD里的TABLES对象集合,如果找到TABLE对象,则按列的顺序创建字段列,比如F1、F2...Fn,以些类推,从第二行起为记录行,则根据创建的结构写入到 DataTable中。

        public DataSet WordAsDataSet(string _filename)
        {
            DataSet ds = new DataSet();

            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;
//遍历所有的Word里的表格,并写到数据集的TABLES集合里
            foreach (Word.Table wTable in WordDoc.Tables)
            {
                System.Data.DataTable dt = new System.Data.DataTable();
                for (int colPos = 1; colPos <= wTable.Columns.Count; colPos++)
                {
                    DataColumn dc = new DataColumn();
                    dc.ColumnName = "F" + colPos.ToString();
                    dt.Columns.Add(dc);
                }

                for (int rowPos = 1; rowPos <= wTable.Rows.Count; rowPos++)
                {
                    DataRow drNew = dt.NewRow();
                    int columnIndex = 0;
                    foreach (Word.Cell cellObj in wTable.Rows[rowPos].Cells)
                    {
                        drNew[columnIndex] = cellObj.Range.Text.Remove(cellObj.Range.Text.Length - 2, 2);//remove \r\a
                        columnIndex++;
                    }
                    dt.Rows.Add(drNew);
                }
                ds.Tables.Add(dt);
            }


            WordDoc.Close(ref Nothing, ref Nothing, ref Nothing);
            //关闭WordApp组件对象
            WordApp.Quit(ref Nothing, ref Nothing, ref Nothing);

            KillProcessByStartTime("WINWORD", beforetime, aftertime);

            return ds;
        }

杀掉进程

这是一个无奈之举,尝试了一些方法,但某些情况下仍然无法释放掉 Word 应用进程,因此根据时间点范围写了一个强制杀掉进程的方法。

示例代码如下:

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 "";
		}

总结

在实际的应用中,无论是导入的文件格式还是导出的数据源,都是要结合客户的需求进行的。

在功能实现前,需要约定模板文件的格式,字段内容的意义、长度等。导入到 DataSet 成功后,再根据业务逻辑进行后续操作再加工,或直接导入到规范的数据表里(如 MS SQL SERVER)。

这些代码我们提供了一些操作WORD相关的关键方法,这里仅作参考,欢迎大家评论指教!文章来源地址https://www.toymoban.com/news/detail-761433.html

到了这里,关于C# 读取Word表格到DataSet的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python自动化办公——读取PPT写入word表格

    📖由于我们知识图谱课程需要将课堂小组汇报的PPT总结成word文档,而我觉得一页一页复制PPT中的内容比较麻烦,所以直接安排:读PPT写word 🚗需要操作PPT幻灯片和word文档,所以需要导入docx 和pptx两个包 这里我的docx使用的是0.2.4版本 pptx使用的是0.6.21版本供参考 引入os、ppt

    2024年02月11日
    浏览(32)
  • 100天精通Python丨办公效率篇 —— 12、Python自动化操作 office-word(word转pdf、转docx、段落、表格、标题、页面、格式)

    本文收录于 《100天精通Python专栏 - 快速入门到黑科技》专栏 ,是由 CSDN 内容合伙人丨全站排名 Top 4 的硬核博主 不吃西红柿 倾力打造。 基础知识篇以理论知识为主 ,旨在帮助没有语言基础的小伙伴,学习我整理成体系的精华知识,快速入门构建起知识框架; 黑科技应用篇

    2023年04月18日
    浏览(40)
  • python自动化办公——定制化读取Excel数据并写入到word表格

    最近到了毕业设计答辩的时候,老师让我帮毕业生写一段毕业设计的功能就是提供一个 学士学位授予申请表 ,根据定制化需求,编写定制化代码。 docx格式的word如下图。 再提供一个Excel表格,要求可以直接读取表格里的对应内容,填入到word表格里的对应位置。表格是我自己

    2024年02月10日
    浏览(46)
  • C#合并多个Word文档(微软官方免费openxml接口)

    g 详情了解... 

    2024年02月04日
    浏览(35)
  • C#:对word中表格进行复制、粘贴并且替换内容

    在我上一篇对于word开发讲述的文章中对word开发进行了一些介绍,今天接着上一篇文章再介绍一下如何复制word中的表格,然后进行粘贴的操作,最后再介绍一下如何替换表格中的文本。 首先如果想要复制word中的表格自然然需要先实例化doc,这个就不写了。不会的伙伴可以去

    2024年02月09日
    浏览(29)
  • c# 操作word中的表格 批量复制和批量插入

    用的是windows自带的dll包,没有引用第三方 批量插入表格后,原理就是整个文档会从前到后编制表格索引,从一开始意思是前面序号为1.2.3表格,1复制3个在后面,那么原先的2表格序号就标为2+3=5!为表格设置各种值也是按这个序号来!

    2024年02月08日
    浏览(46)
  • C#调用office interop接口打开word、excel、ppt,拦截处理关闭、保存事件

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using WordLib = Microsoft.Office.Interop.Word; using ExcelLib = Microsoft.Office.Interop.Excel; using PptLib = Microsoft.Office.Interop.PowerPoint

    2024年02月07日
    浏览(68)
  • 修改注册表来解决Microsoft Office中word和excel表格打开新文件时前面最小化的文件重新弹出显示的问题

    word: 1. 关闭所有Word窗口。 2. 打开注册表编辑器(运行输入regedit并按回车) 3. 打开以下注册表路径: HKEY_CLASSES_ROOTWord.Document.12ShellOpencommand 4. 右击右侧栏\\\"默认\\\",点修改,在数据数值框中,在/n前加上/q命令(/q和/n中间有个空格) 5. 点击确定。 注:(1)针对docx文件 HKEY_C

    2024年02月04日
    浏览(87)
  • c#关于文件夹/文件/文本读取遍历,写入还有表格的读取的一些方法

    c#遍历文件夹下的各种文件 将一些log写入到文本文件中: fs.Seek(offset, whence);移动文件读取的指针到指定位置 offset:开始的偏移量,也就是代表需要移动偏移的字节数 whence:给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始

    2024年02月01日
    浏览(40)
  • C# WinForm 使用Microsoft.Office.Interop.Excel对Excel文件表格的单元格值进行修改操作

    在引用位置点击右键 点击管理NUGet程序包 搜索Excel,在搜索结果中点击Microsoft.Office.Interop.Excel 然后点击安装即可,搜不到的话,在右侧程序包源位置改成全部再次搜索 。 对准项目,点击右键,在弹出菜单选择添加,选择类 类名称随意,然后清空新建类得到全部内容,把下面

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包