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

_BaseClasses.cs 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  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. else
  99. {
  100. 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
  101. return p;
  102. }
  103. }
  104. public virtual Paragraph InsertParagraphBeforeSelf(string text)
  105. {
  106. return InsertParagraphBeforeSelf(text, false, new Formatting());
  107. }
  108. public virtual Paragraph InsertParagraphAfterSelf(string text)
  109. {
  110. return InsertParagraphAfterSelf(text, false, new Formatting());
  111. }
  112. public virtual Paragraph InsertParagraphBeforeSelf(string text, bool trackChanges)
  113. {
  114. return InsertParagraphBeforeSelf(text, trackChanges, new Formatting());
  115. }
  116. public virtual Paragraph InsertParagraphAfterSelf(string text, bool trackChanges)
  117. {
  118. return InsertParagraphAfterSelf(text, trackChanges, new Formatting());
  119. }
  120. public virtual Paragraph InsertParagraphBeforeSelf(string text, bool trackChanges, Formatting formatting)
  121. {
  122. XElement newParagraph = new XElement
  123. (
  124. XName.Get("p", DocX.w.NamespaceName), new XElement(XName.Get("pPr", DocX.w.NamespaceName)), HelperFunctions.FormatInput(text, formatting.Xml)
  125. );
  126. if (trackChanges)
  127. newParagraph = Paragraph.CreateEdit(EditType.ins, DateTime.Now, newParagraph);
  128. Xml.AddBeforeSelf(newParagraph);
  129. XElement newlyInserted = Xml.ElementsBeforeSelf().Last();
  130. Paragraph p = new Paragraph(Document, newlyInserted, -1);
  131. return p;
  132. }
  133. public virtual Paragraph InsertParagraphAfterSelf(string text, bool trackChanges, Formatting formatting)
  134. {
  135. XElement newParagraph = new XElement
  136. (
  137. XName.Get("p", DocX.w.NamespaceName), new XElement(XName.Get("pPr", DocX.w.NamespaceName)), HelperFunctions.FormatInput(text, formatting.Xml)
  138. );
  139. if (trackChanges)
  140. newParagraph = Paragraph.CreateEdit(EditType.ins, DateTime.Now, newParagraph);
  141. Xml.AddAfterSelf(newParagraph);
  142. XElement newlyInserted = Xml.ElementsAfterSelf().First();
  143. Paragraph p = new Paragraph(Document, newlyInserted, -1);
  144. return p;
  145. }
  146. public virtual Table InsertTableAfterSelf(int rowCount, int columnCount)
  147. {
  148. XElement newTable = HelperFunctions.CreateTable(rowCount, columnCount);
  149. Xml.AddAfterSelf(newTable);
  150. XElement newlyInserted = Xml.ElementsAfterSelf().First();
  151. return new Table(Document, newlyInserted) { mainPart = mainPart };
  152. }
  153. public virtual Table InsertTableAfterSelf(Table t)
  154. {
  155. Xml.AddAfterSelf(t.Xml);
  156. XElement newlyInserted = Xml.ElementsAfterSelf().First();
  157. //Dmitchern
  158. return new Table(Document, newlyInserted) { mainPart = mainPart }; //return new table, dont affect parameter table
  159. //t.Xml = newlyInserted;
  160. //return t;
  161. }
  162. public virtual Table InsertTableBeforeSelf(int rowCount, int columnCount)
  163. {
  164. XElement newTable = HelperFunctions.CreateTable(rowCount, columnCount);
  165. Xml.AddBeforeSelf(newTable);
  166. XElement newlyInserted = Xml.ElementsBeforeSelf().Last();
  167. return new Table(Document, newlyInserted) { mainPart = mainPart };
  168. }
  169. public virtual Table InsertTableBeforeSelf(Table t)
  170. {
  171. Xml.AddBeforeSelf(t.Xml);
  172. XElement newlyInserted = Xml.ElementsBeforeSelf().Last();
  173. //Dmitchern
  174. return new Table(Document, newlyInserted) { mainPart=mainPart}; //return new table, dont affect parameter table
  175. //t.Xml = newlyInserted;
  176. //return t;
  177. }
  178. }
  179. public static class XmlTemplateBases
  180. {
  181. #region TocXml
  182. public const string TocXmlBase = @"<w:sdt xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'>
  183. <w:sdtPr>
  184. <w:docPartObj>
  185. <w:docPartGallery w:val='Table of Contents'/>
  186. <w:docPartUnique/>
  187. </w:docPartObj>\
  188. </w:sdtPr>
  189. <w:sdtEndPr>
  190. <w:rPr>
  191. <w:rFonts w:asciiTheme='minorHAnsi' w:cstheme='minorBidi' w:eastAsiaTheme='minorHAnsi' w:hAnsiTheme='minorHAnsi'/>
  192. <w:color w:val='auto'/>
  193. <w:sz w:val='22'/>
  194. <w:szCs w:val='22'/>
  195. <w:lang w:eastAsia='en-US'/>
  196. </w:rPr>
  197. </w:sdtEndPr>
  198. <w:sdtContent>
  199. <w:p>
  200. <w:pPr>
  201. <w:pStyle w:val='{0}'/>
  202. </w:pPr>
  203. <w:r>
  204. <w:t>{1}</w:t>
  205. </w:r>
  206. </w:p>
  207. <w:p>
  208. <w:pPr>
  209. <w:pStyle w:val='TOC1'/>
  210. <w:tabs>
  211. <w:tab w:val='right' w:leader='dot' w:pos='{2}'/>
  212. </w:tabs>
  213. <w:rPr>
  214. <w:noProof/>
  215. </w:rPr>
  216. </w:pPr>
  217. <w:r>
  218. <w:fldChar w:fldCharType='begin' w:dirty='true'/>
  219. </w:r>
  220. <w:r>
  221. <w:instrText xml:space='preserve'> {3} </w:instrText>
  222. </w:r>
  223. <w:r>
  224. <w:fldChar w:fldCharType='separate'/>
  225. </w:r>
  226. </w:p>
  227. <w:p>
  228. <w:r>
  229. <w:rPr>
  230. <w:b/>
  231. <w:bCs/>
  232. <w:noProof/>
  233. </w:rPr>
  234. <w:fldChar w:fldCharType='end'/>
  235. </w:r>
  236. </w:p>
  237. </w:sdtContent>
  238. </w:sdt>
  239. ";
  240. public const string TocHeadingStyleBase = @"<w:style w:type='paragraph' w:styleId='{0}' xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'>
  241. <w:name w:val='TOC Heading'/>
  242. <w:basedOn w:val='Heading1'/>
  243. <w:next w:val='Normal'/>
  244. <w:uiPriority w:val='39'/>
  245. <w:semiHidden/>
  246. <w:unhideWhenUsed/>
  247. <w:qFormat/>
  248. <w:rsid w:val='00E67AA6'/>
  249. <w:pPr>
  250. <w:outlineLvl w:val='9'/>
  251. </w:pPr>
  252. <w:rPr>
  253. <w:lang w:eastAsia='nb-NO'/>
  254. </w:rPr>
  255. </w:style>
  256. ";
  257. public const string TocElementStyleBase = @" <w:style w:type='paragraph' w:styleId='{0}' xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'>
  258. <w:name w:val='{1}' />
  259. <w:basedOn w:val='Normal' />
  260. <w:next w:val='Normal' />
  261. <w:autoRedefine />
  262. <w:uiPriority w:val='39' />
  263. <w:unhideWhenUsed />
  264. <w:pPr>
  265. <w:spacing w:after='100' />
  266. <w:ind w:left='440' />
  267. </w:pPr>
  268. </w:style>
  269. ";
  270. public const string TocHyperLinkStyleBase = @" <w:style w:type='character' w:styleId='Hyperlink' xmlns:w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'>
  271. <w:name w:val='Hyperlink' />
  272. <w:basedOn w:val='Normal' />
  273. <w:uiPriority w:val='99' />
  274. <w:unhideWhenUsed />
  275. <w:rPr>
  276. <w:color w:val='0000FF' w:themeColor='hyperlink' />
  277. <w:u w:val='single' />
  278. </w:rPr>
  279. </w:style>
  280. ";
  281. #endregion
  282. }
  283. }