Camstar Excel Upload

本文内容仅做参考并不完全通用,测试环境为OpcenterEXCR2410,其中数据均为演示所用无实际意义

在VP页面中添加File Input控件

创建VP页面,加入文件上传控件,加载按钮,展示表格

页面绑定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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
using System;
using System.Collections.Generic;
using System.Data;
using System.Web.UI.WebControls;
using Camstar.WCF.Services;
using Camstar.WCF.ObjectStack;
using Camstar.WebPortal.Utilities;
using Camstar.WebPortal.FormsFramework.WebGridControls;
using Camstar.WebPortal.FormsFramework;
using Camstar.WebPortal.FormsFramework.Utilities;
using Camstar.WebPortal.Constants;
using Camstar.WebPortal.WCFUtilities;
using Camstar.WebPortal.Personalization;
using CWC = Camstar.WebPortal.FormsFramework.WebControls;
using CGC = Camstar.WebPortal.FormsFramework.WebGridControls;
using OM = Camstar.WCF.ObjectStack;
using SEMI.AppCode;
using System.IO;
using System.Data.Common;
using Avary.Utils.DB;
using System.Configuration;
using System.Linq;

/// <summary>
/// 钻孔外发
/// </summary>

namespace Camstar.WebPortal.WebPortlets.Shopfloor
{
public class ahDrillingOutsource : MatrixWebPart
{
/// <summary>
/// 详情
/// </summary>
protected JQDataGrid _GridServiceDetails { get { return Page.FindCamstarControl("ahDrillingOutsource_ServiceDetails") as JQDataGrid; } }

/// <summary>
/// 导入数据
/// </summary>
protected CWC.Button _ButtonImport { get { return Page.FindCamstarControl("ButtonImport") as CWC.Button; } }

LabelCache labelCache = LabelCache.GetRuntimeCacheInstance();

//---------------------------------------------------
// Override OnLoad event 加载事件
//---------------------------------------------------
protected override void OnLoad(EventArgs e)
{
try
{
base.OnLoad(e);

if (!Page.IsPostBack)
{

}
_ButtonImport.Click += new EventHandler(GetInputData);
}
catch (Exception ex)
{
Page.StatusBar.WriteError(ex.Message.ToString());
}
}

/// <summary>
/// 获取数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void GetInputData(object sender, EventArgs e)
{
try
{
string strfilePath = CWC.FileInput.UploadFilePath; //获取上传文路径
if (!string.IsNullOrEmpty(strfilePath))
{
FileStream fs = new FileStream(strfilePath, FileMode.Open, FileAccess.Read);
DataTable inputDt = ahFileUtil.ReadExcel(fs, strfilePath);
if (inputDt != null && inputDt.Rows.Count > 0)
{
inputDt.Columns[0].ColumnName = "DATE";
inputDt.Columns[1].ColumnName = "MFGORDER";
inputDt.Columns[2].ColumnName = "PRODUCTNAME";
inputDt.Columns[3].ColumnName = "PRODUCTREV";
inputDt.Columns[4].ColumnName = "CONTAINER";
inputDt.Columns[5].ColumnName = "SPEC";
inputDt.Columns[6].ColumnName = "QTY";
inputDt.Columns[7].ColumnName = "ISCANCEL";

List<ahDrillingOutsourceDetails> Details = new List<OM.ahDrillingOutsourceDetails>();
for (int i = 0; i < inputDt.Rows.Count; i++)
{
#region 数据校验

string containerName = inputDt.Rows[i][4]?.ToString()?.Trim();
string mfgOrder = inputDt.Rows[i][1]?.ToString()?.Trim();
string productName = inputDt.Rows[i][2]?.ToString()?.Trim();
string productRev = inputDt.Rows[i][3]?.ToString()?.Trim();
string specName = inputDt.Rows[i][5]?.ToString()?.Trim();
if (string.IsNullOrEmpty(containerName) || string.IsNullOrEmpty(specName))
{
//第 {i + 2} 行:批次号或工站名称为空,请检查上传数据
Page.StatusBar.WriteWarning(string.Format(labelCache.GetLabelByName("ahDrillingOutsource_E0001").Value, i+2));
return;
}
string sql = @"
SELECT
C.CONTAINERNAME,
MO.MFGORDERNAME,
PB.PRODUCTNAME,
P.PRODUCTREVISION,
SB.SPECNAME
FROM CONTAINER C
INNER JOIN MFGORDER MO ON C.MFGORDERID = MO.MFGORDERID
INNER JOIN PRODUCT P ON P.PRODUCTID = C.PRODUCTID
INNER JOIN PRODUCTBASE PB ON P.PRODUCTBASEID = PB.PRODUCTBASEID
INNER JOIN CURRENTSTATUS CSS ON C.CURRENTSTATUSID = CSS.CURRENTSTATUSID
INNER JOIN SPEC S ON S.SPECID = CSS.SPECID
INNER JOIN SPECBASE SB ON S.SPECBASEID = SB.SPECBASEID
WHERE C.CONTAINERNAME = :Lot
";
DataTable dt = PubCamstar.GetDataTable(sql, new string[] { containerName });
if (dt == null || dt.Rows.Count == 0)
{
//第 {i + 2} 行:批次 {containerName} 信息在系统中不存在
Page.StatusBar.WriteWarning(string.Format(labelCache.GetLabelByName("ahDrillingOutsource_E0002").Value, i + 2, containerName));
return;
}
DataRow dr = dt.Rows[0];
if (!string.Equals(dr["MFGORDERNAME"]?.ToString(), mfgOrder)
|| !string.Equals(dr["PRODUCTNAME"]?.ToString(), productName)
|| !string.Equals(dr["PRODUCTREVISION"]?.ToString(), productRev))
{
//第 {i + 2} 行:批次 {containerName} 的工单 / 料号 / 版本 与系统信息不一致,请检查上传数据
Page.StatusBar.WriteWarning(string.Format(labelCache.GetLabelByName("ahDrillingOutsource_E0003").Value, i + 2, containerName));
return;
}

#endregion

double qty;
string qtyStr = inputDt.Rows[i][6]?.ToString()?.Trim();

if (!double.TryParse(qtyStr, out qty))
{
//第 {i + 2} 行:数量 QTY 格式错误,当前值:{qtyStr}
Page.StatusBar.WriteWarning(string.Format(labelCache.GetLabelByName("ahDrillingOutsource_E0004").Value, i + 2, qtyStr));
return;
}
ahDrillingOutsourceDetails Detail = new ahDrillingOutsourceDetails()
{
ahDate = inputDt.Rows[i][0]?.ToString(),
ahMfgOrder = new NamedObjectRef(mfgOrder),
ahProduct = new RevisionedObjectRef(productName, productRev),
ahContainer = new ContainerRef(containerName),
ahSpec = new RevisionedObjectRef(specName, "1"),
ahQty = new Primitive<double>(qty),
ahIsCancel = inputDt.Rows[i][7]?.ToString()
};
Details.Add(Detail);
}
_GridServiceDetails.Data = Details.ToArray();
}
else
{
//识别数据文件内容失败,请检查导入模板正确性
Page.StatusBar.WriteWarning(labelCache.GetLabelByName("ahDrillingOutsource_E0005").Value);
}
}
else
{
//请选择导入的数据文件
Page.StatusBar.WriteWarning(labelCache.GetLabelByName("ahDrillingOutsource_E0006").Value);
}
}
catch (Exception ex)
{
Page.StatusBar.WriteError(ex.Message);
}
}

public override bool PreExecute(Info serviceInfo, Service serviceData)
{
bool isSuccess = base.PreExecute(serviceInfo, serviceData);

var details = _GridServiceDetails.Data as ahDrillingOutsourceDetails[];
if (details == null || details.Length == 0)
{
//提交数据为空,请先导入Excel数据
isSuccess = false;
Page.StatusBar.WriteWarning(labelCache.GetLabelByName("ahDrillingOutsource_E0007").Value);
return isSuccess;
}

var duplicateContainers = details
.Where(d =>
!string.IsNullOrWhiteSpace(d.ahContainer?.Name) &&
!string.IsNullOrWhiteSpace(d.ahSpec?.Name))
.GroupBy(d => new
{
Container = d.ahContainer.Name.Trim(),
Spec = d.ahSpec.Name.Trim()
})
.Where(g => g.Count() > 1)
.Select(g => g.Key)
.ToList();

if (duplicateContainers.Any())
{
//提交数据中存在重复的批号工序组合,请检查数据内容
isSuccess = false;
Page.StatusBar.WriteWarning(labelCache.GetLabelByName("ahDrillingOutsource_E0008").Value);
return isSuccess;
}

return isSuccess;
}
}
}

文件加载工具类

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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using System.Data;
using System.IO;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Data.Common;
using Camstar.WebPortal.FormsFramework.Utilities;
using Camstar.WCF.ObjectStack;

namespace Camstar.WebPortal.WebPortlets.Shopfloor
{
public static class ahFileUtil
{
static LabelCache labelCache = LabelCache.GetRuntimeCacheInstance();
static Label validateLbl;

#region 讀取上傳的Excl檔,並轉成DataTable
/// <summary>
/// 讀取上傳的Excl檔,並轉成DataTable
/// </summary>
/// <param name="file">上傳的檔案流</param>
/// <returns></returns>
public static DataTable ReadExcel(this HttpPostedFileBase file)
{
string FileName = file.FileName;
string[] sp = FileName.Split('.');

if (sp[1] == "xls")
{
return file.InputStream.ReadExcel2003();
}
else if (sp[1] == "xlsx")
{
return file.InputStream.ReadExcel2007();
}
else
{
//throw new Exception("附檔名不為Excel格式");
validateLbl = labelCache.GetLabelByName("ahFileUtil_E0011");
throw new Exception(validateLbl.Value);
}
;
}
#endregion

#region 讀取上傳的Excl檔,並轉成DataTable
/// <summary>
/// 讀取上傳的Excl檔,並轉成DataTable
/// </summary>
/// <param name="file">上傳的檔案流</param>
/// <returns></returns>
public static DataTable ReadExcel(FileStream fs, string FileName)
{
string[] sp = FileName.Split('.');
if (sp[1] == "xls")
{
return ReadExcel2003(fs);
}
else if (sp[1] == "xlsx")
{
return ReadExcel2007(fs);
}else if (sp[1] == "csv")
{
return ReadCSV(fs);
}
else
{
//throw new Exception("附檔名不為Excel格式");
validateLbl = labelCache.GetLabelByName("ahFileUtil_E0011");
throw new Exception(validateLbl.Value);
}
}
#endregion


public static DataTable ReadCSV(this System.IO.Stream file)
{
DataTable dt = new DataTable();
using (StreamReader sr = new StreamReader(file, System.Text.Encoding.UTF8))
{
string str = "";
int index = 0;
while (str != null)
{
if (index == 0)
{
str = sr.ReadLine();
if (str == null) break;
string[] eachLine = str.Split(',');
for (int i = 0; i < eachLine.Length; i++)
{
dt.Columns.Add(eachLine[i],typeof(string));
}
}
else
{
str = sr.ReadLine();
if (str == null) break;
DataRow dr = dt.NewRow();
string[] eachLine = str.Split(',');
for (int i = 0; i < eachLine.Length; i++)
{
dr[i] = eachLine[i];
}
dt.Rows.Add(dr);
}
index++;
}
sr.Close();
}
return dt;
}

#region 将Excel文件中的数据读出到DataTable中(xls)
public static DataTable ReadExcel2003(this System.IO.Stream file)
{
DataTable dt = new DataTable();
HSSFWorkbook hssfworkbook = new HSSFWorkbook(file);
ISheet sheet = hssfworkbook.GetSheetAt(0);

//表头
IRow header = sheet.GetRow(sheet.FirstRowNum);
List<int> columns = new List<int>();
for (int i = 0; i < header.LastCellNum; i++)
{
object obj = GetValueTypeForXLS(header.GetCell(i) as HSSFCell);
if (obj == null || obj.ToString() == string.Empty)
{
dt.Columns.Add(new DataColumn("Columns" + i.ToString(), typeof(string)));
//continue;
}
else
dt.Columns.Add(new DataColumn(obj.ToString(), typeof(string)));
columns.Add(i);
}
//数据
for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
{
DataRow dr = dt.NewRow();
bool hasValue = false;
foreach (int j in columns)
{
var aaa = sheet.GetRow(i).GetCell(j);
dr[j] = GetValueTypeForXLS(sheet.GetRow(i).GetCell(j) as HSSFCell);
if (dr[j] != null && dr[j].ToString() != string.Empty)
{
hasValue = true;
}
}
if (hasValue)
{
dt.Rows.Add(dr);
}
}
return dt;
}
#endregion



#region 将Excel文件中的数据读出到DataTable中(xlsx)
/// <summary>
/// 将Excel文件中的数据读出到DataTable中(xlsx)
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static DataTable ReadExcel2007(this System.IO.Stream file)
{
DataTable dt = new DataTable();
//using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
//{
XSSFWorkbook xssfworkbook = new XSSFWorkbook(file);
ISheet sheet = xssfworkbook.GetSheetAt(0);

//表头
IRow header = sheet.GetRow(sheet.FirstRowNum);
List<int> columns = new List<int>();
for (int i = 0; i < header.LastCellNum; i++)
{
object obj = GetValueTypeForXLSX(header.GetCell(i) as XSSFCell);
if (obj == null || obj.ToString() == string.Empty)
{
dt.Columns.Add(new DataColumn("Columns" + i.ToString()));
//continue;
}
else
dt.Columns.Add(new DataColumn(obj.ToString()));
columns.Add(i);
}
//数据
for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
{
DataRow dr = dt.NewRow();
bool hasValue = false;
foreach (int j in columns)
{
dr[j] = GetValueTypeForXLSX(sheet.GetRow(i).GetCell(j) as XSSFCell);
if (dr[j] != null && dr[j].ToString() != string.Empty)
{
hasValue = true;
}
}


if (hasValue)
{
dt.Rows.Add(dr);
}
}
//}
return dt;
}
#endregion

#region 获取单元格类型(xlsx)
/// <summary>
/// 获取单元格类型(xlsx)
/// </summary>
/// <param name="cell"></param>
/// <returns></returns>
private static object GetValueTypeForXLSX(XSSFCell cell)
{
if (cell == null)
return null;
switch (cell.CellType)
{
case CellType.Blank: //BLANK:
return null;
case CellType.Boolean: //BOOLEAN:
return cell.BooleanCellValue;

case CellType.Numeric: //NUMERIC:
if (HSSFDateUtil.IsCellDateFormatted(cell))
{
return cell.DateCellValue;
}
else
{
return cell.NumericCellValue;
}
case CellType.String: //STRING:
return cell.StringCellValue;
case CellType.Error: //ERROR:
return cell.ErrorCellValue;
case CellType.Formula: //FORMULA:
default:
return "=" + cell.CellFormula;
}
}
#endregion

#region 获取单元格类型(xls)
/// <summary>
/// 获取单元格类型(xls)
/// </summary>
/// <param name="cell"></param>
/// <returns></returns>
private static object GetValueTypeForXLS(HSSFCell cell)
{
if (cell == null)
return null;
switch (cell.CellType)
{
case CellType.Blank: //BLANK:
return null;
case CellType.Boolean: //BOOLEAN:
return cell.BooleanCellValue;
case CellType.Numeric: //NUMERIC:
short format = cell.CellStyle.DataFormat;
if (format==14|| format ==31|| format ==57|| format ==58|| format ==20 || format == 22)
{
return cell.DateCellValue;
}
else if (format==0)
{
return cell.NumericCellValue;
}
else if (cell.DateCellValue != null)
{
return cell.DateCellValue;
}
return cell.NumericCellValue;
case CellType.String: //STRING:
return cell.StringCellValue;
case CellType.Error: //ERROR:
return cell.ErrorCellValue;
case CellType.Formula: //FORMULA:
default:
return "=" + cell.CellFormula;
}
}
#endregion

#region 将DataTable数据导出到Excel文件中
/// <summary>
/// 将DataTable数据导出到Excel文件中(xls)
/// </summary>
/// <param name="dt"></param>
public static byte[] ToExcelStream(this DataTable dt)
{
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
ISheet sheet = hssfworkbook.CreateSheet("Sheet1");

//表头
IRow row = sheet.CreateRow(0);
for (int i = 0; i < dt.Columns.Count; i++)
{
ICell cell = row.CreateCell(i);
cell.SetCellValue(dt.Columns[i].ColumnName);
}

//数据
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow row1 = sheet.CreateRow(i + 1);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = row1.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}

//转为字节数组
MemoryStream stream = new MemoryStream();
hssfworkbook.Write(stream);

return stream.ToArray();
}
#endregion

#region 将DataTable数据导出到Excel文件中(xls)
/// <summary>
/// 将DataTable数据导出到Excel文件中(xls)
/// </summary>
/// <param name="dt"></param>
/// <param name="Column">標題名稱(以逗號分隔)</param>
/// <returns></returns>
public static byte[] ToExcelStream(this DataTable dt, string Column)
{
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
ISheet sheet = hssfworkbook.CreateSheet("Sheet1");

//表头
IRow row = sheet.CreateRow(0);


string[] Columns = Column.Split(',');
int c = 0;
foreach (string col in Columns)
{
ICell cell = row.CreateCell(c);
cell.SetCellValue(col);
c++;
}

//数据
for (int i = 0; i < dt.Rows.Count; i++)
{
IRow row1 = sheet.CreateRow(i + 1);
for (int j = 0; j < dt.Columns.Count; j++)
{
ICell cell = row1.CreateCell(j);
cell.SetCellValue(dt.Rows[i][j].ToString());
}
}

//转为字节数组
MemoryStream stream = new MemoryStream();
hssfworkbook.Write(stream);

return stream.ToArray();
}
#endregion
}
}