OfficeOpenXML.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. using DocumentFormat.OpenXml.Packaging;
  2. using DocumentFormat.OpenXml.Spreadsheet;
  3. using DocumentFormat.OpenXml;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. namespace PRSLogikal.OpenXML
  12. {
  13. public sealed class OfficeOpenXML
  14. {
  15. private static Lazy<OfficeOpenXML> _instance = new Lazy<OfficeOpenXML>(() => new OfficeOpenXML());
  16. private OfficeOpenXML()
  17. {
  18. }
  19. public static OfficeOpenXML GetInstance()
  20. {
  21. return _instance.Value;
  22. }
  23. public MemoryStream GetExcelStream(DataSet ds, bool firstRowAsHeader = false)
  24. {
  25. if (ds == null || ds.Tables.Count == 0)
  26. {
  27. return null;
  28. }
  29. MemoryStream stream = new MemoryStream();
  30. using (var excel = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook))
  31. {
  32. //create doc and workbook
  33. WorkbookPart workbookPart = excel.AddWorkbookPart();
  34. Workbook workbook = new Workbook();
  35. Sheets sheets = new Sheets();
  36. //loop all tables in the dataset
  37. for (int iTable = 0; iTable < ds.Tables.Count; iTable++)
  38. {
  39. var table = ds.Tables[iTable];
  40. //create sheet part
  41. WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
  42. Worksheet worksheet = new Worksheet();
  43. SheetData data = new SheetData();
  44. List<Row> allRows = new List<Row>();
  45. //setting header of the sheet
  46. Row headerRow = new Row() { RowIndex = 1 };
  47. for (int iColumn = 0; iColumn < table.Columns.Count; iColumn++)
  48. {
  49. var col = table.Columns[iColumn];
  50. //if first row of table is not the header then set columns of table as header of sheet
  51. if (!firstRowAsHeader)
  52. {
  53. headerRow.Append(new Cell
  54. {
  55. DataType = CellValues.String,
  56. CellValue = new CellValue(col.ColumnName)
  57. });
  58. }
  59. else
  60. {
  61. headerRow.Append(new Cell
  62. {
  63. DataType = CellValues.String,
  64. CellValue = new CellValue(Convert.ToString(table.Rows[0][col]))
  65. });
  66. }
  67. }
  68. allRows.Add(headerRow);
  69. //setting other data rows
  70. if (table.Rows != null && table.Rows.Count != 0)
  71. {
  72. for (int iRow = firstRowAsHeader ? 1 : 0; iRow < table.Rows.Count; iRow++)
  73. {
  74. var row = table.Rows[iRow];
  75. Row valueRow = new Row { RowIndex = (uint)(iRow + (firstRowAsHeader ? 1 : 2)) };
  76. for (int iColumn = 0; iColumn < table.Columns.Count; iColumn++)
  77. {
  78. var col = table.Columns[iColumn];
  79. valueRow.Append(new Cell
  80. {
  81. DataType = Format(col.DataType),
  82. CellValue = new CellValue(Convert.ToString(row[col]))
  83. });
  84. }
  85. allRows.Add(valueRow);
  86. }
  87. }
  88. //add rows to the data
  89. data.Append(allRows);
  90. worksheet.Append(data);
  91. worksheetPart.Worksheet = worksheet;
  92. worksheetPart.Worksheet.Save();
  93. //add worksheet to main sheets
  94. sheets.Append(new Sheet
  95. {
  96. Name = string.IsNullOrWhiteSpace(table.TableName) ? "Sheet" + (iTable + 1) : table.TableName,
  97. Id = workbookPart.GetIdOfPart(worksheetPart),
  98. SheetId = (uint)iTable + 1
  99. });
  100. }//single table processing ends here
  101. //add created sheets to workbook
  102. workbook.Append(sheets);
  103. excel.WorkbookPart.Workbook = workbook;
  104. excel.WorkbookPart.Workbook.Save();
  105. //excel.Close();
  106. }
  107. stream.Seek(0, SeekOrigin.Begin);
  108. stream.Capacity = (int)stream.Length;
  109. return stream;
  110. }
  111. public MemoryStream GetExcelStream(DataTable dt, bool firstRowAsHeader = false)
  112. {
  113. DataSet ds = new DataSet();
  114. ds.Tables.Add(dt);
  115. return GetExcelStream(ds, firstRowAsHeader);
  116. }
  117. #region Excel Helpers
  118. CellValues Format(Type t)
  119. {
  120. switch (t.ToString())
  121. {
  122. case "System.String":
  123. return CellValues.String;
  124. case "System.DateTime":
  125. return CellValues.Date;
  126. case "System.Boolean":
  127. return CellValues.Boolean;
  128. case "System.Int16":
  129. return CellValues.Number;
  130. case "System.Int32":
  131. return CellValues.Number;
  132. case "System.Int64":
  133. return CellValues.Number;
  134. case "System.UInt16":
  135. return CellValues.Number;
  136. case "System.UInt32":
  137. return CellValues.Number;
  138. case "System.UInt64":
  139. return CellValues.Number;
  140. case "System.Decimal":
  141. return CellValues.Number;
  142. case "System.Double":
  143. return CellValues.Number;
  144. case "System.Single":
  145. return CellValues.Number;
  146. default:
  147. return CellValues.String;
  148. }
  149. }
  150. #endregion
  151. }
  152. }