程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 使用C#讀取Word表格數據

使用C#讀取Word表格數據

編輯:關於C#

最近在做一個項目,使用到了讀取Word表格中內容的技術。在網上找了許多資料都不盡人意,最後整理了並修改了一些網上的代碼,取其精華去其糟粕,現將代碼同各位園子裡的朋友們分享。

讀取Word表格數據的方法

1//將讀取Word表格封裝與方法中。
2public string ReadWord(string fileName, int rowIndex, int colIndex)
3{
4  ApplicationClass cls = null;
5  Document doc = null;
6
7  Table table = null;
8  object missing = Missing.Value;
9
10  object path = fileName;
11  cls = new ApplicationClass();
12
13  try
14  {
15    doc = cls.Documents.Open
16      (ref path, ref missing, ref missing, ref missing,
17      ref missing, ref missing, ref missing, ref missing,
18      ref missing, ref missing, ref missing, ref missing,
19      ref missing, ref missing, ref missing, ref missing);
20    table = doc.Tables[1];
21    string text = table.Cell(rowIndex, colIndex).Range.Text.ToString();
22    text = text.Substring(0, text.Length - 2);  //去除尾部的mark
23    return text;
24  }
25  catch (Exception ex)
26  {
27
28    return ex.Message;
29  }
30  finally
31  {
32    if (doc != null)
33      doc.Close(ref missing, ref missing, ref missing);
34    cls.Quit(ref missing, ref missing, ref missing);
35  }
36}

這個方法用於讀取Word表格中某個單元格的數據。其中的參數分別為文件名(包括路徑),行號,列號。

由於考慮到代碼復用,我將代碼寫成了一個類。此外,通過審視代碼可以發現,如果要多次讀取同一文件中的不同的單元格數據會造成頻繁的打開、關閉Word程序;因此,我將代碼進行優化。在我做優化的時候突然想起來ADO.NET的SqlConnection和SqlCommand類。這兩個類我常常用做數據庫操作,一般用到的方法順序都是:打開數據庫連接,執行數據庫查詢,關閉數據庫連接。我沒有使用到兩個類,我將這段代碼封裝於一個類中。使用Open、Close控制Word文檔的打開和關閉,使用WordTableRead方法讀取表格中的數據。這樣對於讀取多個單元格中的數據,每次只需要打開、關閉一次Word程序即可,大大的節約了資源的開銷和節省了時間,提高的讀取效率。此外,對於代碼的優化還有可以讀取指定表格中數據。下圖顯示了這個類的結構,代碼及相應注釋附在圖的下方:

class WordTableRead
2{
3  private string fileName;
4  private ApplicationClass cls = null;
5  private Document doc = null;
6  private Table table = null;
7  private object missing = Missing.Value;
8  //Word是否處於打開狀態
9  private bool openState;
10
11
12  /**//// <summary>
13  /// 自定義構造方法
14  /// </summary>
15  /// <param name="fileName">包含路徑的文件名</param>
16  public WordTableRead(string fileName)
17  {
18    this.fileName = fileName;
19  }
20  
21  /**//// <summary>
22  /// 打開Word文檔
23  /// </summary>
24  public void Open()
25  {
26    object path = fileName;
27    cls = new ApplicationClass();
28    try
29    {
30      doc = cls.Documents.Open
31        (ref path, ref missing, ref missing, ref missing,
32        ref missing, ref missing, ref missing, ref missing,
33        ref missing, ref missing, ref missing, ref missing,
34        ref missing, ref missing, ref missing, ref missing);
35      openState = true;
36    }
37    catch
38    {
39      openState = false;
40    }
41  }
42
43  /**//// <summary>
44  /// 返回指定單元格中的數據
45  /// </summary>
46  /// <param name="tableIndex">表格號</param>
47  /// <param name="rowIndex">行號</param>
48  /// <param name="colIndex">列號</param>
49  /// <returns>單元格中的數據</returns>
50  public string ReadWord(int tableIndex, int rowIndex, int colIndex)
51  {
52    //Give the value to the tow Int32 params.
53
54    try
55    {
56      if (openState == true)
57      {
58        table = doc.Tables[tableIndex];
59        string text = table.Cell(rowIndex, colIndex).Range.Text.ToString();
60        text = text.Substring(0, text.Length - 2);  //去除尾部的mark
61        return text;
62      }
63      else
64      {
65        return "";
66      }
67    }
68    catch
69    {
70      return "Error";
71    }
72  }
73
74  /**//// <summary>
75  /// 關閉Word文檔
76  /// </summary>
77  public void Close()
78  {
79    if (openState == true)
80    {
81      if (doc != null)
82        doc.Close(ref missing, ref missing, ref missing);
83      cls.Quit(ref missing, ref missing, ref missing);
84    }
85  }
86}

盡管如此,我還是認為這個類的設計仍然存在缺陷。每次測試這個類的時候,感覺數據讀取的速度不是很令我滿意;而且,這個類用於控制台應用程序的時候不會在屏幕上看到任何值,不明白應該如何改進代碼。希望朋友們能夠給我提供一些改進此類的建議。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved