OfficeOpenXML.cs 6.2 KB

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