forked from neil3d/excel2json
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathJsonExporter.cs
139 lines (119 loc) · 4.89 KB
/
JsonExporter.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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
using System;
using System.IO;
using System.Data;
using System.Text;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace excel2json {
/// <summary>
/// 将DataTable对象,转换成JSON string,并保存到文件中
/// </summary>
class JsonExporter {
string mContext = "";
public string context {
get {
return mContext;
}
}
/// <summary>
/// 构造函数:完成内部数据创建
/// </summary>
/// <param name="sheet">ExcelReader创建的一个表单</param>
/// <param name="headerRows">表单中的那几行是表头</param>
public JsonExporter(DataTable sheet, int headerRows, bool lowcase, bool exportArray) {
if (sheet.Columns.Count <= 0)
return;
if (sheet.Rows.Count <= 0)
return;
//-- 转换为JSON字符串
if (exportArray) {
convertArray(sheet, headerRows, lowcase);
}
else {
convertDict(sheet, headerRows, lowcase);
}
}
private void convertArray(DataTable sheet, int headerRows, bool lowcase) {
List<object> values = new List<object>();
int firstDataRow = headerRows - 1;
for (int i = firstDataRow; i < sheet.Rows.Count; i++) {
DataRow row = sheet.Rows[i];
values.Add(
convertRowData(sheet, row, lowcase, firstDataRow)
);
}
//-- convert to json string
mContext = JsonConvert.SerializeObject(values, Formatting.Indented);
}
/// <summary>
/// 以第一列为ID,转换成ID->Object的字典对象
/// </summary>
private void convertDict(DataTable sheet, int headerRows, bool lowcase) {
Dictionary<string, object> importData =
new Dictionary<string, object>();
int firstDataRow = headerRows - 1;
for (int i = firstDataRow; i < sheet.Rows.Count; i++) {
DataRow row = sheet.Rows[i];
string ID = row[sheet.Columns[0]].ToString();
if (ID.Length <= 0)
ID = string.Format("row_{0}", i);
importData[ID] = convertRowData(sheet, row, lowcase, firstDataRow);
}
//-- convert to json string
mContext = JsonConvert.SerializeObject(importData, Formatting.Indented);
}
/// <summary>
/// 把一行数据转换成一个对象,每一列是一个属性
/// </summary>
private object convertRowData(DataTable sheet, DataRow row, bool lowcase, int firstDataRow) {
var rowData = new Dictionary<string, object>();
int col = 0;
foreach (DataColumn column in sheet.Columns) {
object value = row[column];
if (value.GetType() == typeof(System.DBNull)) {
value = getColumnDefault(sheet, column, firstDataRow);
}
else if (value.GetType() == typeof(double)) { // 去掉数值字段的“.0”
double num = (double)value;
if ((int)num == num)
value = (int)num;
}
string fieldName = column.ToString();
// 表头自动转换成小写
if (lowcase)
fieldName = fieldName.ToLower();
if (string.IsNullOrEmpty(fieldName))
fieldName = string.Format("col_{0}", col);
rowData[fieldName] = value;
col++;
}
return rowData;
}
/// <summary>
/// 对于表格中的空值,找到一列中的非空值,并构造一个同类型的默认值
/// </summary>
private object getColumnDefault(DataTable sheet, DataColumn column, int firstDataRow) {
for (int i = firstDataRow; i < sheet.Rows.Count; i++) {
object value = sheet.Rows[i][column];
Type valueType = value.GetType();
if (valueType != typeof(System.DBNull)) {
if (valueType.IsValueType)
return Activator.CreateInstance(valueType);
break;
}
}
return "";
}
/// <summary>
/// 将内部数据转换成Json文本,并保存至文件
/// </summary>
/// <param name="jsonPath">输出文件路径</param>
public void SaveToFile(string filePath, Encoding encoding) {
//-- 保存文件
using (FileStream file = new FileStream(filePath, FileMode.Create, FileAccess.Write)) {
using (TextWriter writer = new StreamWriter(file, encoding))
writer.Write(mContext);
}
}
}
}