先要安装包
帮助类WordDocumentMerger,用于处理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 WordHellper
{public class WordDocumentMerger{/// <summary>/// 合并第几个/// </summary>public static int status_Index = 0;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, //FileNameref objMissing, //ConfirmVersionsref objMissing, //ReadOnlyref objMissing, //AddToRecentFilesref objMissing, //PasswordDocumentref objMissing, //PasswordTemplateref objMissing, //Revertref objMissing, //WritePasswordDocumentref objMissing, //WritePasswordTemplateref objMissing, //Formatref objMissing, //Encondingref objMissing, //Visibleref objMissing, //OpenAndRepairref objMissing, //DocumentDirectionref objMissing, //NoEncodingDialogref objMissing //XMLTransform);objDocLast.Activate();objDocLast.SpellingChecked = false;//关闭Word的拼写检查objDocLast.ShowSpellingErrors = false;//关闭Word的拼写错误提示 }#endregion#region 保存文件到输出模板private void SaveAs(string outDoc){object objMissing = System.Reflection.Missing.Value;object objOutDoc = outDoc;objDocLast.SaveAs(ref objOutDoc, //FileNameref objMissing, //FileFormatref objMissing, //LockCommentsref objMissing, //PassWord ref objMissing, //AddToRecentFilesref objMissing, //WritePasswordref objMissing, //ReadOnlyRecommendedref objMissing, //EmbedTrueTypeFontsref objMissing, //SaveNativePictureFormatref objMissing, //SaveFormsDataref objMissing, //SaveAsAOCELetter,ref objMissing, //Encodingref objMissing, //InsertLineBreaksref objMissing, //AllowSubstitutionsref objMissing, //LineEndingref objMissing //AddBiDiMarks);}#endregion#region 循环合并多个文件(复制合并重复的文件)////// 循环合并多个文件(复制合并重复的文件)////// 模板文件/// 需要合并的文件/// 合并后的输出文件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, //MergeTargetref objMissing, //DetectFormatChangesref objUseFormatFrom, //UseFormattingFromref objMissing //AddToRecentFiles);objDocBeforeLast = objDocLast;objDocLast = objApp.ActiveDocument;if (objDocBeforeLast != null){objDocBeforeLast.Close(ref objFalse, //SaveChangesref objMissing, //OriginalFormatref objMissing //RouteDocument);}}//保存到输出文件SaveAs(outDoc);foreach (Document objDocument in objApp.Documents){objDocument.Close(ref objFalse, //SaveChangesref objMissing, //OriginalFormatref objMissing //RouteDocument);}}finally{objApp.Quit(ref objMissing, //SaveChangesref objMissing, //OriginalFormatref objMissing //RoutDocument);objApp = null;}}////// 循环合并多个文件(复制合并重复的文件)////// 模板文件/// 需要合并的文件/// 合并后的输出文件public void CopyMerge(string tempDoc, string strCopyFolder, string outDoc){string[] arrFiles = Directory.GetFiles(strCopyFolder);CopyMerge(tempDoc, arrFiles, outDoc);}#endregion#region 循环合并多个文件(插入合并文件)////// 循环合并多个文件(插入合并文件)////// 模板文件/// 需要合并的文件/// 合并后的输出文件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);int index = 1;foreach (string strCopy in arrCopies){objApp.Selection.InsertFile(strCopy,ref objMissing,ref confirmConversion,ref link,ref attachment);object oPageBreak = WdBreakType.wdPageBreak;objApp.Selection.InsertBreak(ref oPageBreak);status_Index = index;index++;}//保存到输出文件SaveAs(outDoc);foreach (Document objDocument in objApp.Documents){objDocument.Close(ref objFalse, //SaveChangesref objMissing, //OriginalFormatref objMissing //RouteDocument);}}finally{objApp.Quit(ref objMissing, //SaveChangesref objMissing, //OriginalFormatref objMissing //RoutDocument);objApp = null;status_Index = -1;}}////// 循环合并多个文件(插入合并文件)////// 模板文件/// 需要合并的文件/// 合并后的输出文件public void InsertMerge(string tempDoc, string strCopyFolder, string outDoc){string[] arrFiles = Directory.GetFiles(strCopyFolder);string url = "";string hou = "";List<int> sysIndexs = new List<int>();foreach (var item in arrFiles){url = Path.GetDirectoryName(item);hou = Path.GetExtension(item);string name = Path.GetFileNameWithoutExtension(item);int index = Convert.ToInt32(name);sysIndexs.Add(index);}sysIndexs.Sort();string[] arrFiles2 = new string[arrFiles.Length];int index1 = 0;foreach (var item in sysIndexs){string name = url + "\\" + item + hou;arrFiles2[index1] = name;index1++;}InsertMerge(tempDoc, arrFiles2, outDoc);}#endregion}
}
主界面调用代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WordHellper
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){FolderBrowserDialog dialog = new FolderBrowserDialog();dialog.Description = "请选择文件夹路径";// dialog.SelectedPath = path;//dialog.RootFolder = Environment.SpecialFolder.Programs;if (dialog.ShowDialog() == DialogResult.OK){string foldPath = dialog.SelectedPath;textBox1.Text = foldPath;}}private void button2_Click(object sender, EventArgs e){string templatePathAll = Environment.CurrentDirectory + "\\合并文档.docx";//一般是一个空文档string filesPath = textBox1.Text.Trim();//一个文件夹目录,里面是需要合并的文档string Path = Environment.CurrentDirectory + "\\保存文档.docx";//输出文档路径//WordDocumentMerger wordDocMerger = new WordDocumentMerger();//wordDocMerger.InsertMerge(templatePathAll, filesPath, Path);Task task = new Task(() =>{Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");WordDocumentMerger wordDocMerger = new WordDocumentMerger();wordDocMerger.InsertMerge(templatePathAll, filesPath, Path);while (true){this.Invoke((EventHandler)delegate{label1.Text = WordDocumentMerger.status_Index.ToString();});Thread.Sleep(1000);}});task.Start();}}
}