先要安装包
帮助类WordDocumentMerger,用于处理word合并功能
csharp
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, //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();
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, //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 循环合并多个文件(复制合并重复的文件)
///
/// 循环合并多个文件(复制合并重复的文件)
///
/// 模板文件
/// 需要合并的文件
/// 合并后的输出文件
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;
}
}
///
/// 循环合并多个文件(复制合并重复的文件)
///
/// 模板文件
/// 需要合并的文件
/// 合并后的输出文件
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, //SaveChanges
ref objMissing, //OriginalFormat
ref objMissing //RouteDocument
);
}
}
finally
{
objApp.Quit(
ref objMissing, //SaveChanges
ref objMissing, //OriginalFormat
ref 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
}
}
主界面调用代码:
csharp
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();
}
}
}