C#实现读取Word表格到DataSet

 更新时间:2023年12月26日 08:56:04   作者:初九之潜龙勿用  
在应用项目里,多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求,但某些情况下,也存在使用 Word 进行表格数据编辑的情况,这其中也包括导入Word内容的功能,比如表格数据导出到DataSet数据集,本文将给大家介绍了C#读取Word表格到DataSet

功能需求

在应用项目里,多数情况下我们会遇到导入 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)。

范例运行环境

操作系统: Windows Server 2019 DataCenter

操作系统上安装 Office Word 2016

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

开发工具:VS2019  C#

配置Office DCOM

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

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

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

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

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

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

关键代码

组件库引入

核心代码

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相关的关键方法,这里仅作参考,欢迎大家评论指教!

以上就是C#实现读取Word表格到DataSet的详细内容,更多关于C#读取Word到DataSet的资料请关注脚本之家其它相关文章!

相关文章

  • C# 字符串处理小工具

    C# 字符串处理小工具

    本文主要介绍C#字符串处理小工具,实现功能包括:转换为大写;转换为小写;反转字符串;匹配某字符串出现次数;正则匹配;base64加密;base64解密;ROT13加密解密;MD5 32位加密。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • 浅谈C#六大设计原则

    浅谈C#六大设计原则

    这篇文章主要介绍了C#六大设计原则的相关内容,文中代码非常细致,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C# 6.0的属性(Property)的语法与初始值详解

    C# 6.0的属性(Property)的语法与初始值详解

    下面小编就为大家带来一篇C# 6.0的属性(Property)的语法与初始值详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • c# SendMail发送邮件实例代码

    c# SendMail发送邮件实例代码

    这篇文章介绍了c# SendMail发送邮件实例代码,有需要的朋友可以参考一下
    2013-09-09
  • C#带你玩扫雷(附源码)

    C#带你玩扫雷(附源码)

    这篇文章主要介绍了C#带你玩扫雷(附源码),详细的介绍实现扫雷的方法,具体一定的参考价值,有兴趣的可以了解一下
    2017-10-10
  • C#控制Excel Sheet使其自适应页宽与列宽的方法

    C#控制Excel Sheet使其自适应页宽与列宽的方法

    这篇文章主要介绍了C#控制Excel Sheet使其自适应页宽与列宽的方法,涉及C#操作Excel的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C#如何绑定多个按钮到同一个事件

    C#如何绑定多个按钮到同一个事件

    这篇文章主要介绍了C#如何绑定多个按钮到同一个事件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • C#查看/写入日志到Windows事件查看器的操作方法

    C#查看/写入日志到Windows事件查看器的操作方法

    Windows 操作系统将与计算机的系统性能、应用程序和安全方面相关的每个事件记录在 C:\WINDOWS\system32\winevt 的日志中,事件查看器从这些原始事件日志中读取信息,然后以可读格式呈现信息,本文介绍了C#如何查看/写入日志到Windows事件查看器,需要的朋友可以参考下
    2024-09-09
  • C#中两个byte如何相加

    C#中两个byte如何相加

    可能有的看到这个题目就会觉得这不简单吗?直接用+号相加就行了,可是当你实际操作运行的时候就会发现有错误了,那么是什么错误?那该如何让C#中两个byte相加呢?通过下面这篇文章来一起学习学习吧。
    2016-11-11
  • C#实现身份证实名认证接口的示例代码

    C#实现身份证实名认证接口的示例代码

    身份证实名认证,即通过姓名和身份证号校验个人信息的匹配程度,广泛应用于金融、互联网等多个领域,本文主要介绍了C#实现身份证实名认证接口的示例代码,感兴趣的可以了解一下
    2024-09-09

最新评论