转自:http://www.cnblogs.com/zrx401558287/archive/2009/03/19/1404606.html

 

【实现功能】

     读取word文件的内容,根据word的标题或书签把word分成多个部分的word文件。

【开发环境】

     vs2005+office2003

【实现过程】

     1:操作word文档首先要添加word的.NET引用:Microsoft.Office.Interop.Word

     2:首先读取word文档

        ApplicationClass word = new Microsoft.Office.Interop.Word.ApplicationClass();
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
        
        /// 读取word文档
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        
/// </summary>
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        
/// <param name="path">word文档路径</param>
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        
/// <returns></returns>

C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        private Document ReadDocument(string path)
        
            object missing = System.Reflection.Missing.Value;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            Type wordType 
= word.GetType();
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            Documents docs 
= word.Documents;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            Type docsType 
= docs.GetType();
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            
object objDocName = path;
            Document doc 
= (Document)docsType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, docs, new Object[] 
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            
return doc;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        }

 

     3:创建一个文档来保存拆分的word部分

                /// 创建word文档
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        
/// </summary>
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        
/// <returns></returns>

C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        private Document CreateDocument()
        
            object missing = System.Reflection.Missing.Value;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            Document newdoc 
= word.Documents.Add(ref missing, ref missing, ref missing, ref missing);
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            
return newdoc;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        }

C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)

 

     4:比较关键的就是根据标题或书签来定位了.

     如果根据标题定位就比较慢了,我们要遍历word中所有的Paragraphs然后判断他的OutlineLevel是否是标题,如果他的值是WdOutlineLevel.wdOutlineLevel1则说明是标题1,这样以此类推.

     如果根据书签来定位就是比较简单的也是比较有效率的,因为word对象里本身就有Bookmarks这个对象,我的程序里是固定的书签所以我就直接根据定义了一个int[,] result = new int[9, 2];来记录这九个书签的开始和结束位置.

        /// 获取书签的位置
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        
/// </summary>
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        
/// <param name="word">文档对象</param>
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        
/// <returns></returns>

C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        private int[,] GetPosition(Document word)
        
            int[,] result = new int[92];
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            
int titleIndex = 0;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            
int bmcount = word.Bookmarks.Count;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            
for (int i = 1; i <= bmcount; i++)
            
                object index = i;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                Bookmark bm
=word.Bookmarks.get_Item(ref index);
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                
if (bm.Name == "模板书签禁止修改" + Convert.ToString(titleIndex + 1))
                
                    result[titleIndex, 0= bm.Start;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    result[titleIndex, 
1= bm.End;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    titleIndex
++;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                }

C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            }

C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            
return result;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        }

     

     5:最后只需要根据定位把内容copy到新的word文档中然后保存就行了.

     word中可以使用Range方法,只需要传递开始和结束位置就可以返回一个Range对象,而这个对象就有copy的方法,我们把range copy到剪贴板中,然后在新建的文档中调用Paste方法然后再保存就成功把这部分提取到一个新的word中了。

 

        /// 拆分word
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        
/// </summary>

C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        private void CovertWord()
        
            object missing = System.Reflection.Missing.Value;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            
try
            
                string path = "c:\\1134";
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                Directory.CreateDirectory(path);
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                Document doc 
= ReadDocument("c:\\a.doc");
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                
int[,] positions = GetPosition(doc);
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                
object oStart = 0;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                
object oEnd = 0;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                
for (int i = 0; i < 10; i++)
                
                    if (i != 9)
                    
                        oEnd = positions[i, 0];
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    }

C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    
else
                    
                        oEnd = doc.Content.End;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    }

C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    Range tocopy 
= doc.Range(ref oStart,ref oEnd);
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    tocopy.Copy();
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    Document docto 
= CreateDocument();
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    docto.Content.Paste();
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    
object filename = path + "\\" + i.ToString() + ".doc";
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    docto.SaveAs(
ref filename, ref missing, ref missing, ref missing, ref missing,
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                        
ref missing, ref missing, ref missing, ref missing, ref missing, ref missing,
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                        
ref missing, ref missing, ref missing, ref missing, ref missing);
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    docto.Close(
ref missing, ref missing, ref missing);
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                    oStart 
= oEnd;
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)                }

C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            }

C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            
catch
            
            }
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            
finally
            
                word.Quit(ref missing, ref missing, ref missing);
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)            }

C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)
C# 拆分word(根据标题或书签拆分) (转自zrx401558287)
    





            
C# 拆分word(根据标题或书签拆分)        }

 

【结语】

     开始我用的遍历paragraph但对于大一点的文档超费时间,所以改成根据bookmark来定位。

     这个只是简单的操作word的一个例子,希望对大家有所帮助。

【完整源码】https://files.cnblogs.com/zrx401558287/splitword.rar

 

相关文章:

  • 2021-11-06
  • 2021-06-26
  • 2021-10-10
  • 2021-06-17
  • 2021-09-07
  • 2021-06-24
猜你喜欢
  • 2021-07-11
  • 2022-01-03
  • 2021-07-28
  • 2021-11-14
  • 2022-12-23
  • 2021-12-08
相关资源
相似解决方案