[转]用 c# 来操作WORD的经验总结

1、引用

    需要引用 COM库:Microsoft word 11.0 Object Library. 不同的版本,会有不同的版本号。

   如 2010版Office 就是 Microsoft word 14.0 Object Library.

2、引用相应的名字空间:

    using Microsoft.Office.Core;

    using word = Microsoft.Office.Interop.Word;

3、打开一个已存在的word文档

public void OpenDocFile(string docName)
        {
            
        object oMissing = System.Reflection.Missing.Value;  //一个编程时需要经常使用的一个参数
        word.ApplicationClass wordapp = null;   //这是WORD程序,在这个程序下,可以同时打开多个文档,尽量不要同时打开多个Word程序,否则会出错的。
        word.Document doc = null;  //第一个需要打开的WORD文档
        word.Document doc2 = null;  //另一个需要打开的WORD文档

 
        wordapp = new word.ApplicationClass();
        wordapp.Visible = true; //所打开的WORD程序,是否是可见的。
 
            object docObject = docName;  //由于COM操作中,都是使用的 object ,所以,需要做一些转变                       
         if (File.Exists(docName))   // 如果要打开的文件名存在,那就使用doc来打开 
            {
                doc = wordapp.Documents.Add(ref docObject, ref oMissing, ref oMissing, ref oMissing);
                doc.Activate();   //将当前文件设定为活动文档
                ParagraphsCount = doc.Content.Paragraphs.Count;   //此文档中,段落的数量,也就是这个文档中,有几个段落。
            }
            else   //如果文件名不存在,那就使用doc2来打开
            {
                doc2 = wordapp.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);
                DocFileName = docName;
                doc2.Activate();   //将当前文件设定为活动文档  

            }

                  
        }

4、获取某一段的具体文本内容

 

public string Paragraph(int index)
        {
            word.Paragraph   para;  
            para = doc.Content.Paragraphs[index];   ///这是一个设定对应的某一段              
            return para.Range.Text;
        }

 

 5、DOC内容借助于剪贴板的复制与粘贴

 

/// <summary>
        /// 将doc某一段的内容复制到剪贴板上
        /// </summary>
        /// <param name="index">段的序号</param>
        public void CopyParagraph( int index)
        {
            word.Paragraph para;
            para = doc.Content.Paragraphs[index];
            para.Range.Copy();
        
        }
        /// <summary>
        /// 将剪贴板的内容粘贴到doc2文档中
        /// </summary>
        public void PasteParagraph()
        {
            if (doc2 != null)
            {
                word.Paragraph para = doc2.Content.Paragraphs.Add(ref oMissing);
                try
                {
                    para.Range.Paste();
                    para.Range.InsertParagraphBefore();//添加一次回车
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }

 

6、关闭WORD程序和文档

 

/// <summary>
        /// 关闭 word程序
        /// </summary>
        public void CloseWord()
        {
            if (wordapp != null)
            {
                if (doc != null)
                {
                    word._Document docc = doc as word._Document;
                    docc.Close(ref oMissing, ref oMissing, ref oMissing);
                }

                if (doc2 != null)
                {
                    word._Document docc = doc2 as word._Document;
                    docc.Close(ref oMissing, ref oMissing, ref oMissing);
                }

                wordapp.Quit(ref oMissing, ref oMissing, ref oMissing);
            }
        }

 

7、替换文档中的内容

 

/// <summary>
        /// 替换文档中的内容
        /// </summary>
        /// <param name="oldString">原有内容</param>
        /// <param name="newString">替换后的内容</param>
        public void Replace(string oldString, string newString)
        {
            doc2.Content.Find.Text = oldString;
            object FindText, ReplaceWith, ReplaceAll;

            FindText = oldString;
            ReplaceWith = newString;
            ReplaceAll = word.WdReplace.wdReplaceAll;
            doc2.Content.Find.Execute(ref FindText, 
                                      ref oMissing, 
                                      ref oMissing, 
                                      ref oMissing, 
                                      ref oMissing, 
                                      ref oMissing, 
                                      ref oMissing, 
                                      ref oMissing, 
                                      ref oMissing, 
                                      ref ReplaceWith, 
                                      ref ReplaceAll, 
                                      ref oMissing, 
                                      ref oMissing, 
                                      ref oMissing, 
                                      ref oMissing);

        }

 

注:以上,如果要替换其中的回车符为空格,可以这样使用

Replace(“^p”,"");

就可以了,这一点,与在WORD中使用的替换功能是一样的。

8、保存文档内容

/// <summary>
        /// 保存word文档(只保存doc2)
        /// </summary>
        public void SaveDocFile()
        {
            if (doc2 != null)
            {
                if (!string.IsNullOrEmpty(DocFileName))
                {
                    object docname = DocFileName;//要保存的文件名称,包括路径
                    Replace("^p^p", "^p");
                    doc2.SaveAs2(ref docname, 
                                 ref oMissing, 
                                 ref oMissing, 
                                 ref oMissing, 
                                 ref oMissing, 
                                 ref oMissing, 
                                 ref oMissing,
                                 ref oMissing, 
                                 ref oMissing, 
                                 ref oMissing, 
                                 ref oMissing, 
                                 ref oMissing, 
                                 ref oMissing, 
                                 ref oMissing, 
                                 ref oMissing,
                                 ref oMissing,
                                 ref oMissing);
                }
            }
        
        }

 

9、在复制过程中,如果文档中有表格,那么,上面所使用的复制方法,一般会报错。“"此方法或属性无效,因为 对象涉及表格行尾"。出现的原因就是因为 Paragraphs 只能是文字内容不能包括表格,在WORD中,表格是另一类重要的文档类型。其实在表格中,每一个单元格都是一个独立的段落。所以,如果文档中有表格,那么文档的doc.Content.Paragraphs.Count 数量会增加很多。在复制过程中,可以采用下面的方法来复制。

 

/// <summary>
         /// 复制文档的内容,从开始到结束(包括结束与开始的段落)的段落内容。
         /// </summary>
         /// <param name="first">开始的段落号</param>
         /// <param name="next">结束的段落号</param>
         public void CopyParagraph2(int first,int next)
         {
             word.Range range = doc.Range();
 
             word.Paragraph para1;
             para1 = doc.Content.Paragraphs[first];
             range.Start = para1.Range.Start;
 
             word.Paragraph para2;
             para2 = doc.Content.Paragraphs[next];
             range.End = para2.Range.End;
 
             range.Copy();
         
         }

 

 

 

在这个复制过程中,重新建立了一个区域 word.Range range = doc.Range(); 这个区域包括文档的所有内容。
然后根据段落的要求分别设定区域的Start  和 End ,如果在 Start  和 End 之间有一个表格的话,那么表格也会被正确复制过去。

10.C#中把多个Word文档合并为一个文档的方法

using System; 
 
using System.Collections.Generic; 
 
using System.Text; 
 
using Microsoft.Office.Interop.Word; 
 
using System.Reflection; 
 
using System.IO; 
 
using System.Diagnostics; 
 
namespace Eipsoft.Common 
 
{ 
 
/// <summary> 
 
/// Word文档合并类 
 
/// </summary> 
 
public class WordDocumentMerger 
 
{ 
 
private ApplicationClass objApp = null; 
 
private Document objDocLast = null; 
 
private Document objDocBeforeLast = null; 
 
public WordDocumentMerger() 
 
{ 
 
objApp = new ApplicationClass(); 
 
} 
 
#region 打开文件 
 
private void Open(string tempDoc) 
 
{ 
 
object objTempDoc = tempDoc; 
 
object objMissing = System.Reflection.Missing.Value; 
 
objDocLast = objApp.Documents.Open( 
 
ref objTempDoc,    //FileName 
 
ref objMissing,   //ConfirmVersions 
 
ref objMissing,   //ReadOnly 
 
ref objMissing,   //AddToRecentFiles 
 
ref objMissing,   //PasswordDocument 
 
ref objMissing,   //PasswordTemplate 
 
ref objMissing,   //Revert 
 
ref objMissing,   //WritePasswordDocument 
 
ref objMissing,   //WritePasswordTemplate 
 
ref objMissing,   //Format 
 
ref objMissing,   //Enconding 
 
ref objMissing,   //Visible 
 
ref objMissing,   //OpenAndRepair 
 
ref objMissing,  //DocumentDirection 
 
ref objMissing,  //NoEncodingDialog 
 
ref objMissing   //XMLTransform 
 
); 
 
objDocLast.Activate(); 
 
} 
 
#endregion 
 
#region 保存文件到输出模板 
 
private void SaveAs(string outDoc) 
 
{ 
 
object objMissing = System.Reflection.Missing.Value; 
 
object objOutDoc = outDoc; 
 
objDocLast.SaveAs( 
 
ref objOutDoc,    //FileName 
 
ref objMissing,   //FileFormat 
 
ref objMissing,   //LockComments 
 
ref objMissing,    //PassWord 
 
ref objMissing,    //AddToRecentFiles 
 
ref objMissing,    //WritePassword 
 
ref objMissing,    //ReadOnlyRecommended 
 
ref objMissing,    //EmbedTrueTypeFonts 
 
ref objMissing,    //SaveNativePictureFormat 
 
ref objMissing,    //SaveFormsData 
 
ref objMissing,    //SaveAsAOCELetter, 
 
ref objMissing,    //Encoding 
 
ref objMissing,    //InsertLineBreaks 
 
ref objMissing,    //AllowSubstitutions 
 
ref objMissing,    //LineEnding 
 
ref objMissing     //AddBiDiMarks 
 
); 
 
} 
endregion 
 
#region 循环合并多个文件(复制合并重复的文件) 
 
/// <summary>   /// 循环合并多个文件(复制合并重复的文件)   /// </summary> 
 
/// <param name="tempDoc">模板文件</param> 
 
/// <param name="arrCopies">需要合并的文件</param> 
 
/// <param name="outDoc">合并后的输出文件</param> 
 
public void CopyMerge(string tempDoc, string[] arrCopies, string outDoc) 
 
{ 
 
object objMissing = Missing.Value; 
 
object objFalse = false; 
 
object objTarget = WdMergeTarget.wdMergeTargetSelected; 
 
object objUseFormatFrom = WdUseFormattingFrom.wdFormattingFromSelected; 
 
try             { 
 
//打开模板文件 
 
Open(tempDoc); 
 
foreach (string strCopy in arrCopies) 
 
{    objDocLast.Merge( strCopy, 
 
//FileName 
 
ref objTarget,     //MergeTarget 
 
ref objMissing,         //DetectFormatChanges 
 
ref objUseFormatFrom,   //UseFormattingFrom 
 
ref objMissing          //AddToRecentFiles 
 
); 
 
objDocBeforeLast = objDocLast; 
 
objDocLast = objApp.ActiveDocument; 
 
if (objDocBeforeLast != null) 
 
{ 
 
objDocBeforeLast.Close( 
 
ref objFalse,     //SaveChanges 
 
ref objMissing,   //OriginalFormat 
 
ref objMissing    //RouteDocument 
 
); 
 
} 
 
} 
 
//保存到输出文件 
 
SaveAs(outDoc); 
 
foreach (Document objDocument in objApp.Documents) 
 
{ 
 
objDocument.Close( 
 
ref objFalse,     //SaveChanges 
 
ref objMissing,   //OriginalFormat 
 
ref objMissing    //RouteDocument 
 
); 
 
} 
 
} 
 
finally 
 
{ 
 
objApp.Quit( 
 
ref objMissing,     //SaveChanges 
 
ref objMissing,     //OriginalFormat 
 
ref objMissing      //RoutDocument 
 
); 
 
objApp = null; 
 
} 
 
} 
 
/// <summary>          /// 循环合并多个文件(复制合并重复的文件)          /// </summary> 
 
/// <param name="tempDoc">模板文件</param> 
 
/// <param name="arrCopies">需要合并的文件</param> 
 
/// <param name="outDoc">合并后的输出文件</param> 
 
public void CopyMerge(string tempDoc, string strCopyFolder, string outDoc) 
 
{ 
 
string[] arrFiles = Directory.GetFiles(strCopyFolder); 
 
CopyMerge(tempDoc, arrFiles, outDoc); 
 
} 
 
#endregion 
 
#region 循环合并多个文件(插入合并文件) 
 
/// <summary>          /// 循环合并多个文件(插入合并文件)  /// </summary> 
 
/// <param name="tempDoc">模板文件</param> 
 
/// <param name="arrCopies">需要合并的文件</param> 
 
/// <param name="outDoc">合并后的输出文件</param> 
 
public void InsertMerge(string tempDoc, string[] arrCopies, string outDoc) 
 
{ 
 
object objMissing = Missing.Value; 
 
object objFalse = false; 
 
object confirmConversion = false; 
 
object link = false; 
 
object attachment = false; 
 
try 
 
{ 
 
//打开模板文件 
 
Open(tempDoc); 
 
foreach (string strCopy in arrCopies) 
 
{ 
 
objApp.Selection.InsertFile( 
 
strCopy, 
 
ref objMissing, 
 
ref confirmConversion, 
 
ref link, 
 
ref attachment 
 
); 
 
} 
 
//保存到输出文件   
 
      SaveAs(outDoc); 
 
foreach (Document objDocument in objApp.Documents) 
 
{ 
 
objDocument.Close( 
 
ref objFalse,     //SaveChanges 
 
ref objMissing,   //OriginalFormat 
 
ref objMissing    //RouteDocument 
 
); 
 
} 
 
} 
 
finally 
 
{ 
 
objApp.Quit( 
 
ref objMissing,     //SaveChanges 
 
ref objMissing,     //OriginalFormat 
 
ref objMissing      //RoutDocument 
 
); 
 
objApp = null; 
 
} 
 
} 
 
/// <summary> 
 
/// 循环合并多个文件(插入合并文件) 
 
/// </summary> 
 
/// <param name="tempDoc">模板文件</param> 
 
/// <param name="arrCopies">需要合并的文件</param> 
 
/// <param name="outDoc">合并后的输出文件</param> 
 
public void InsertMerge(string tempDoc, string strCopyFolder, string outDoc) 
 
{ 
 
string[] arrFiles = Directory.GetFiles(strCopyFolder); 
 
InsertMerge(tempDoc, arrFiles, outDoc); 
 
} 
 
#endregion 
 
} 
 
} 

 

 

 

转载于:https://www.cnblogs.com/lema/archive/2012/10/10/2718822.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值