Я пытаюсь экспортировать ряд наборов данных в Excel в приложении Angular 6. Для этого я использую XLSX и сохранение файла, как указано в этом примере: https://medium.com/@madhavmahesh/exporting-an-excel-file-in-angular-927756ac9857
Проблема в том, что поля могут время от времени меняться, поэтому мне нужно что-то динамическое (не хочу указывать имена столбцов). Для этого я нашел очень хороший пример: Привязка данных Json к таблица в mvc 4
Однако я не получаю данные в правильном формате. Мне нужно что-то вроде массива массивов. Я предполагаю, что в этом случае тип возвращаемого значения должен быть async Task<JsonResult>
, но не знаю, как заставить его работать. Прикрепляю два изображения - в результате получаю
Вот код из приведенного примера. Сохраненный вызов процедуры GetMyData использует SqlAdapter, и нет необходимости указывать имена полей.
public JsonResult GetValue()
{
JsonResult json = new JsonResult();
DataSet ds = GetMyData();
/*LoadDoctordetailsNew is method where i get data from database and convert
to dataset.It returns a dataset*/
string returnData = GetJson(ds.Tables[0]);
json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
json.Data = returnData;
return json;
}
public static string GetJson(DataTable dt)
{
System.Web.Script.Serialization.JavaScriptSerializer serializer =
new System.Web.Script.Serialization.JavaScriptSerializer();
List<Dictionary<string, object>> rows =
new List<Dictionary<string, object>>();
Dictionary<string, object> row = null;
foreach (DataRow dr in dt.Rows)
{
row = new Dictionary<string, object>();
foreach (DataColumn col in dt.Columns)
{
row.Add(col.ColumnName, dr[col]);
}
rows.Add(row);
}
return serializer.Serialize(rows);
}
public static DataSet GetMyData()
{
try
{
using (SqlConnection connection = Connection.GetConnection())
{
SqlDataAdapter da = new SqlDataAdapter("dbo.MySQLStoredproc", connection);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
}
catch (Exception ex)
{
throw;
}
}
Пожалуйста, направляйте!
P.S.
Этот метод основан на использовании Dapper. Он возвращает данные в желаемом формате (массив массивов), но в объекте мы должны указать имена столбцов, которые будут жестко кодироваться, и поэтому я не могу использовать
public static IEnumerable<Object> GetMyData()
{
var strQuery = @"[dbo].[Myproc]";
IEnumerable< Object > items = new List<Object>(0);
var p = new DynamicParameters();
using (SqlConnection con = Connection.GetConnection())
{
items = con.Query<Object>(strQuery, param: p, commandTimeout: 120, commandType: System.Data.CommandType.StoredProcedure);
}
return items;
}
Вызов из контроллера MVC
[HttpPost]
public async Task<JsonResult> SelectMyData()
{
var task = Task.Run(() => Request.GetMyData());
var retData = await task;
return new JsonResult
{
ContentType = "application/json",
Data = retData,
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
MaxJsonLength = int.MaxValue
};
}