目的: 將目前所勾選的資料匯出成 xls 檔案
處理說明: 1> JSON2dt
DataTable dt1 = myfunc.JSON2dt(Tmp_DataString1);
2>prop.Value.Type==JTokenType.Null
if (prop.Value.Type == JTokenType.Null)
row[prop.Name] = DBNull.Value;
row[prop.Name] = DBNull.Value;
else
row[prop.Name] = prop.Value?.ToObject<double>();
1>myfunc.cs
public static DataTable JSON2dt(string par_JSONString)
{
// 反序列化 JSON 字符串為 JArray
try
{
JArray jsonArray = JArray.Parse(par_JSONString);
// 創建 DataTable
DataTable Tmp_dt = new DataTable();
// 動態添加欄位
foreach (JObject obj in jsonArray.Children<JObject>())
{
foreach (JProperty prop in obj.Properties())
{
if (!Tmp_dt.Columns.Contains(prop.Name))
{
// 根據值的類型動態設置欄位類型
Type columnType = typeof(string); // 默認為 string
if (prop.Value.Type == JTokenType.Float || prop.Value.Type == JTokenType.Integer)
{
columnType = typeof(double);
}
Tmp_dt.Columns.Add(prop.Name, columnType);
}
}
}
// 將 JSON 數據添加到 DataTable 中
foreach (JObject obj in jsonArray.Children<JObject>())
{
DataRow row = Tmp_dt.NewRow();
foreach (JProperty prop in obj.Properties())
{
if (Tmp_dt.Columns[prop.Name].DataType == typeof(double))
{
//2025/08/11 micro edit , 排除 null .ToObject<double>
if (prop.Value.Type == JTokenType.Null)
//if (prop.Value == nulll)
//prop.Value = null; // prop.Value.ToObject<double>(); --> error
row[prop.Name] = DBNull.Value;
else
row[prop.Name] = prop.Value?.ToObject<double>();
}
else
{
row[prop.Name] = prop.Value?.ToString();
}
}
Tmp_dt.Rows.Add(row);
}
//Tmp_dt = (DataTable)JsonConvert.DeserializeObject(par_JSONString, (typeof(DataTable)));
//// 使用 DataSet 反序列化 JSON 字串 DataSet ds = JsonConvert.DeserializeObject<DataSet>(par_JSONString);
return Tmp_dt;
} // end of try{ }
{
// 反序列化 JSON 字符串為 JArray
try
{
JArray jsonArray = JArray.Parse(par_JSONString);
// 創建 DataTable
DataTable Tmp_dt = new DataTable();
// 動態添加欄位
foreach (JObject obj in jsonArray.Children<JObject>())
{
foreach (JProperty prop in obj.Properties())
{
if (!Tmp_dt.Columns.Contains(prop.Name))
{
// 根據值的類型動態設置欄位類型
Type columnType = typeof(string); // 默認為 string
if (prop.Value.Type == JTokenType.Float || prop.Value.Type == JTokenType.Integer)
{
columnType = typeof(double);
}
Tmp_dt.Columns.Add(prop.Name, columnType);
}
}
}
// 將 JSON 數據添加到 DataTable 中
foreach (JObject obj in jsonArray.Children<JObject>())
{
DataRow row = Tmp_dt.NewRow();
foreach (JProperty prop in obj.Properties())
{
if (Tmp_dt.Columns[prop.Name].DataType == typeof(double))
{
//2025/08/11 micro edit , 排除 null .ToObject<double>
if (prop.Value.Type == JTokenType.Null)
//if (prop.Value == nulll)
//prop.Value = null; // prop.Value.ToObject<double>(); --> error
row[prop.Name] = DBNull.Value;
else
row[prop.Name] = prop.Value?.ToObject<double>();
}
else
{
row[prop.Name] = prop.Value?.ToString();
}
}
Tmp_dt.Rows.Add(row);
}
//Tmp_dt = (DataTable)JsonConvert.DeserializeObject(par_JSONString, (typeof(DataTable)));
//// 使用 DataSet 反序列化 JSON 字串 DataSet ds = JsonConvert.DeserializeObject<DataSet>(par_JSONString);
return Tmp_dt;
} // end of try{ }
2>*.js
var Tmp_DataAry = [];
var isOk = true;
var np = {};
var Tmp_Str = "";
if (CHK_PK_OBJ.PK_LIST.length == 0) {
mywarnalert("請先選擇要匯出使用物料的AMM單號s");
return false;
}
var cur_rec;
for (let i = 0; i <= CHK_PK_OBJ.PK_LIST.length - 1; i++) {
cur_rec = CHK_PK_OBJ.ALL_LIST[i];
console.log("cur_rec:", cur_rec);
console.log("CHK_PK_OBJ.ALL_LIST[i]:", CHK_PK_OBJ.ALL_LIST[i]);
Tmp_DataAry.push(cur_rec);
} // end of for (let i=0,)
// 將目前子畫面的資料(Table)轉成 JSON字串
var Tmp_DataString1 = JSON.stringify(Tmp_DataAry);
//詢問 "此筆資料來源為 AMM,請問是否將[拆檢交修單號(RPNOAF)]異動為 [AMM單號]?
var np = {};
np["FName"] = "V80203_使用物料明細統計表_檔案格式.xlsx";
np["DataString1"] = Tmp_DataString1;
f_downloadFile('EX_DFile', '../api/V80203AAPI/XlsOut', np, 'POST', function () {
var r = r_cookies('EX_DFile');
mysuccessalert(r);
});
3>*.cs
public void XlsOut()
{
var c = HttpContext.Current;
NameValueCollection nvc = c.Request.Form;
// 1>將 SS_FILES.FBOLD 存成 Local檔案
//取得目前子畫面的欄位值
string Tmp_DataString1 = nvc["DataString1"]; //Tmp_DataString: 將目前子畫面的資料. JSON字串
//將 table 字串轉成 DataTable
//DataTable DataTable1 = (DataTable)JsonConvert.DeserializeObject(Tmp_DataString1, (typeof(DataTable)));
DataTable dt1 = myfunc.JSON2dt(Tmp_DataString1);
沒有留言:
張貼留言