C#实现Word中表格信息读取

很多时候,会有很多信息存放在Word文档中。而我们需要把这些信息提取出来,另做它用。而Word的格式是ms的机密,不知道有没有NB人可以对其做字符流的分析,反正我是没这能力也没这打算。所以就只能用ms提供的组件来进行编程。但ms没有提供托管的类库,而是提供了对com组件的PIA转换。具体添加,使用和相关知识,可以参见kaneboy's blog中的http://blog.joycode.com/kaneboy/articles/67688.aspx。高手的讲解,很是清晰。
而我想做的是对word文档中的表信息进行提取。网上很难找到相关的代码(打开一个已有文档,对其内容进行分析),但我觉得这种工作是很有意义的。写了一段小的Demo,如下:

object oFileName = @"C:\Documents and Settings\liush\My Documents\TestDoc.doc";
object oReadOnly = true;
object oMissing = System.Reflection.Missing.Value;

Word._Application oWord;
Word._Document oDoc;
oWord = new Word.Application();
oWord.Visible = true;//只是为了方便观察
oDoc = oWord.Documents.Open(ref oFileName, ref oMissing, ref oReadOnly, ref oMissing, ref oMissing,
    ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

//MessageBox.Show(oDoc.Tables.Count.ToString());
for (int tablePos = 1; tablePos <= oDoc.Tables.Count; tablePos++)
{
    Word.Table nowTable = oDoc.Tables.Item(tablePos);
    string tableMessage = string.Format("第{0}/{1}个表:\n", tablePos, oDoc.Tables.Count);

    for (int rowPos = 1; rowPos <= nowTable.Rows.Count; rowPos++)
    {
for (int columPos = 1; columPos <= nowTable.Columns.Count; columPos++)
{
tableMessage += nowTable.Cell(rowPos, columPos).Range.Text;
tableMessage = tableMessage.Remove(tableMessage.Length - 2, 2);//remove \r\a
tableMessage += "\t";
}

tableMessage += "\n";
    }

    MessageBox.Show(tableMessage);
}

如果看过了上面kaneboy的文章(这是一个系列的之一),再看这段代码应该不会很难理解。打开一个已有文档,然后遍历其中的所有的表。这里只是简单的将信息显示出来,具体实践上可以对这些信息进行分析。做完这些后,终于找到了一些官方的支持文档,地址如下:
http://msdn2.microsoft.com/zh-CN/library/y1xatbkd.aspx
其中的word任务有对word各种操作的简单代码事例,用vb和c#写的。看完之后,我想每个人都会明白vb对com的支持比c#不是简单明了一点两点。(可以看下这个http://blog.joycode.com/kaneboy/archive/2005/08/03/61489.aspx)同样的代码,用vb实现打开word文档的操作,代码如下:

Dim fileName As String = "C:\Documents and Settings\liush\My Documents\TestDoc.doc"
Dim isReadOnly As Boolean = True

Dim wordApplication As Word.Application = New Word.Application()
Dim wordDocument As Word.Document
wordApplication.Visible = True
wordDocument = wordApplication.Documents.Open(fileName, , isReadOnly)

所以,下次我要做COM操作的时候,我还会回归我可爱的VB的。但是,用了太久的C#毛病越来越多了,动不动就习惯性加括号,加分号。。。

PS:这些工作是帮我老妈做的。她们资料室想把资料目录信息存入数据库,然后建立网站方便检索和管理。这些目录信息原先是存放在Word文档中的。这是她们第一次数字化的结果,那一次她们把一大堆纸质资料变成了word文档。在她们的当时理解中,数字化就是按照原来的东西,连格式都不变的变成Word文档就好。现在他们对这些难于维护,难于检索的东西终于失去了耐性,开始考虑数据库和网络了。也许数字化也是一个思维逐步转变的过程。

posted on 2006-08-11 15:49 duguguiyu 阅读(1663) 评论(5)  编辑 收藏 所属分类: 心得体会.Net

评论

#1楼  2006-08-11 17:07 aspnetx      

标记一下先
以后慢慢研究   回复  引用  查看    

#2楼 [楼主] 2006-08-12 09:50 duguguiyu      

这段代码还只能解决n*m的简单表格,对有跨行跨列的表格的处理方法还在寻找。。。   回复  引用  查看    

#3楼  2007-01-22 10:57 王伟晔 [未注册用户]

我也是这样读取Word的,不过我的上头说速度比VB6写的慢很多。请问各位有什么方案   回复  引用    

#4楼  2007-01-26 11:00 duguguiyu [未注册用户]

恩。确实很慢。觉得应该是托管封装com的原因吧。猜的。   回复  引用    

#5楼  2007-11-20 17:12 DOGNET      

请教一个问题?

用C#读取word文件中有合并单元格(同一列的不同行合并)的表数据时

string tempColumnValue = nowTable.Cell(rowPos, columPos).Range.Text;

出现以下错误:
"集合所要求的成员不存在"

(但若表中没有合并的单元格,就能正常的读取数据)

(我的理解是:合并后的单元格仅被当作其相关的第一行的列值,其它相关行的当前列值被认为不存在)

问题是:如何才能识别当前行的当前列值与前一行的当前列值是合并后的单元格,若能判断,我就可以用前一行的当前列值作为当前行的当前列值   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2006-08-20 21:07 编辑过
 
另存  打印
 


导航

公告


姓名:A2F1H1I1N1U2Y1

性别:这里会有女人么?

特长:擅长回答各类码工常见问题,正确率高到0%。

欢迎前往观看另一个我




<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

留言簿(9)

随笔分类(133)

随笔档案(92)

搜索

积分与排名

最新评论

阅读排行榜