123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.IO;
- using DocumentFormat.OpenXml;
- using DocumentFormat.OpenXml.Packaging;
- using DocumentFormat.OpenXml.Spreadsheet;
- namespace PRSDesktop
- {
- public sealed class OfficeOpenXML
- {
- private static Lazy<OfficeOpenXML> _instance = new Lazy<OfficeOpenXML>(() => new OfficeOpenXML());
- private OfficeOpenXML()
- {
- }
- public static OfficeOpenXML GetInstance()
- {
- return _instance.Value;
- }
- public MemoryStream GetExcelStream(DataSet ds, bool firstRowAsHeader = false)
- {
- if (ds == null || ds.Tables.Count == 0)
- {
- return null;
- }
- MemoryStream stream = new MemoryStream();
- using (var excel = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook))
- {
- //create doc and workbook
- WorkbookPart workbookPart = excel.AddWorkbookPart();
- Workbook workbook = new Workbook();
- Sheets sheets = new Sheets();
- //loop all tables in the dataset
- for (int iTable = 0; iTable < ds.Tables.Count; iTable++)
- {
- var table = ds.Tables[iTable];
- //create sheet part
- WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>();
- Worksheet worksheet = new Worksheet();
- SheetData data = new SheetData();
- List<Row> allRows = new List<Row>();
- //setting header of the sheet
- Row headerRow = new Row() { RowIndex = 1 };
- for (int iColumn = 0; iColumn < table.Columns.Count; iColumn++)
- {
- var col = table.Columns[iColumn];
- //if first row of table is not the header then set columns of table as header of sheet
- if (!firstRowAsHeader)
- {
- headerRow.Append(new Cell
- {
- DataType = CellValues.String,
- CellValue = new CellValue(col.ColumnName)
- });
- }
- else
- {
- headerRow.Append(new Cell
- {
- DataType = CellValues.String,
- CellValue = new CellValue(Convert.ToString(table.Rows[0][col]))
- });
- }
- }
- allRows.Add(headerRow);
- //setting other data rows
- if (table.Rows != null && table.Rows.Count != 0)
- {
- for (int iRow = firstRowAsHeader ? 1 : 0; iRow < table.Rows.Count; iRow++)
- {
- var row = table.Rows[iRow];
- Row valueRow = new Row { RowIndex = (uint)(iRow + (firstRowAsHeader ? 1 : 2)) };
- for (int iColumn = 0; iColumn < table.Columns.Count; iColumn++)
- {
- var col = table.Columns[iColumn];
- valueRow.Append(new Cell
- {
- DataType = Format(col.DataType),
- CellValue = new CellValue(Convert.ToString(row[col]))
- });
- }
- allRows.Add(valueRow);
- }
- }
- //add rows to the data
- data.Append(allRows);
- worksheet.Append(data);
- worksheetPart.Worksheet = worksheet;
- worksheetPart.Worksheet.Save();
- //add worksheet to main sheets
- sheets.Append(new Sheet
- {
- Name = string.IsNullOrWhiteSpace(table.TableName) ? "Sheet" + (iTable + 1) : table.TableName,
- Id = workbookPart.GetIdOfPart(worksheetPart),
- SheetId = (uint)iTable + 1
- });
- }//single table processing ends here
- //add created sheets to workbook
- workbook.Append(sheets);
- excel.WorkbookPart.Workbook = workbook;
- excel.WorkbookPart.Workbook.Save();
- //excel.Close();
- }
- stream.Seek(0, SeekOrigin.Begin);
- stream.Capacity = (int)stream.Length;
- return stream;
- }
- public MemoryStream GetExcelStream(DataTable dt, bool firstRowAsHeader = false)
- {
- DataSet ds = new DataSet();
- ds.Tables.Add(dt);
- return GetExcelStream(ds, firstRowAsHeader);
- }
- #region Excel Helpers
- CellValues Format(Type t)
- {
- switch (t.ToString())
- {
- case "System.String":
- return CellValues.String;
- case "System.DateTime":
- return CellValues.Date;
- case "System.Boolean":
- return CellValues.Boolean;
- case "System.Int16":
- return CellValues.Number;
- case "System.Int32":
- return CellValues.Number;
- case "System.Int64":
- return CellValues.Number;
- case "System.UInt16":
- return CellValues.Number;
- case "System.UInt32":
- return CellValues.Number;
- case "System.UInt64":
- return CellValues.Number;
- case "System.Decimal":
- return CellValues.Number;
- case "System.Double":
- return CellValues.Number;
- case "System.Single":
- return CellValues.Number;
- default:
- return CellValues.String;
- }
- }
- #endregion
- }
- }
|