Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

_BaseClasses.cs 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. using System;
  2. using System.IO.Packaging;
  3. using System.Linq;
  4. using System.Xml.Linq;
  5. namespace Novacode
  6. {
  7. /// <summary>
  8. /// All DocX types are derived from DocXElement.
  9. /// This class contains properties which every element of a DocX must contain.
  10. /// </summary>
  11. public abstract class DocXElement
  12. {
  13. internal PackagePart mainPart;
  14. public PackagePart PackagePart { get { return mainPart; } set { mainPart = value; } }
  15. /// <summary>
  16. /// This is the actual Xml that gives this element substance.
  17. /// For example, a Paragraphs Xml might look something like the following
  18. /// <p>
  19. /// <r>
  20. /// <t>Hello World!</t>
  21. /// </r>
  22. /// </p>
  23. /// </summary>
  24. public XElement Xml { get; set; }
  25. /// <summary>
  26. /// This is a reference to the DocX object that this element belongs to.
  27. /// Every DocX element is connected to a document.
  28. /// </summary>
  29. internal DocX Document { get; set; }
  30. /// <summary>
  31. /// Store both the document and xml so that they can be accessed by derived types.
  32. /// </summary>
  33. /// <param name="document">The document that this element belongs to.</param>
  34. /// <param name="xml">The Xml that gives this element substance</param>
  35. public DocXElement(DocX document, XElement xml)
  36. {
  37. this.Document = document;
  38. this.Xml = xml;
  39. }
  40. }
  41. /// <summary>
  42. /// This class provides functions for inserting new DocXElements before or after the current DocXElement.
  43. /// Only certain DocXElements can support these functions without creating invalid documents, at the moment these are Paragraphs and Table.
  44. /// </summary>
  45. public abstract class InsertBeforeOrAfter : DocXElement
  46. {
  47. public InsertBeforeOrAfter(DocX document, XElement xml) : base(document, xml) { }
  48. public virtual void InsertPageBreakBeforeSelf()
  49. {
  50. XElement p = new XElement
  51. (
  52. XName.Get("p", DocX.w.NamespaceName),
  53. new XElement
  54. (
  55. XName.Get("r", DocX.w.NamespaceName),
  56. new XElement
  57. (
  58. XName.Get("br", DocX.w.NamespaceName),
  59. new XAttribute(XName.Get("type", DocX.w.NamespaceName), "page")
  60. )
  61. )
  62. );
  63. Xml.AddBeforeSelf(p);
  64. }
  65. public virtual void InsertPageBreakAfterSelf()
  66. {
  67. XElement p = new XElement
  68. (
  69. XName.Get("p", DocX.w.NamespaceName),
  70. new XElement
  71. (
  72. XName.Get("r", DocX.w.NamespaceName),
  73. new XElement
  74. (
  75. XName.Get("br", DocX.w.NamespaceName),
  76. new XAttribute(XName.Get("type", DocX.w.NamespaceName), "page")
  77. )
  78. )
  79. );
  80. Xml.AddAfterSelf(p);
  81. }
  82. public virtual Paragraph InsertParagraphBeforeSelf(Paragraph p)
  83. {
  84. Xml.AddBeforeSelf(p.Xml);
  85. XElement newlyInserted = Xml.ElementsBeforeSelf().First();
  86. p.Xml = newlyInserted;
  87. return p;
  88. }
  89. public virtual Paragraph InsertParagraphAfterSelf(Paragraph p)
  90. {
  91. Xml.AddAfterSelf(p.Xml);
  92. XElement newlyInserted = Xml.ElementsAfterSelf().First();
  93. //Dmitchern
  94. if (this as Paragraph != null)
  95. {
  96. return new Paragraph(Document, newlyInserted, (this as Paragraph).endIndex);
  97. }
  98. p.Xml = newlyInserted; //IMPORTANT: I think we have return new paragraph in any case, but I dont know what to put as startIndex parameter into Paragraph constructor
  99. return p;
  100. }
  101. public virtual Paragraph InsertParagraphBeforeSelf(string text)
  102. {
  103. return InsertParagraphBeforeSelf(text, false, new Formatting());
  104. }
  105. public virtual Paragraph InsertParagraphAfterSelf(string text)
  106. {
  107. return InsertParagraphAfterSelf(text, false, new Formatting());
  108. }
  109. public virtual Paragraph InsertParagraphBeforeSelf(string text, bool trackChanges)
  110. {
  111. return InsertParagraphBeforeSelf(text, trackChanges, new Formatting());
  112. }
  113. public virtual Paragraph InsertParagraphAfterSelf(string text, bool trackChanges)
  114. {
  115. return InsertParagraphAfterSelf(text, trackChanges, new Formatting());
  116. }
  117. public virtual Paragraph InsertParagraphBeforeSelf(string text, bool trackChanges, Formatting formatting)
  118. {
  119. XElement newParagraph = new XElement
  120. (
  121. XName.Get("p", DocX.w.NamespaceName), new XElement(XName.Get("pPr", DocX.w.NamespaceName)), HelperFunctions.FormatInput(text, formatting.Xml)
  122. );
  123. if (trackChanges)
  124. newParagraph = Paragraph.CreateEdit(EditType.ins, DateTime.Now, newParagraph);
  125. Xml.AddBeforeSelf(newParagraph);
  126. XElement newlyInserted = Xml.ElementsBeforeSelf().Last();
  127. return new Paragraph(Document, newlyInserted, -1);
  128. }
  129. public virtual Paragraph InsertParagraphAfterSelf(string text, bool trackChanges, Formatting formatting)
  130. {
  131. XElement newParagraph = new XElement
  132. (
  133. XName.Get("p", DocX.w.NamespaceName), new XElement(XName.Get("pPr", DocX.w.NamespaceName)), HelperFunctions.FormatInput(text, formatting.Xml)
  134. );
  135. if (trackChanges)
  136. newParagraph = Paragraph.CreateEdit(EditType.ins, DateTime.Now, newParagraph);
  137. Xml.AddAfterSelf(newParagraph);
  138. XElement newlyInserted = Xml.ElementsAfterSelf().First();
  139. Paragraph p = new Paragraph(Document, newlyInserted, -1);
  140. return p;
  141. }
  142. public virtual Table InsertTableAfterSelf(int rowCount, int columnCount)
  143. {
  144. XElement newTable = HelperFunctions.CreateTable(rowCount, columnCount);
  145. Xml.AddAfterSelf(newTable);
  146. XElement newlyInserted = Xml.ElementsAfterSelf().First();
  147. return new Table(Document, newlyInserted) { mainPart = mainPart };
  148. }
  149. public virtual Table InsertTableAfterSelf(Table t)
  150. {
  151. Xml.AddAfterSelf(t.Xml);
  152. XElement newlyInserted = Xml.ElementsAfterSelf().First();
  153. //Dmitchern
  154. return new Table(Document, newlyInserted) { mainPart = mainPart }; //return new table, dont affect parameter table
  155. }
  156. public virtual Table InsertTableBeforeSelf(int rowCount, int columnCount)
  157. {
  158. XElement newTable = HelperFunctions.CreateTable(rowCount, columnCount);
  159. Xml.AddBeforeSelf(newTable);
  160. XElement newlyInserted = Xml.ElementsBeforeSelf().Last();
  161. return new Table(Document, newlyInserted) { mainPart = mainPart };
  162. }
  163. public virtual Table InsertTableBeforeSelf(Table t)
  164. {
  165. Xml.AddBeforeSelf(t.Xml);
  166. XElement newlyInserted = Xml.ElementsBeforeSelf().Last();
  167. //Dmitchern
  168. return new Table(Document, newlyInserted) { mainPart=mainPart}; //return new table, dont affect parameter table
  169. }
  170. }
  171. public static class XmlTemplateBases
  172. {
  173. #region TocXml
  174. public const string TocXmlBase = @"<w:sdt xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'>
  175. <w:sdtPr>
  176. <w:docPartObj>
  177. <w:docPartGallery w:val='Table of Contents'/>
  178. <w:docPartUnique/>
  179. </w:docPartObj>\
  180. </w:sdtPr>
  181. <w:sdtEndPr>
  182. <w:rPr>
  183. <w:rFonts w:asciiTheme='minorHAnsi' w:cstheme='minorBidi' w:eastAsiaTheme='minorHAnsi' w:hAnsiTheme='minorHAnsi'/>
  184. <w:color w:val='auto'/>
  185. <w:sz w:val='22'/>
  186. <w:szCs w:val='22'/>
  187. <w:lang w:eastAsia='en-US'/>
  188. </w:rPr>
  189. </w:sdtEndPr>
  190. <w:sdtContent>
  191. <w:p>
  192. <w:pPr>
  193. <w:pStyle w:val='{0}'/>
  194. </w:pPr>
  195. <w:r>
  196. <w:t>{1}</w:t>
  197. </w:r>
  198. </w:p>
  199. <w:p>
  200. <w:pPr>
  201. <w:pStyle w:val='TOC1'/>
  202. <w:tabs>
  203. <w:tab w:val='right' w:leader='dot' w:pos='{2}'/>
  204. </w:tabs>
  205. <w:rPr>
  206. <w:noProof/>
  207. </w:rPr>
  208. </w:pPr>
  209. <w:r>
  210. <w:fldChar w:fldCharType='begin' w:dirty='true'/>
  211. </w:r>
  212. <w:r>
  213. <w:instrText xml:space='preserve'> {3} </w:instrText>
  214. </w:r>
  215. <w:r>
  216. <w:fldChar w:fldCharType='separate'/>
  217. </w:r>
  218. </w:p>
  219. <w:p>
  220. <w:r>
  221. <w:rPr>
  222. <w:b/>
  223. <w:bCs/>
  224. <w:noProof/>
  225. </w:rPr>
  226. <w:fldChar w:fldCharType='end'/>
  227. </w:r>
  228. </w:p>
  229. </w:sdtContent>
  230. </w:sdt>
  231. ";
  232. public const string TocHeadingStyleBase = @"<w:style w:type='paragraph' w:styleId='{0}' xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'>
  233. <w:name w:val='TOC Heading'/>
  234. <w:basedOn w:val='Heading1'/>
  235. <w:next w:val='Normal'/>
  236. <w:uiPriority w:val='39'/>
  237. <w:semiHidden/>
  238. <w:unhideWhenUsed/>
  239. <w:qFormat/>
  240. <w:rsid w:val='00E67AA6'/>
  241. <w:pPr>
  242. <w:outlineLvl w:val='9'/>
  243. </w:pPr>
  244. <w:rPr>
  245. <w:lang w:eastAsia='nb-NO'/>
  246. </w:rPr>
  247. </w:style>
  248. ";
  249. public const string TocElementStyleBase = @" <w:style w:type='paragraph' w:styleId='{0}' xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'>
  250. <w:name w:val='{1}' />
  251. <w:basedOn w:val='Normal' />
  252. <w:next w:val='Normal' />
  253. <w:autoRedefine />
  254. <w:uiPriority w:val='39' />
  255. <w:unhideWhenUsed />
  256. <w:pPr>
  257. <w:spacing w:after='100' />
  258. <w:ind w:left='440' />
  259. </w:pPr>
  260. </w:style>
  261. ";
  262. public const string TocHyperLinkStyleBase = @" <w:style w:type='character' w:styleId='Hyperlink' xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'>
  263. <w:name w:val='Hyperlink' />
  264. <w:basedOn w:val='Normal' />
  265. <w:uiPriority w:val='99' />
  266. <w:unhideWhenUsed />
  267. <w:rPr>
  268. <w:color w:val='0000FF' w:themeColor='hyperlink' />
  269. <w:u w:val='single' />
  270. </w:rPr>
  271. </w:style>
  272. ";
  273. #endregion
  274. }
  275. }