Нет необходимости писать так много if ... else if ... else if ... else if ...
, чтобы получить связанные имена полей.
Лучший способ -
IList
) в качестве параметра. intersect
. Реализация
public IActionResult DownloadExcel(IList fields)
{
// get the required field list
var userType = typeof(UserTable);
fields = userType.GetProperties().Select(p => p.Name).Intersect(fields).ToList();
if(fields.Count == 0){ return BadRequest(); }
using (ExcelPackage package = new ExcelPackage())
{
IList userList = _context.UserTable.ToList();
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("DbTableName");
// generate header line
for(var i= 0; i< fields.Count; i++ ){
var fieldName = fields[i];
var pi= userType.GetProperty(fieldName);
var displayName = pi.GetCustomAttribute()?.DisplayName;
worksheet.Cells[1,i+1].Value = string.IsNullOrEmpty(displayName ) ? fieldName : displayName ;
}
// generate row lines
int totalUserRows = userList.Count();
for(var r=0; r< userList.Count(); r++){
var row = userList[r];
for(var c=0 ; c< fields.Count;c++){
var fieldName = fields[c];
var pi = userType.GetProperty(fieldName);
// because the first row is header
worksheet.Cells[r+2, c+1].Value = pi.GetValue(row);
}
}
var stream = new MemoryStream(package.GetAsByteArray());
return new FileStreamResult(stream,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
}
}
Вы можете настроить отображаемое имя, используя DsiplayNameAttribute
:
public class UserTable
{
public int Id{get;set;}
[DisplayName("First Name")]
public string fName { get; set; }
[DisplayName("Last Name")]
public string lName { get; set; }
[DisplayName("Gender")]
public string gender { get; set; }
}
Это Можно добавить любые свойства по своему усмотрению без жесткого кодирования в вашем методе DownloadExcel
.
Демонстрация :
при прохождении списка полей fields[0]=fName&fields[1]=lName&fields[2]=Non-Exist
генерирует Excel следующим образом:
[Обновить]
Чтобы экспортировать все поля, можно предположить, что клиент не передаст параметр fields
. Это означает, что когда поля равны null
или fields.Count==0
, мы экспортируем все поля:
[HttpGet("download")]
public IActionResult DownloadExcel(IList fields)
{
// get the required field list
var userType = typeof(UserTable);
var pis= userType.GetProperties().Select(p => p.Name);
if(fields?.Count >0){
fields = pis.Intersect(fields).ToList();
} else{
fields = pis.ToList();
}
using (ExcelPackage package = new ExcelPackage()){
....
}
}
Я рекомендую использовать Hough, преобразовывают, который позволяет Вам находить любой данный шаблон описанным уравнением. То, что является больше Hough, преобразовывают, также работает отлично для деформированных объектов.
Алгоритм и сама реализация довольно просты. Больше деталей может быть найдено здесь: http://en.wikipedia.org/wiki/Hough_transform, даже исходный код для этого алгоритма включен на странице, на которую ссылаются (http://www.rob.cs.tu-bs.de/content/04-teaching/06-interactive/HNF.html).
Я надеюсь, что это помогает Вам.
Я посмотрел бы на Вашу проблему на двух шагах:
сначала находя внешнюю границу Вашего объекта: я предполагаю, что Вы контрастировали достаточно изображения, что Вы можете легко порог для получения двухуровневого изображения объекта. Необходимо извлечь цепочечный код границы объекта.
затем анализируя форму границы для выведения формы (круг, полигон...): можно вычислить искривление в каждой точке граничной цепочки и таким образом определить, сколько резких углов (т.е. высокое значение искривления) существует в форме. Несколько резких углов означают, что у Вас есть полигон, ни один не означает, что у Вас есть круг (постоянная кривизна).
Можно найти описание о том, как получить границу объекта из двухуровневого изображения и способов проанализировать его в Цифровой обработке изображений Gonzalez, главе 11.
Я также нашел эту проницательную презентацию двухуровневого изображения analyis (PPT) и matlab сценария, который реализует некоторые методы, что Gonzalez говорит о в DIP.
Вы можете попробовать использовать гистограммы ориентированных градиентов (также называемые гистограммами ориентации краев). Мы использовали их для обнаружения дорожных знаков. http://en.wikipedia.org/wiki/Histogram_of_oriented_gradients и статьи Билла Триггса должны помочь вам начать.
Я настоятельно рекомендую вам использовать OpenCV , это отличная библиотека компьютерного зрения, которая очень помогает во всем, что связано с компьютерным зрением. Их веб-сайт не очень привлекателен и не полезен, но API действительно мощный.
Книга, которая мне очень помогла, так как в сети не так много документации, - это Learning OpenCV . Документация, поставляемая с API, хороша, но не очень хороша для изучения того, как ее использовать.
В связи с вашей проблемой вы можете использовать детектор Canny Edge, чтобы найти границу вашего элемента, а затем проанализировать ее, или вы можете продолжить с помощью и преобразованием Хафа для поиска линий или окружностей.