-
Notifications
You must be signed in to change notification settings - Fork 8
/
Utils.cs
119 lines (99 loc) · 5.81 KB
/
Utils.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocumentFormat.OpenXml.Packaging;
namespace SQLtoExcel
{
class Utils
{
/// <summary>
/// Creates a Microsoft Excel Worksheet from the input DataSet, returning it as a MemoryStream.
/// </summary>
/// <param name="ds">DataSet of source data.</param>
/// <returns>MemoryStream</returns>
public static MemoryStream ExportDataSetToExcel(DataSet ds)
{
//Initial code source:
//https://accesspublic.wordpress.com/2014/02/22/c-export-dataset-to-excel-using-openxml/
MemoryStream stream = new MemoryStream();
using (var workbook = SpreadsheetDocument.Create(stream, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
{
var workbookPart = workbook.AddWorkbookPart();
workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets();
for (int tableIdx = 0; tableIdx < ds.Tables.Count; tableIdx++)
{
DataTable table = ds.Tables[tableIdx];
var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>();
var sheetData = new DocumentFormat.OpenXml.Spreadsheet.SheetData();
sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData);
DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>();
string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart);
DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet();
sheet.Id = relationshipId;
sheet.SheetId = (uint)(tableIdx + 1); //If set to zero, Excel will display an error when opening the spreadsheet file.
sheet.Name = table.TableName;
sheets.Append(sheet);
DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
List<String> columns = new List<string>();
foreach (System.Data.DataColumn column in table.Columns)
{
columns.Add(column.ColumnName);
DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName);
headerRow.AppendChild(cell);
}
//DocumentFormat.OpenXml.Spreadsheet.Pane p = new DocumentFormat.OpenXml.Spreadsheet.Pane()
//{
// VerticalSplit = 9D,
// TopLeftCell = "A2",
// ActivePane = DocumentFormat.OpenXml.Spreadsheet.PaneValues.BottomLeft,
// State = DocumentFormat.OpenXml.Spreadsheet.PaneStateValues.Frozen
//};
//sheetData.AppendChild(p);
sheetData.AppendChild(headerRow);
foreach (System.Data.DataRow dsrow in table.Rows)
{
DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
foreach (String col in columns)
{
DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
switch (Type.GetTypeCode(table.Columns[col].DataType))
{
case System.TypeCode.Int16:
case System.TypeCode.Int32:
case System.TypeCode.Int64:
case System.TypeCode.UInt16:
case System.TypeCode.UInt32:
case System.TypeCode.UInt64:
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.Number;
break;
case System.TypeCode.Decimal:
case System.TypeCode.Double:
case System.TypeCode.Single:
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.Number;
break;
case System.TypeCode.DateTime:
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.Date;
break;
default:
cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
break;
}
//cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); //
newRow.AppendChild(cell);
}
sheetData.AppendChild(newRow);
}
}
}
return stream;
}
}
}