DocX学习系列

DocX开源WORD操作组件的学习系列一 :  http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.html

DocX开源WORD操作组件的学习系列二 :  http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_csharp_005_docx2.html

DocX开源WORD操作组件的学习系列三:  http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_csharp_006_docx3.html

DocX开源WORD操作组件的学习系列四:  http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_csharp_006_docx4.html

插入表格1低效

        static void LargeTable()
{
Console.WriteLine("\tLargeTable()");
var _directoryWithFiles = "docs\\";
using (var output = File.Open(_directoryWithFiles + "LargeTable.docx", FileMode.Create))
{
using (var doc = DocX.Create(output))
{
var tbl = doc.InsertTable(, ); var wholeWidth = doc.PageWidth - doc.MarginLeft - doc.MarginRight;
var colWidth = wholeWidth / tbl.ColumnCount;
var colWidths = new int[tbl.ColumnCount];
tbl.AutoFit = AutoFit.Contents;
var r = tbl.Rows[];
var cx = ;
foreach (var cell in r.Cells)
{
cell.Paragraphs.First().Append("Col " + cx);
//cell.Width = colWidth;
cell.MarginBottom = ;
cell.MarginLeft = ;
cell.MarginRight = ;
cell.MarginTop = ; cx++;
}
tbl.SetBorder(TableBorderType.Bottom, BlankBorder);
tbl.SetBorder(TableBorderType.Left, BlankBorder);
tbl.SetBorder(TableBorderType.Right, BlankBorder);
tbl.SetBorder(TableBorderType.Top, BlankBorder);
tbl.SetBorder(TableBorderType.InsideV, BlankBorder);
tbl.SetBorder(TableBorderType.InsideH, BlankBorder); doc.Save();
}
}
Console.WriteLine("\tCreated: docs\\LargeTable.docx\n");
} static void TableWithSpecifiedWidths()
{
Console.WriteLine("\tTableSpecifiedWidths()");
var _directoryWithFiles = "docs\\";
using (var output = File.Open(_directoryWithFiles + "TableSpecifiedWidths.docx", FileMode.Create))
{
using (var doc = DocX.Create(output))
{
var widths = new float[] { 200f, 100f, 300f };
var tbl = doc.InsertTable(, widths.Length);
tbl.SetWidths(widths);
var wholeWidth = doc.PageWidth - doc.MarginLeft - doc.MarginRight;
tbl.AutoFit = AutoFit.Contents;
var r = tbl.Rows[];
var cx = ;
foreach (var cell in r.Cells)
{
cell.Paragraphs.First().Append("Col " + cx);
//cell.Width = colWidth;
cell.MarginBottom = ;
cell.MarginLeft = ;
cell.MarginRight = ;
cell.MarginTop = ; cx++;
}
//add new rows
for (var x = ; x < ; x++)
{
r = tbl.InsertRow();
cx = ;
foreach (var cell in r.Cells)
{
cell.Paragraphs.First().Append("Col " + cx);
//cell.Width = colWidth;
cell.MarginBottom = ;
cell.MarginLeft = ;
cell.MarginRight = ;
cell.MarginTop = ; cx++;
}
}
tbl.SetBorder(TableBorderType.Bottom, BlankBorder);
tbl.SetBorder(TableBorderType.Left, BlankBorder);
tbl.SetBorder(TableBorderType.Right, BlankBorder);
tbl.SetBorder(TableBorderType.Top, BlankBorder);
tbl.SetBorder(TableBorderType.InsideV, BlankBorder);
tbl.SetBorder(TableBorderType.InsideH, BlankBorder); doc.Save();
}
}
Console.WriteLine("\tCreated: docs\\TableSpecifiedWidths.docx\n"); }

插入表格2高效

     public class Data
{
public string Name { get; set; }
public string AliasName { get; set; } }
private static void InsertTabelTest()
{
Console.WriteLine("\table1()");
//我这里生成一部分样例数据
var list = new List<Data>();
for (int i = ; i < ; i++)
{
list.Add(new Data() {Name = i.ToString(),AliasName = i+".."+i.ToString()});
}
Stopwatch stopwatch = new Stopwatch();
stopwatch.Restart();
//直接使用inserttable插入table
using (DocX document = DocX.Create(@"docs\InsertTable.docx"))
{ var table1= document.InsertTable(list.Count,);
table1.Design=TableDesign.ColorfulGrid;
for (int i = ; i < list.Count; i++)
{
table1.Rows[i].Cells[].Paragraphs.First().InsertText(list[i].Name);
table1.Rows[i].Cells[].Paragraphs.First().InsertText(list[i].AliasName);
}
document.Save(); Console.WriteLine("\tCreated: docs\\InsertTable.docx\n");
}
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed.TotalMilliseconds+"毫秒");// 234277.7521毫秒
stopwatch.Restart();
//使用addtable后再inserttable
using (DocX document = DocX.Create(@"docs\AddTable.docx"))
{ var table1 = document.AddTable(list.Count, );
table1.Design = TableDesign.ColorfulGrid;
for (int i = ; i < list.Count; i++)
{
table1.Rows[i].Cells[].Paragraphs.First().InsertText(list[i].Name);
table1.Rows[i].Cells[].Paragraphs.First().InsertText(list[i].AliasName);
}
document.InsertTable(table1);
document.Save();
Console.WriteLine("\tCreated: docs\\AddTable.docx\n");
}
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed.TotalMilliseconds +"毫秒");//60773.5141毫秒
Console.ReadKey(); ////////////////////////////////////////////////// }

文档加密

   static void ProtectedDocument()
{
Console.WriteLine("\tHelloWorldPasswordProtected()"); // Create a new document.
using (DocX document = DocX.Create(@"docs\HelloWorldPasswordProtected.docx"))
{
// Insert a Paragraph into this document.
Paragraph p = document.InsertParagraph(); // Append some text and add formatting.
p.Append("Hello World!^011Hello World!")
.Font(new Font("Times New Roman"))
.FontSize()
.Color(WindowsColor.Blue)
.Bold(); // Save this document to disk with different options
// Protected with password for Read Only
EditRestrictions erReadOnly = EditRestrictions.readOnly;
document.AddProtection(erReadOnly, "oracle");
document.SaveAs(@"docs\\HelloWorldPasswordProtectedReadOnly.docx");
Console.WriteLine("\tCreated: docs\\HelloWorldPasswordProtectedReadOnly.docx\n"); // Protected with password for Comments
EditRestrictions erComments = EditRestrictions.comments;
document.AddProtection(erComments, "oracle");
document.SaveAs(@"docs\\HelloWorldPasswordProtectedCommentsOnly.docx");
Console.WriteLine("\tCreated: docs\\HelloWorldPasswordProtectedCommentsOnly.docx\n"); // Protected with password for Forms
EditRestrictions erForms = EditRestrictions.forms;
document.AddProtection(erForms, "oracle");
document.SaveAs(@"docs\\HelloWorldPasswordProtectedFormsOnly.docx");
Console.WriteLine("\tCreated: docs\\HelloWorldPasswordProtectedFormsOnly.docx\n"); // Protected with password for Tracked Changes
EditRestrictions erTrackedChanges = EditRestrictions.trackedChanges;
document.AddProtection(erTrackedChanges, "oracle");
document.SaveAs(@"docs\\HelloWorldPasswordProtectedTrackedChangesOnly.docx");
Console.WriteLine("\tCreated: docs\\HelloWorldPasswordProtectedTrackedChangesOnly.docx\n"); // But it's also possible to add restrictions without protecting it with password. // Protected with password for Read Only
document.AddProtection(erReadOnly);
document.SaveAs(@"docs\\HelloWorldWithoutPasswordReadOnly.docx");
Console.WriteLine("\tCreated: docs\\HelloWorldWithoutPasswordReadOnly.docx\n"); // Protected with password for Comments
document.AddProtection(erComments);
document.SaveAs(@"docs\\HelloWorldWithoutPasswordCommentsOnly.docx");
Console.WriteLine("\tCreated: docs\\HelloWorldWithoutPasswordCommentsOnly.docx\n"); // Protected with password for Forms
document.AddProtection(erForms);
document.SaveAs(@"docs\\HelloWorldWithoutPasswordFormsOnly.docx");
Console.WriteLine("\tCreated: docs\\HelloWorldWithoutPasswordFormsOnly.docx\n"); // Protected with password for Tracked Changes
document.AddProtection(erTrackedChanges);
document.SaveAs(@"docs\\HelloWorldWithoutPasswordTrackedChangesOnly.docx");
Console.WriteLine("\tCreated: docs\\HelloWorldWithoutPasswordTrackedChangesOnly.docx\n");
}
}

缩进

  private static void Indentation()
{
Console.WriteLine("\tIndentation()"); // Create a new document.
using (DocX document = DocX.Create(@"docs\Indentation.docx"))
{
// Create a new Paragraph.
Paragraph p = document.InsertParagraph("Line 1\nLine 2\nLine 3");
// Indent only the first line of the Paragraph
p.IndentationFirstLine = 1.0f;
// Save all changes made to this document.
document.Save();
Console.WriteLine("\tCreated: docs\\Indentation.docx\n");
}
}

边距设置

        private static void DocumentMargins()
{
Console.WriteLine("\tDocumentMargins()"); // Create a document.
using (DocX document = DocX.Create(@"docs\DocumentMargins.docx"))
{ // Create a float var that contains doc Margins properties.
float leftMargin = document.MarginLeft;
float rightMargin = document.MarginRight;
float topMargin = document.MarginTop;
float bottomMargin = document.MarginBottom;
// Modify using your own vars.
leftMargin = 95F;
rightMargin = 45F;
topMargin = 50F;
bottomMargin = 180F; // Or simply work the margins by setting the property directly.
document.MarginLeft = leftMargin;
document.MarginRight = rightMargin;
document.MarginTop = topMargin;
document.MarginBottom = bottomMargin; // created bulleted lists var bulletedList = document.AddList("First Bulleted Item.", , ListItemType.Bulleted);
document.AddListItem(bulletedList, "Second bullet item");
document.AddListItem(bulletedList, "Sub bullet item", );
document.AddListItem(bulletedList, "Second sub bullet item", );
document.AddListItem(bulletedList, "Third bullet item"); document.InsertList(bulletedList); // Save this document.
document.Save(); Console.WriteLine("\tCreated: docs\\DocumentMargins.docx\n");
}
}

创建模板并设置自定义属性

      private static void CreateInvoice()
{
Console.WriteLine("\tCreateInvoice()");
DocX g_document; try
{
// Store a global reference to the loaded document.
g_document = DocX.Load(@"docs\InvoiceTemplate.docx"); /*
* The template 'InvoiceTemplate.docx' does exist,
* so lets use it to create an invoice for a factitious company
* called "The Happy Builder" and store a global reference it.
*/
g_document = CreateInvoiceFromTemplate(DocX.Load(@"docs\InvoiceTemplate.docx")); // Save all changes made to this template as Invoice_The_Happy_Builder.docx (We don't want to replace InvoiceTemplate.docx).
g_document.SaveAs(@"docs\Invoice_The_Happy_Builder.docx");
Console.WriteLine("\tCreated: docs\\Invoice_The_Happy_Builder.docx\n");
} // The template 'InvoiceTemplate.docx' does not exist, so create it.
catch (FileNotFoundException)
{
// Create and store a global reference to the template 'InvoiceTemplate.docx'.
g_document = CreateInvoiceTemplate(); // Save the template 'InvoiceTemplate.docx'.
g_document.Save();
Console.WriteLine("\tCreated: docs\\InvoiceTemplate.docx"); // The template exists now so re-call CreateInvoice().
CreateInvoice();
}
}
// Create an invoice for a factitious company called "The Happy Builder".
private static DocX CreateInvoiceFromTemplate(DocX template)
{
#region Logo
// A quick glance at the template shows us that the logo Paragraph is in row zero cell 1.
Paragraph logo_paragraph = template.Tables[].Rows[].Cells[].Paragraphs[];
// Remove the template Picture that is in this Paragraph.
logo_paragraph.Pictures[].Remove(); // Add the Happy Builders logo to this document.
RelativeDirectory rd = new RelativeDirectory(); // prepares the files for testing
rd.Up();
Image logo = template.AddImage(rd.Path + @"\images\logo_the_happy_builder.png"); // Insert the Happy Builders logo into this Paragraph.
logo_paragraph.InsertPicture(logo.CreatePicture());
#endregion #region Set CustomProperty values
// Set the value of the custom property 'company_name'.
template.AddCustomProperty(new CustomProperty("company_name", "The Happy Builder")); // Set the value of the custom property 'company_slogan'.
template.AddCustomProperty(new CustomProperty("company_slogan", "No job too small")); // Set the value of the custom properties 'hired_company_address_line_one', 'hired_company_address_line_two' and 'hired_company_address_line_three'.
template.AddCustomProperty(new CustomProperty("hired_company_address_line_one", "The Crooked House,"));
template.AddCustomProperty(new CustomProperty("hired_company_address_line_two", "Dublin,"));
template.AddCustomProperty(new CustomProperty("hired_company_address_line_three", "")); // Set the value of the custom property 'invoice_date'.
template.AddCustomProperty(new CustomProperty("invoice_date", DateTime.Today.Date.ToString("d"))); // Set the value of the custom property 'invoice_number'.
template.AddCustomProperty(new CustomProperty("invoice_number", )); // Set the value of the custom property 'hired_company_details_line_one' and 'hired_company_details_line_two'.
template.AddCustomProperty(new CustomProperty("hired_company_details_line_one", "Business Street, Dublin, 12345"));
template.AddCustomProperty(new CustomProperty("hired_company_details_line_two", "Phone: 012-345-6789, Fax: 012-345-6789, e-mail: support@thehappybuilder.com"));
#endregion /*
* InvoiceTemplate.docx contains a blank Table,
* we want to replace this with a new Table that
* contains all of our invoice data.
*/
Table t = template.Tables[];
Table invoice_table = CreateAndInsertInvoiceTableAfter(t, ref template);
t.Remove(); // Return the template now that it has been modified to hold all of our custom data.
return template;
} // Create an invoice template.
private static DocX CreateInvoiceTemplate()
{
// Create a new document.
DocX document = DocX.Create(@"docs\InvoiceTemplate.docx"); // Create a table for layout purposes (This table will be invisible).
Table layout_table = document.InsertTable(, );
layout_table.Design = TableDesign.TableNormal;
layout_table.AutoFit = AutoFit.Window; // Dark formatting
Formatting dark_formatting = new Formatting();
dark_formatting.Bold = true;
dark_formatting.Size = ;
dark_formatting.FontColor = WindowsColor.FromArgb(, , ); // Light formatting
Formatting light_formatting = new Formatting();
light_formatting.Italic = true;
light_formatting.Size = ;
light_formatting.FontColor = WindowsColor.FromArgb(, , ); #region Company Name
// Get the upper left Paragraph in the layout_table.
Paragraph upper_left_paragraph = layout_table.Rows[].Cells[].Paragraphs[]; // Create a custom property called company_name
CustomProperty company_name = new CustomProperty("company_name", "Company Name"); // Insert a field of type doc property (This will display the custom property 'company_name')
layout_table.Rows[].Cells[].Paragraphs[].InsertDocProperty(company_name, f: dark_formatting); // Force the next text insert to be on a new line.
upper_left_paragraph.InsertText("\n", false);
#endregion #region Company Slogan
// Create a custom property called company_slogan
CustomProperty company_slogan = new CustomProperty("company_slogan", "Company slogan goes here."); // Insert a field of type doc property (This will display the custom property 'company_slogan')
upper_left_paragraph.InsertDocProperty(company_slogan, f: light_formatting);
#endregion #region Company Logo
// Get the upper right Paragraph in the layout_table.
Paragraph upper_right_paragraph = layout_table.Rows[].Cells[].Paragraphs[]; // Add a template logo image to this document.
RelativeDirectory rd = new RelativeDirectory(); // prepares the files for testing
rd.Up();
Image logo = document.AddImage(rd.Path + @"\images\logo_template.png"); // Insert this template logo into the upper right Paragraph.
upper_right_paragraph.InsertPicture(logo.CreatePicture()); upper_right_paragraph.Alignment = Alignment.right;
#endregion // Custom properties cannot contain newlines, so the company address must be split into 3 custom properties.
#region Hired Company Address
// Create a custom property called company_address_line_one
CustomProperty hired_company_address_line_one = new CustomProperty("hired_company_address_line_one", "Street Address,"); // Get the lower left Paragraph in the layout_table.
Paragraph lower_left_paragraph = layout_table.Rows[].Cells[].Paragraphs[];
lower_left_paragraph.InsertText("TO:\n", false, dark_formatting); // Insert a field of type doc property (This will display the custom property 'hired_company_address_line_one')
lower_left_paragraph.InsertDocProperty(hired_company_address_line_one, f: light_formatting); // Force the next text insert to be on a new line.
lower_left_paragraph.InsertText("\n", false); // Create a custom property called company_address_line_two
CustomProperty hired_company_address_line_two = new CustomProperty("hired_company_address_line_two", "City,"); // Insert a field of type doc property (This will display the custom property 'hired_company_address_line_two')
lower_left_paragraph.InsertDocProperty(hired_company_address_line_two, f: light_formatting); // Force the next text insert to be on a new line.
lower_left_paragraph.InsertText("\n", false); // Create a custom property called company_address_line_two
CustomProperty hired_company_address_line_three = new CustomProperty("hired_company_address_line_three", "Zip Code"); // Insert a field of type doc property (This will display the custom property 'hired_company_address_line_three')
lower_left_paragraph.InsertDocProperty(hired_company_address_line_three, f: light_formatting);
#endregion #region Date & Invoice number
// Get the lower right Paragraph from the layout table.
Paragraph lower_right_paragraph = layout_table.Rows[].Cells[].Paragraphs[]; CustomProperty invoice_date = new CustomProperty("invoice_date", DateTime.Today.Date.ToString("d"));
lower_right_paragraph.InsertText("Date: ", false, dark_formatting);
lower_right_paragraph.InsertDocProperty(invoice_date, f: light_formatting); CustomProperty invoice_number = new CustomProperty("invoice_number", );
lower_right_paragraph.InsertText("\nInvoice: ", false, dark_formatting);
lower_right_paragraph.InsertText("#", false, light_formatting);
lower_right_paragraph.InsertDocProperty(invoice_number, f: light_formatting); lower_right_paragraph.Alignment = Alignment.right;
#endregion // Insert an empty Paragraph between two Tables, so that they do not touch.
document.InsertParagraph(string.Empty, false); // This table will hold all of the invoice data.
Table invoice_table = document.InsertTable(, );
invoice_table.Design = TableDesign.LightShadingAccent1;
invoice_table.Alignment = Alignment.center; // A nice thank you Paragraph.
Paragraph thankyou = document.InsertParagraph("\nThank you for your business, we hope to work with you again soon.", false, dark_formatting);
thankyou.Alignment = Alignment.center; #region Hired company details
CustomProperty hired_company_details_line_one = new CustomProperty("hired_company_details_line_one", "Street Address, City, ZIP Code");
CustomProperty hired_company_details_line_two = new CustomProperty("hired_company_details_line_two", "Phone: 000-000-0000, Fax: 000-000-0000, e-mail: support@companyname.com"); Paragraph companyDetails = document.InsertParagraph(string.Empty, false);
companyDetails.InsertDocProperty(hired_company_details_line_one, f: light_formatting);
companyDetails.InsertText("\n", false);
companyDetails.InsertDocProperty(hired_company_details_line_two, f: light_formatting);
companyDetails.Alignment = Alignment.center;
#endregion // Return the document now that it has been created.
return document;
}

DocX开源WORD操作组件的学习系列四的更多相关文章

  1. DocX开源WORD操作组件的学习系列三

    DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...

  2. DocX开源WORD操作组件的学习系列二

    DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...

  3. DocX开源WORD操作组件的学习系列一

    DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...

  4. 开源word操作组件DocX的记录

    开源word操作组件DocX的记录 使用开源word操作组件DocX的记录 1.DocX简介 1.1 简介 DocX是一个在不需要安装word的情况下对word进行操作的开源轻量级.net组件,是由爱 ...

  5. 使用开源word操作组件DocX的记录

    1.DocX简介 1.1 简介 DocX是一个在不需要安装word的情况下对word进行操作的开源轻量级.net组件,是由爱尔兰的一个叫Cathal Coffey的博士生开发出来的.DocX使得操作w ...

  6. 开源Word读写组件DocX 的深入研究和问题总结

    一. 前言 前两天看到了asxinyu大神的[原创]开源Word读写组件DocX介绍与入门,正好我也有类似的自动生成word文档得需求,于是便仔细的研究了这个DocX. 我也把它融入到我的项目当中并进 ...

  7. [.NET] 开头不讲"Hello Word",读尽诗书也枉然 : Word 操作组件介绍 - Spire.Doc

    开头不讲"Hello Word",读尽诗书也枉然 : Word 操作组件介绍 - Spire.Doc [博主]反骨仔 [原文地址]http://www.cnblogs.com/li ...

  8. 开源RabbitMQ操作组件

    开源RabbitMQ操作组件 对于目前大多的.NET项目,其实使用的技术栈都是差不多,估计现在很少用控件开发项目的了,毕竟一大堆问题.对.NET的项目,目前比较适合的架构ASP.NET MVC,ASP ...

  9. scrapy爬虫学习系列四:portia的学习入门

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

随机推荐

  1. SpringBoot加Poi仿照EasyPoi实现Excel导出

    POI提供API给Java程序对Microsoft Office格式档案读和写的功能,详细功能可以直接查阅API,因为使用EasyPoi过程中总是缺少依赖,没有搞明白到底是什么坑,索性自己写一个简单工 ...

  2. BZOJ 4455

    树的点到图的点是双射 枚举哪些点可以映射到 然后dp容斥 复杂度 $2^n*n^3$ #include<bits/stdc++.h> using namespace std; #defin ...

  3. MicroSoft CryptoAPI data/file encrypt/decrypt

    linux 用第三方库 Crypto++, 还未实战. CryptoAPI使用两种密钥:会话密钥与公共/私人密钥对.会话密钥使用相同的加密和解密密钥,这种算法较快,但必须保证密钥的安全传递.公共/私人 ...

  4. java内存结构

    Java的内存结构 JVM的内存结构主要有三大块:堆.方法区和栈.堆内存是JVM中最大的一块,由年轻代和老年代组成,而年轻代内存又被分为三部分,Eden空间.FromSurvivor空间和ToSurv ...

  5. 《JavaScript高级程序设计(第3版)》阅读总结记录第二章之在HTML中使用JavaScript

    本章目录: 2.1 <script> 元素 2.1.1 标签的位置 2.1.2 延迟脚本 2.1.3 异步脚本 2.1.4 在XHTML 中的用法 2.1.5 不推荐使用的语法 2.2 嵌 ...

  6. 请输入一个大于7的整数,输出小于k并且至少满足下面2个条件中的1个条件的所有正整数

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/6 22:06 * @description ...

  7. Ubuntu环境下配置darknet

    本教程基于Linux物理机进行相关配置,要求物理机中包含N卡且Capbility>=3.0,小于3.0(Fermi架构)只允许配置cuda,不能配置使用Cudnn: 本教程分为: 1.安装NVI ...

  8. DCOS实践分享(6):基于DCOS的大数据应用分享

    Open DC/OS大中华区官方发布会在京隆重召开   DCOS领域诞生了一个100%开源的企业级Datacenter Operating System版本,即DC/OS.Linker Network ...

  9. LVM学习笔记

    LVM Logical Volume Manager Volume management creates a layer of abstraction over physical storage, a ...

  10. MongoDB 复制机制

    一.复制原理 MongoDB的复制功能是使用操作日志oplog实现的,oplog包含主节点(Master)的每一次写操作,oplog是local本地数据库中的一个数据集合,其它非主节点(Seconda ...