zoukankan      html  css  js  c++  java
  • 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
      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 using Word = Microsoft.Office.Interop.Word;
     11 
     12 namespace ListFileName
     13 {
     14     public partial class ListFileName : Form
     15     {
     16         protected BackgroundWorker worker = new BackgroundWorker();
     17         protected Word.Application app = null;
     18         protected Word.Document doc = null;
     19 
     20         protected DirectoryInfo dirFolder = null;
     21         protected int iFileCount = 0;
     22         protected string output = string.Empty;
     23 
     24         public ListFileName()
     25         {
     26             InitializeComponent();
     27             Application.EnableVisualStyles();
     28 
     29             worker.WorkerReportsProgress = true;
     30 
     31             worker.DoWork += new DoWorkEventHandler(worker_DoWork);
     32             worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
     33             worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
     34         }
     35 
     36         #region Private methods
     37         private void SelectPath()
     38         {
     39             if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
     40             {
     41                 this.tbPath.Text = folderBrowserDialog.SelectedPath;
     42             }
     43         }
     44 
     45         private string ReadTextFromWord(object fileName)
     46         {
     47             string sRst = string.Empty;
     48             object isReadOnly = true;
     49             object unknow = Type.Missing;
     50             app.Visible = false;
     51 
     52             if (app != null)
     53             {
     54 
     55                 try
     56                 {
     57                     // Open a word document with read only mode.
     58                     doc = app.Documents.Open(ref fileName,
     59                                              ref unknow, ref isReadOnly, ref unknow, ref unknow, ref unknow,
     60                                              ref unknow, ref unknow, ref unknow, ref unknow, ref unknow,
     61                                              ref unknow, ref unknow, ref unknow, ref unknow, ref unknow);
     62 
     63                     // Read the second paragraph text - Production's Engligh name.
     64                     sRst = (doc.Paragraphs.Count > 1 ? doc.Paragraphs[2].Range.Text.Trim() : ""+ "\t";
     65                     // Read the third paragraph text - Production's Chinese name.
     66                     sRst += (doc.Paragraphs.Count > 2 ? doc.Paragraphs[3].Range.Text.Trim() : ""+ "\t";
     67                 }
     68                 catch (Exception)
     69                 {
     70                 }
     71                 finally
     72                 {
     73                     // Close opened word document.
     74                     app.ActiveDocument.Close(ref unknow, ref unknow, ref unknow);
     75                 }
     76             }
     77 
     78             return sRst;
     79         }
     80 
     81         private int DoWorkAsync(int start, BackgroundWorker worker, DoWorkEventArgs e)
     82         {
     83             string folderPath = this.tbPath.Text.Trim();
     84             int percentComplete = 0;
     85 
     86             //Traversing file
     87             foreach (FileInfo file in dirFolder.GetFiles())
     88             {
     89                 start++;
     90                 percentComplete++;
     91                 // if the file type is word and not the word temp file.
     92                 if (file.Extension.IndexOf("doc"> 0 && file.Name.IndexOf("~$"< 0)
     93                 {
     94                     output += file.Name.Substring(0, file.Name.LastIndexOf('.')).Trim();
     95                     // If allow to read word file
     96                     if (this.chkReadWord.Checked)
     97                     {
     98                         output += "\t" + ReadTextFromWord(file.FullName); // Read from word.
     99                     }
    100                     output += "\r\n";
    101                 }
    102                 
    103                 // Update processbar value.
    104                 worker.ReportProgress(percentComplete % iFileCount);
    105             }
    106 
    107             if (output.Length > 2)
    108             {
    109                 output = output.Substring(0, output.Length - 2);
    110             }
    111 
    112             return start;
    113         }
    114         #endregion
    115 
    116         #region Events
    117 
    118         void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    119         {
    120             this.tbPath.Enabled = this.btSelect.Enabled = this.btGo.Enabled = true;
    121             progressBar.Value = iFileCount;
    122 
    123             if (e.Error != null)
    124             {
    125                 this.lblHint.Text = e.Error.Message;
    126             }
    127             else
    128             {
    129                 this.lblHint.Text = "Complete!";
    130                 MessageBox.Show("Complete!""Ok", MessageBoxButtons.OK, MessageBoxIcon.Information);
    131             }
    132         }
    133 
    134         // Update processbar value.
    135         void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    136         {
    137             progressBar.Value = e.ProgressPercentage;
    138             this.tbOutput.Text = output;
    139         }
    140 
    141         void worker_DoWork(object sender, DoWorkEventArgs e)
    142         {
    143             int start = (int)e.Argument;
    144             e.Result = DoWorkAsync(start, (BackgroundWorker)sender, e);
    145         }
    146 
    147         // Double click the path textbox to open the folder browser dialog.
    148         private void tbPath_DoubleClick(object sender, EventArgs e)
    149         {
    150             SelectPath();
    151         }
    152 
    153         // Open the folder browser dialog.
    154         private void btSelect_Click(object sender, EventArgs e)
    155         {
    156             SelectPath();
    157         }
    158 
    159         // Start to run.
    160         private void btGo_Click(object sender, EventArgs e)
    161         {
    162             this.btGo.Enabled = this.btSelect.Enabled = this.tbPath.Enabled = false;
    163 
    164             if (app == null && chkReadWord.Checked)
    165             {
    166                 app = new Microsoft.Office.Interop.Word.Application();
    167             }
    168             this.tbOutput.Text = output = "";
    169             string folderPath = this.tbPath.Text.Trim();
    170 
    171             if (folderPath.Length == 0 || !Directory.Exists(folderPath))
    172             {
    173                 MessageBox.Show("Please select a valid folder.""Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    174                 return;
    175             }
    176             dirFolder = new DirectoryInfo(folderPath);
    177             this.progressBar.Maximum = iFileCount = dirFolder.GetFiles().Count();
    178             this.progressBar.Value = 0;            
    179             this.lblHint.Text = "Please wait, processing...";
    180             this.lblHint.Visible = progressBar.Visible = true;
    181             worker.RunWorkerAsync(0);
    182 
    183             //this.tbOutput.Text = "";
    184             //DirectoryInfo dirFolder = new DirectoryInfo(folderPath);
    185 
    186             ////Traversing file
    187             //foreach (FileInfo file in dirFolder.GetFiles())
    188             //{
    189             //    // if the file type is word.
    190             //    if (file.Extension.IndexOf("doc") > 0 && file.Name.IndexOf("~$") < 0)
    191             //    {
    192             //        this.tbOutput.Text += file.Name.Substring(0, file.Name.LastIndexOf('.')).Trim() + "\t" + ReadTextFromWord(file.FullName);
    193             //    }
    194 
    195             //    this.tbOutput.Text += "\r\n";
    196             //}
    197         }
    198 
    199         // Select all in output textbox.
    200         private void tbOutput_KeyDown(object sender, KeyEventArgs e)
    201         {
    202             if (e.Control && e.KeyValue == 65)
    203             {
    204                 this.tbOutput.SelectAll();
    205             }
    206         }
    207 
    208         // Kill the word process when closed main form.
    209         private void ListFileName_FormClosed(object sender, FormClosedEventArgs e)
    210         {
    211             if (app != null)
    212             {
    213                 object unknow = Type.Missing;
    214                 object saveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;
    215                 app.Quit(ref saveChanges, ref unknow, ref unknow);
    216             }
    217         }
    218         #endregion
    219     }
    220 }

    完整代码下载

  • 相关阅读:
    开源微信管家平台——JeeWx 捷微4.0 微服务版本发布,全新架构,全新UI,提供强大的图文编辑器
    JeeWx全新版本发布!捷微二代微信活动平台1.0发布!活动插件持续开源更新!
    JEECG 3.7.8 新版表单校验提示风格使用&升级方法(validform 新风格漂亮,布局简单)
    Java快速开发平台——JEECG 3.7.8 版本发布!我们的目标是有鱼丸也有粗面
    企业如何快速搭建小程序官网
    如何玩转小程序+公众号?手把手教你JeeWx小程序CMS与公众号关联
    deepClone deepCompare
    fiddler
    spy-debugger
    队列
  • 原文地址:https://www.cnblogs.com/jaxu/p/1947826.html
Copyright © 2011-2022 走看看