将多个word文档(doc/docx)合并到一个word文档,就像很多人写书,合成一本;包含分页效果和不分页。代码贴上:
WordQuery接口:主要通过路径获取word文档。
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using Aspose.Words;
namespace DocOil.Word.Interface
{
public interface WordQuery
{
Document GetDocment(string path);
ArrayList GetDocmentList(string[] paths);
}
}WordQueryImple实现类:主要实现上面的接口。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DocOil.Word.Interface;
using System.Collections;
using Aspose.Words;
namespace DocOil.Word.Imple
{
public class WordQueryImple: WordQuery
{
public Document GetDocment(string path)
{
Document doc=new Document(path);
return doc;
}
public ArrayList GetDocmentList(string[] paths)
{
ArrayList docArrayList = null;
if (0 == paths.Length)
return docArrayList;
Document doc;
docArrayList = new ArrayList();
for (int i = 0; i < paths.Length; i++)
{
doc = new Document(paths[i]);
docArrayList.Add(doc);
}
return docArrayList;
}
}
}
WordAdd:文档合并接口类。
using System;
using System.Collections.Generic;
using System.Text;
using Aspose.Words;
namespace DocOil.Word.Interface
{
public interface WordAdd
{
Document AddDocs2Doc(string[] paths,string outputPath);
Document AddDocs2DocByContinuous(string[] paths, string outputPath);
}
}
WordAddImple:对合并接口的实现。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DocOil.Word.Interface;
using System.Collections;
using Aspose.Words;
namespace DocOil.Word.Imple
{
public class WordAddImple: WordAdd
{
WordQuery wordQuery=new WordQueryImple() as WordQuery;
public Document AddDocs2Doc(string[] paths, string outputPath)
{
Document docAll = new Document();
ArrayList docArrayList = wordQuery.GetDocmentList(paths);
foreach(Document doc in docArrayList)
{
doc.FirstSection.PageSetup.SectionStart = SectionStart.Continuous;
docAll.AppendDocument(doc, ImportFormatMode.KeepSourceFormatting);
}
docAll.Save(outputPath);
return docAll;
}
public Document AddDocs2DocByContinuous(string[] paths, string outputPath)
{
Document docAll = new Document();
ArrayList docArrayList = wordQuery.GetDocmentList(paths);
foreach (Document doc in docArrayList)
{
doc.FirstSection.PageSetup.SectionStart = SectionStart.NewPage;
docAll.AppendDocument(doc, ImportFormatMode.KeepSourceFormatting);
}
docAll.Save(outputPath);
return docAll;
}
}
}
新建一个Winform项目。
设置好界面,如下图:
编写调用代码:
(1)初始化listView:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Windows.Forms;
namespace DocOil.FormList
{
public class DocListView
{
public static void InitListView(ListView listViewDoc, ArrayList wordNameList)
{
listViewDoc.Columns.Add("编号").Width = 50;
listViewDoc.Columns.Add("标题").Width = listViewDoc.Width - 30;
ListViewItem lvItem;
ListViewItem.ListViewSubItem lvSubItem;
for (int i = 0; i < wordNameList.Count; i++)
{
lvItem = new ListViewItem();
lvSubItem = new ListViewItem.ListViewSubItem();
lvItem.Text = (i + 1).ToString();
lvSubItem.Text = wordNameList[i].ToString();
lvItem.SubItems.Add(lvSubItem);
listViewDoc.Items.Add(lvItem);
}
listViewDoc.View = View.Details;
}
}
}
(2)设置进度条,封装一个进度条类
ProgressBarSetValue类
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using DocOil.Until;
using DocOil.Word.Imple;
using Aspose.Words;
using System.Threading;
namespace DocOil.FormList
{
public class ProgressBarSetValue
{
private ProgressBar proBar;
private int value;
private int maxNum;
public ProgressBarSetValue(ProgressBar proBar, int maxNum, int value)
{
this.proBar = proBar;
this.value = value;
this.maxNum = maxNum;
proBar.Visible = true;
proBar.Maximum = maxNum;
}
public void SetValue()
{
proBar.Value = value;
}
}
}
(3)刚才的窗体是系统的子窗体,因此,会通过父窗体调用word的paths。代码中会有说明,正式调用:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using DocOil.Until;
using DocOil.Word.Imple;
using Aspose.Words;
using System.Threading;
namespace DocOil.FormList
{
public partial class FWordAdd2One : Form
{
private ArrayList wordPaths;//接受从父窗体窗体过来word文档路径集合
private bool tag = false;//是否对合并时的文档分页
private int progressValue;//进度条的值
public FWordAdd2One()
{
InitializeComponent();
}
public FWordAdd2One(FMain ownerForm)//新增带参数的构造函数,用于窗体通信
{
InitializeComponent();
FMain mainDlg = ownerForm;//确保传进来的是初始化的父窗体
ArrayList wordNameList = mainDlg.wordNameList;//传过来的word文档名称(不含路径)
wordPaths = mainDlg.wordList;//传过来的word文档路径
Control.CheckForIllegalCrossThreadCalls = false;//多线程监测
this.progressBarSave.Visible = false;
this.txtSavePath.Enabled = false;
this.checkBoxFenYe.Checked = true;
DocListView.InitListView(listViewDoc, wordNameList);//初始化ListView,上面有类
}
private void btnSavePath_Click(object sender, EventArgs e)
{
SaveFileDialog dlg = new SaveFileDialog();
dlg.Title = "保存word文档";
dlg.Filter = "word文档|*.doc;*.docx";
if (dlg.ShowDialog() == DialogResult.OK)
{
txtSavePath.Text = dlg.FileName;
}
}
private void btnAdd2One_Click(object sender, EventArgs e)//开始合并
{
progressValue = 0;
if (0 == wordPaths.Count)
{
MessageBox.Show("列表中没有数据,请导入word文档在执行");
}
else
{
string[] paths = new string[wordPaths.Count];
for (int i = 0; i < wordPaths.Count; i++)
{
paths[i] = wordPaths[i].ToString();
progressValue++;
SetProgressBarValue();
}
WordAddImple wordAddImple = new WordAddImple();
if (!tag)//分页
wordAddImple.AddDocs2Doc(paths, txtSavePath.Text);
else
{
wordAddImple.AddDocs2DocByContinuous(paths, txtSavePath.Text);
}
MessageBox.Show(this,"完成!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
}
}
private void SetProgressBarValue()
{
ProgressBarSetValue psSetValue = new ProgressBarSetValue(this.progressBarSave, wordPaths.Count, progressValue);
ThreadStart ts = new ThreadStart(psSetValue.SetValue);
Thread th = new Thread(ts);
th.Start();
}
private void checkBoxFenYe_Click(object sender, EventArgs e)//更改分页标志
{
if (checkBoxFenYe.Checked)
{
tag = true;
}
}
}
}
(4)结果,多个文档合并成一个文档;包含分页和不分页效果。
原文链接:http://www.evget.com/article/2012/9/24/17562.html

所有评论(0)