C#遍历文件读取Word内容以及使用BackgroundWorker对象打造平滑进度条

简介:
本文将给出一个实例用于介绍如何利用C#遍历目录中的文件并打印Word文件中的内容,同时在界面上利用一个相对平滑的进度条来显示文件处理的情况。下面是程序运行时的截图:

Capture

  下面来看看程序的具体实现步骤。

  首先是读取指定的目录并遍历其中的文件。这个功能很简单,我们只需要通过一个foreach循环遍历DirectoryInfo对象中的所有文件即可。在本例中,我们定义了一个文件夹选择控件,当用户点击Select按钮时弹出对话框用户指定程序要遍历的目录,将目录字符串存储在文本框中。点击Go按钮时开始遍历文件夹中的所有文件。程序将按行输出目录中Word文件名,不包含扩展名。

复制代码
1  using  System; 
2  using  System.Collections.Generic; 
3  using  System.ComponentModel; 
4  using  System.Data; 
5  using  System.Drawing; 
6  using  System.Linq; 
7  using  System.Text; 
8  using  System.Windows.Forms; 
9  using  System.IO; 
10   
11  namespace  ListFileName 
12 
13       public   partial   class  ListFileName : Form 
14      { 
15           protected  DirectoryInfo dirFolder  =   null
16   
17           public  ListFileName() 
18          { 
19              InitializeComponent(); 
20          } 
21   
22           private   void  SelectPath() 
23          { 
24               if  (folderBrowserDialog.ShowDialog()  ==  DialogResult.OK) 
25              { 
26                   this .tbPath.Text  =  folderBrowserDialog.SelectedPath; 
27              } 
28          } 
29   
30           //  Double click the path textbox to open the folder browser dialog.  
31           private   void  tbPath_DoubleClick( object  sender, EventArgs e) 
32          { 
33              SelectPath(); 
34          } 
35   
36           //  Open the folder browser dialog.  
37           private   void  btSelect_Click( object  sender, EventArgs e) 
38          { 
39              SelectPath(); 
40          } 
41   
42           //  Start to run.  
43           private   void  btGo_Click( object  sender, EventArgs e) 
44          { 
45               this .btGo.Enabled  =   this .btSelect.Enabled  =   this .tbPath.Enabled  =   false
46               this .tbOutput.Text  =   ""
47               string  folderPath  =   this .tbPath.Text.Trim(); 
48   
49               if  (folderPath.Length  ==   0   ||   ! Directory.Exists(folderPath)) 
50              { 
51                  MessageBox.Show( " Please select a valid folder. " " Error " , MessageBoxButtons.OK, MessageBoxIcon.Error); 
52                   return
53              } 
54              dirFolder  =   new  DirectoryInfo(folderPath); 
55   
56               // Traversing file  
57               foreach  (FileInfo file  in  dirFolder.GetFiles()) 
58              { 
59                   //  if the file type is word and not the word temp file.  
60                   if  (file.Extension.IndexOf( " doc " >   0   &&  file.Name.IndexOf( " ~$ " <   0
61                  { 
62                       this .tbOutput.Text  +=  file.Name.Substring( 0 , file.Name.LastIndexOf( ' . ' )).Trim()  +=   " \r\n "
63                  } 
64              } 
65   
66               if  ( this .tbOutput.Text.Length  >   2
67              { 
68                   this .tbOutput.Text  =   this .tbOutput.Text.Substring( 0 this .tbOutput.Text.Length  -   2 ); 
69              } 
70   
71               this .btGo.Enabled  =   this .btSelect.Enabled  =   this .tbPath.Enabled  =   false
72          }         
73      } 
74  }
复制代码

  然后是增加读取Word文件的功能。这个需要使用COM组件,在工程中添加对Word COM组件的引用。

2
  
程序只选择读取Word文件的前三行,下面是具体的代码。
复制代码
 1  using  Word  =  Microsoft.Office.Interop.Word;
 2 
 3  protected  Word.Application app  =   null ;
 4  protected  Word.Document doc  =   null ;
 5 
 6  private   string  ReadTextFromWord( object  fileName)
 7  {
 8       string  sRst  =   string .Empty;
 9       object  isReadOnly  =   true ;
10       object  unknow  =  Type.Missing;
11      app.Visible  =   false ;
12 
13       if  (app  !=   null )
14      {
15 
16           try
17          {
18               //  Open a word document with read only mode.
19              doc  =  app.Documents.Open( ref  fileName,
20                                        ref  unknow,  ref  isReadOnly,  ref  unknow,  ref  unknow,  ref  unknow,
21                                        ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,
22                                        ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow,  ref  unknow);
23 
24               //  Read the second paragraph text - Production's Engligh name.
25              sRst  =  (doc.Paragraphs.Count  >   1   ?  doc.Paragraphs[ 2 ].Range.Text.Trim() :  "" +   " \t " ;
26               //  Read the third paragraph text - Production's Chinese name.
27              sRst  +=  (doc.Paragraphs.Count  >   2   ?  doc.Paragraphs[ 3 ].Range.Text.Trim() :  "" +   " \t " ;
28          }
29           catch  (Exception)
30          {
31          }
32           finally
33          {
34               //  Close opened word document.
35              app.ActiveDocument.Close( ref  unknow,  ref  unknow,  ref  unknow);
36          }
37      }
38 
39       return  sRst;
40  }
复制代码

  注意打开Word文档时可以以只读方式打开,这样打开的速度会稍微快一点,并且关闭的时候不会出现是否保存文件的对话框。任何情况下只要打开了Word文档,一定记住使用完后要将其关闭,并且在退出程序时也要将Word进程一并关掉。

复制代码
 1  //  Kill the word process when closed main form.
 2  private   void  ListFileName_FormClosed( object  sender, FormClosedEventArgs e)
 3  {
 4       if  (app  !=   null )
 5      {
 6           object  unknow  =  Type.Missing;
 7           object  saveChanges  =  Word.WdSaveOptions.wdDoNotSaveChanges;
 8          app.Quit( ref  saveChanges,  ref  unknow,  ref  unknow);
 9      }
10  }
复制代码

  最后再来看看如何实现平滑进度条。这个需要使用到BackgroundWorker对象,该对象允许程序在多线程下执行,我们可以将界面UI和后台线程分开,这样当程序在执行一个时间较长的任务时不会导致主界面处于等待状态,用户仍然可以操作主界面上的元素,使程序看起来比较平滑。BackgroundWorker对象定义了一些属性和委托用来处理多线程间的信息同步,诸如后台线程在执行过程中如何通知主界面的线程更新进度条值等。

复制代码
1  Application.EnableVisualStyles();
2 
3  worker.WorkerReportsProgress  =   true ;
4 
5  worker.DoWork  +=   new  DoWorkEventHandler(worker_DoWork);
6  worker.ProgressChanged  +=   new  ProgressChangedEventHandler(worker_ProgressChanged);
7  worker.RunWorkerCompleted  +=   new  RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
复制代码

  在work_DoWork中调用具体执行的方法,worker_ProgressChanged方法用来实时更新进度条值,worker_RunWorkerCompleted方法用来处理当后台线程执行完操作后要处理的事情,如更新界面UI,将进度条的当前值更改为100%等。可以看看下面完整的程序代码:

ListFileName

完整代码下载


本文转自Jaxu博客园博客,原文链接:http://www.cnblogs.com/jaxu/archive/2011/01/30/1947826.html,如需转载请自行联系原作者


相关文章
|
1月前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
115 65
|
10天前
|
XML C# 开发工具
C# 删除Word文档中的段落
【11月更文挑战第3天】本文介绍了两种方法来操作 Word 文档:一是使用 `Microsoft.Office.Interop.Word` 库,适用于 Windows 环境下操作 Word 文档,需引用相应库并在代码中引入命名空间;二是使用 Open XML SDK,适用于处理 .docx 格式的文档,通过引用 `DocumentFormat.OpenXml` 库实现。文中提供了示例代码,展示了如何打开、删除段落并保存文档。
|
5月前
|
C# C++
C# 自定义时间进度条
本文作者通过参考leslie_xin的一篇文章,成功创建了一个自定义的WinForms控件——时间进度条,该控件带有时间刻度和多种可定制的属性,如颜色、时间间隔等。作者在控件中加入了开始和结束时间,以及自适应的时间刻度间隔。控件能根据设置显示时间标签,并提供了事件处理,如值改变时的触发。代码中包含了计算时间刻度、绘制刻度线和时间标签的逻辑。作者强调了避免循环调用事件、使用OnXXX()形式的事件处理函数以及注意自定义控件中的属性和事件设计。
126 7
|
2月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
25 2
|
3月前
|
数据库
C#Winform使用NPOI获取word中的数据
C#Winform使用NPOI获取word中的数据
177 2
|
6月前
|
C#
C#的类和对象的概念学习案例刨析
【5月更文挑战第17天】C#是一种面向对象的语言,以类和对象为核心。类作为对象的模板,定义了属性(如Name, Age)和行为(如Greet)。对象是类的实例,可设置属性值。封装通过访问修饰符隐藏实现细节,如Customer类的私有name字段通过Name属性访问。继承允许新类(如Employee)从现有类(Person)继承并扩展。多态让不同对象(如Circle, Square)共享相同接口(Shape),实现抽象方法Area,提供灵活的代码设计。
65 1
|
6月前
|
存储 SQL 数据库
C# 将 Word 转文本存储到数据库并进行管理
C# 将 Word 转文本存储到数据库并进行管理
127 2
|
6月前
|
C#
C#对象初始化器
C#对象初始化器
|
7天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
19 3