-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathExcelExporter.cs
106 lines (88 loc) · 4.06 KB
/
ExcelExporter.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
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Linq;
using System.Text;
namespace GenericUtils.Data {
//change from github
public class ExcelExporter:DataImporter {
private static object lockObject = new object();
private static string exportLocation;
private string tableName;
public string TableName {
get { return tableName; }
set { tableName = value; }
}
private string emptyExcelFile;
public string EmptyExcelFile {
get { return emptyExcelFile; }
set { emptyExcelFile = value; }
}
public static string ExportLocation {
get { return exportLocation; }
set { exportLocation = value; }
}
private string CreateEmptyExcelFile(string filename) {
lock (lockObject) {
System.IO.File.Copy(ExportLocation + "/" + EmptyExcelFile, ExportLocation + "/" + filename);
}
return ExportLocation + "/" + filename;
}
public void WriteDataTableToNewFile(string filename, DataTable dt) {
string fullFilePath = CreateEmptyExcelFile(filename);
WriteDataTableAsSheet(GetOleToExcelConnectionString(fullFilePath), dt);
}
private void WriteDataTableAsSheet(string connectionString, DataTable dt) {
using (OleDbConnection conn = new OleDbConnection(connectionString)) {
conn.Open();
using (OleDbCommand cmd = conn.CreateCommand()) {
cmd.CommandText = BuildCreateSheetTabStatement(dt);
cmd.ExecuteNonQuery();
}
foreach (DataRow dr in dt.Rows) {
using (OleDbCommand cmd = conn.CreateCommand()) {
cmd.CommandText = BuildInsertStatement(dr);
cmd.ExecuteNonQuery();
}
}
}
}
private string BuildInsertStatement(DataRow dr) {
string insertStatement = "Insert INTO [" + tableName + "$]";
StringBuilder insertColumns = new StringBuilder();
StringBuilder insertValues = new StringBuilder();
int colCount = dr.Table.Columns.Count;
if (colCount > 0) {
insertColumns.Append(" ([" + CleanStringForODBC(dr.Table.Columns[0].ColumnName));
insertValues.Append(" Values ('" + CleanStringForODBC(dr.GetStringFromDataRow(dr.Table.Columns[0].ColumnName, "")));
for (int currCol = 1; currCol < colCount; currCol++) {
insertColumns.Append("],[" + CleanStringForODBC(dr.Table.Columns[currCol].ColumnName));
insertValues.Append("','" + CleanStringForODBC(dr.GetStringFromDataRow(dr.Table.Columns[currCol].ColumnName, "")));
}
insertColumns.Append("])");
insertValues.Append("')");
}
return insertStatement + insertColumns.ToString() + insertValues.ToString();
}
private static string CleanStringForODBC(string input) {
if (input.Contains("'")) {
return input.Replace("'", "''");
}
return input;
}
private static string BuildCreateSheetTabStatement(DataTable dt) {
StringBuilder createStatement = new StringBuilder(string.Format("CREATE TABLE [{0}] ", dt.TableName));
int colCount = dt.Columns.Count;
if (colCount > 0) {
createStatement.Append(string.Format("([{0}] TEXT", dt.Columns[0].ColumnName));
for (int currCol = 1; currCol < colCount; currCol++) {
createStatement.Append(string.Format(", [{0}] TEXT", dt.Columns[currCol].ColumnName));
}
createStatement.Append(")");
}
return createStatement.ToString();
}
}
}