PageRenderTime 55ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/SpLocalizer.ContentSourceProvider/SpDocumentLibraryFile/ExcelFileLocalizationTask.cs

#
C# | 215 lines | 132 code | 52 blank | 31 comment | 15 complexity | 9a85d1e0e33d0e77ba31f5f98704c357 MD5 | raw file
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text;
  7. using SpLocalizer.Common;
  8. using Microsoft.SharePoint;
  9. using System.Xml;
  10. using Microsoft.Practices.Unity;
  11. using DocumentFormat.OpenXml.Packaging;
  12. using DocumentFormat.OpenXml.Validation;
  13. using DocumentFormat.OpenXml.Spreadsheet;
  14. namespace SpLocalizer.ContentSourceProviders.SpDocumentLibraryFile
  15. {
  16. internal class ExcelFileLocalizationTask: AbstractFileLocalizationTask
  17. {
  18. /// <summary>
  19. /// Constructor without parameters should be public for unity injection
  20. /// </summary>
  21. public ExcelFileLocalizationTask () { }
  22. private const string SlideXmlElementName = "Part";
  23. protected override string GetDocumentXmlToTranslate(SPListItem item)
  24. {
  25. // Open a PresentationDocument for read-only access based on a stream.
  26. using (SpreadsheetDocument excelDocument = SpreadsheetDocument.Open(item.File.OpenBinaryStream(), false))
  27. {
  28. XmlDocument XmlDoc = new XmlDocument();
  29. XmlDoc.LoadXml(@"<CustomExcelDocument></CustomExcelDocument>");
  30. XmlNode Xnode = XmlDoc.CreateNode(XmlNodeType.Element, "strings", "");
  31. Xnode.InnerXml = excelDocument.WorkbookPart.SharedStringTablePart.SharedStringTable.InnerXml;
  32. XmlDoc.DocumentElement.AppendChild(Xnode);
  33. foreach (WorksheetPart part in excelDocument.WorkbookPart.WorksheetParts)
  34. {
  35. if (part.DrawingsPart != null)
  36. {
  37. foreach (ChartPart partx in part.DrawingsPart.ChartParts)
  38. {
  39. Xnode = XmlDoc.CreateNode(XmlNodeType.Element, "charts", "");
  40. Xnode.InnerXml = partx.ChartSpace.InnerXml;
  41. XmlDoc.DocumentElement.AppendChild(Xnode);
  42. }
  43. }
  44. /* if (part.PivotTableParts != null)
  45. {
  46. foreach (PivotTablePart partx in part.PivotTableParts)
  47. {
  48. Xnode = XmlDoc.CreateNode(XmlNodeType.Element, "pivottables", "");
  49. Xnode.InnerXml = partx.PivotTableDefinition.InnerXml;
  50. XmlDoc.DocumentElement.AppendChild(Xnode);
  51. }
  52. } */
  53. if (part.TableDefinitionParts != null)
  54. {
  55. foreach (TableDefinitionPart partx in part.TableDefinitionParts)
  56. {
  57. Xnode = XmlDoc.CreateNode(XmlNodeType.Element, "tables", "");
  58. Xnode.InnerXml = partx.Table.InnerXml;
  59. XmlDoc.DocumentElement.AppendChild(Xnode);
  60. }
  61. }
  62. }
  63. //
  64. Sheets sheet = excelDocument.WorkbookPart.Workbook.Sheets;
  65. foreach (Sheet sheett in sheet)
  66. {
  67. OpenXmlPart mypart = excelDocument.WorkbookPart.GetPartById(sheett.Id);
  68. if (Convert.ToString(mypart.Uri).IndexOf("/xl/worksheets") != -1)
  69. {
  70. WorksheetPart worksheetPart = (WorksheetPart)excelDocument.WorkbookPart.GetPartById(sheett.Id);
  71. Worksheet worksheet = worksheetPart.Worksheet;
  72. //sheett.InnerXml
  73. Xnode = XmlDoc.CreateNode(XmlNodeType.Element, "sheets", "");
  74. Xnode.InnerXml = worksheet.InnerXml;
  75. XmlDoc.DocumentElement.AppendChild(Xnode);
  76. }
  77. }
  78. //
  79. if (XmlDoc.DocumentElement.ChildNodes.Count == 0)
  80. return null;
  81. using (StringWriter sw = new StringWriter()){
  82. using(XmlTextWriter xtw = new XmlTextWriter(sw)){
  83. XmlDoc.WriteContentTo(xtw);
  84. xtw.Flush();
  85. sw.Flush();
  86. return sw.ToString();
  87. }
  88. }
  89. }
  90. }
  91. internal override void ExportTranslation(SPListItem item)
  92. {
  93. if (!Constants.FILE_EXCEL.Equals(this.Format))
  94. {
  95. throw new ApplicationException(String.Format("Illegal format {0} for export with {1}. {2} Required",
  96. this.Format, typeof(ExcelFileLocalizationTask).Name, Constants.FILE_EXCEL));
  97. }
  98. SPFile theFile = item.File;
  99. // Open a WordprocessingDocument for read-only access based on a stream.
  100. Stream documentStream = theFile.OpenBinaryStream();
  101. using (SpreadsheetDocument xlsxDocument = SpreadsheetDocument.Open(documentStream, true))
  102. {
  103. XmlDocument XmlDoc = new XmlDocument();
  104. XmlDoc.LoadXml(this.TranslatedText);
  105. int i = 0;
  106. //
  107. XmlNode Xnode = XmlDoc.SelectNodes("//*[local-name()='strings']").Item(0);
  108. xlsxDocument.WorkbookPart.SharedStringTablePart.SharedStringTable.InnerXml = Xnode.InnerXml;
  109. foreach (WorksheetPart part in xlsxDocument.WorkbookPart.WorksheetParts)
  110. {
  111. if (part.DrawingsPart != null)
  112. {
  113. i = 0;
  114. foreach (ChartPart partx in part.DrawingsPart.ChartParts)
  115. {
  116. Xnode = XmlDoc.SelectNodes("//*[local-name()='charts']").Item(i);
  117. partx.ChartSpace.InnerXml = Xnode.InnerXml;
  118. i++;
  119. }
  120. }
  121. /* if (part.PivotTableParts != null)
  122. {
  123. i = 0;
  124. foreach (PivotTablePart partx in part.PivotTableParts)
  125. {
  126. Xnode = XmlDoc.SelectNodes("//*[local-name()='pivottables']").Item(i);
  127. partx.PivotTableDefinition.InnerXml = Xnode.InnerXml;
  128. i++;
  129. }
  130. }*/
  131. if (part.TableDefinitionParts != null)
  132. {
  133. i = 0;
  134. foreach (TableDefinitionPart partx in part.TableDefinitionParts)
  135. {
  136. Xnode = XmlDoc.SelectNodes("//*[local-name()='tables']").Item(i);
  137. partx.Table.InnerXml = Xnode.InnerXml;
  138. i++;
  139. }
  140. }
  141. }
  142. //
  143. i = 0;
  144. foreach (Sheet sheett in xlsxDocument.WorkbookPart.Workbook.Sheets)
  145. {
  146. OpenXmlPart mypart = xlsxDocument.WorkbookPart.GetPartById(sheett.Id);
  147. if (Convert.ToString(mypart.Uri).IndexOf("/xl/worksheets") != -1)
  148. {
  149. WorksheetPart worksheetPart = (WorksheetPart)xlsxDocument.WorkbookPart.GetPartById(sheett.Id);
  150. Worksheet worksheet = worksheetPart.Worksheet;
  151. Xnode = XmlDoc.SelectNodes("//*[local-name()='sheets']").Item(i);
  152. worksheet.InnerXml = Xnode.InnerXml;
  153. i++;
  154. }
  155. }
  156. //
  157. //
  158. xlsxDocument.Close();
  159. SafeFile(theFile, documentStream);
  160. }
  161. }
  162. }
  163. }