Я разрешаю пользователям загружать данные из файла Excel в мою базу данных и хочу отображать дружественные сообщения об ошибках, если одна из их ячеек имеет неправильный формат. Всего будет загружено около 20 ячеек, но сейчас я пробую две. Загрузка в Excel, которую я пытаюсь выполнить, содержит некоторый случайный текст в поле MedicalTotal, который вместо этого должен быть отформатирован как десятичное число. Я проверил, что мой код смотрит в правильное поле. Следующий код контроллера ничего не делает. В базу данных ничего не записано, и то же представление перезагружается.
В окне просмотра я получаю сообщение «Convert.ToDecimal (таблица [0]) вызвала исключение типа System.FormatException» Я пробовал код с Exception и FormatException. Я открыт для других методов перехвата ошибок, помня, что я буду повторять процесс try / catch примерно 20 раз.
[Authorize]
[HttpPost]
public ActionResult CreateBenefitSummary(HttpPostedFileBase FileUpload, Guid ResponseId)
{
BenefitsUploadViewModel model = new BenefitsUploadViewModel();
if (FileUpload != null)
{
// tdata.ExecuteCommand("truncate table OtherCompanyAssets");
if (FileUpload.ContentType == "application/vnd.ms-excel" || FileUpload.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
string filename = FileUpload.FileName;
string targetpath = Server.MapPath("~/Doc/");
FileUpload.SaveAs(targetpath + filename);
string pathToExcelFile = targetpath + filename;
var connectionString = "";
if (filename.EndsWith(".xls"))
{
connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", pathToExcelFile);
}
else if (filename.EndsWith(".xlsx"))
{
connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", pathToExcelFile);
}
var excelFile = new ExcelQueryFactory(pathToExcelFile);
var table = (from a in excelFile.WorksheetRangeNoHeader("B2", "B32", "Benefits Template") select a[0]).ToList();
TempData["ResponseId"] = ResponseId;
try
{
Benefits b = new Benefits();
b.ResponseId = ResponseId;
try
{
b.MedicalTotal = Convert.ToDecimal(table[0]);
}
catch (FormatException)
{
model.ErrorList.Add("Medical Total cell must use Number, Currency, or Accounting format.");
}
b.StdSicknessAccident = Convert.ToDecimal(table[1]);
if (model.ErrorList.Count > 0) {
return View(model);
}
db.benefits.Add(b);
db.SaveChanges();
}
catch (SqlException ex)
{
ViewBag.Message = ex.Message;
}
catch (Exception ex)
{
ViewBag.Message = ex.Message;
}
//deleting excel file from folder
if ((System.IO.File.Exists(pathToExcelFile)))
{
System.IO.File.Delete(pathToExcelFile);
}
TempData["ResponseId"] = ResponseId;
return RedirectToAction("CreateBenefitSummary", "Surveys");
}
}
return View();
}