Изменение контроллера загрузки с поддержки .xlsx на .csv - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть приложение MVC, которое позволяет администратору загружать в систему 2 разных файла Excel;Затем контроллер создает набор данных с данными Excel, а затем заполняет базу данных «Schools» или «School2» набором данных с использованием SqlBulkCopy.

Эти загрузки отлично работают, когда я тестирую их локально с помощью IIS Express,хотя та же версия, развернутая в AWS эластичный beanstalk, выдает ошибку, когда я нажимаю кнопку импорта. Насколько мне известно, это связано с тем, что моему AWS RDS необходим доступ к драйверам струй провайдера OleDB;что-то, что я не могу сделать, потому что эти драйверы не могут быть просто установлены на AWS RDS, как они могут быть на экземпляре EC2.

Так что я планирую изменить контроллер загрузки так, чтобы он принимал файлы .csv вместо файлов Excel. Это должно решить мою проблему и позволить моим кнопкам загрузки работать после развертывания в AWS. Может ли кто-нибудь помочь мне / указать мне правильное направление, чтобы изменить мой контроллер для поддержки .csv вместо excel, пожалуйста?

Загрузить контроллер:

namespace CampBookingSys.Controllers
{
    public class UploadController : Controller
    {
        SqlConnection con = new SqlConnection(@"Data Source=bookingdb.cwln7mwjvxdd.eu-west-1.rds.amazonaws.com,1433;Initial Catalog=modeldb;User ID=craig1990;Password=27Oct90!;Database=modeldb;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False");

        OleDbConnection Econ;

        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Index(HttpPostedFileBase file)
        {
            string filename = Guid.NewGuid() + Path.GetExtension(file.FileName);
            string filepath = "/excelfolder/" + filename;
            file.SaveAs(Path.Combine(Server.MapPath("/excelfolder"), filename));
            InsertExceldata(filepath, filename);
            return View();
        }

        [HttpPost]
        public ActionResult Index2(HttpPostedFileBase file)
        {
            string filename = Guid.NewGuid() + Path.GetExtension(file.FileName);
            string filepath = "/excelfolder/" + filename;
            file.SaveAs(Path.Combine(Server.MapPath("/excelfolder"), filename));
            InsertExceldata2(filepath, filename);
            return RedirectToAction("Index");
        }

        private void ExcelConn(string filepath)
        {
            string constr = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES;""", filepath);
            Econ = new OleDbConnection(constr);
        }

        private void InsertExceldata(string filepath, string filename)
        {
            string fullpath = Server.MapPath("/excelfolder/") + filename;
            ExcelConn(fullpath);
            string query = string.Format("Select * from [{0}]", "Sheet1$");
            OleDbCommand Ecom = new OleDbCommand(query, Econ);
            Econ.Open();

            DataSet ds = new DataSet();
            OleDbDataAdapter oda = new OleDbDataAdapter(query, Econ);
            Econ.Close();
            oda.Fill(ds);

            DataTable dt = ds.Tables[0];

            SqlBulkCopy objbulk = new SqlBulkCopy(con);
            objbulk.DestinationTableName = "dbo.Schools";
            objbulk.ColumnMappings.Add("AcademicYear", "AcademicYear");
            objbulk.ColumnMappings.Add("RollNumber", "RollNumber");
            objbulk.ColumnMappings.Add("OfficialSchoolName", "OfficialSchoolName");
            objbulk.ColumnMappings.Add("Address1", "Address1");
            objbulk.ColumnMappings.Add("Address2", "Address2");
            objbulk.ColumnMappings.Add("Address3", "Address3");
            objbulk.ColumnMappings.Add("Address4", "Address4");
            objbulk.ColumnMappings.Add("County", "County");
            objbulk.ColumnMappings.Add("Eircode", "Eircode");
            objbulk.ColumnMappings.Add("LocalAuthority", "LocalAuthority");
            objbulk.ColumnMappings.Add("X", "X");
            objbulk.ColumnMappings.Add("Y", "Y");
            objbulk.ColumnMappings.Add("ITMEast", "ITMEast");
            objbulk.ColumnMappings.Add("ITMNorth", "ITMNorth");
            objbulk.ColumnMappings.Add("Latitude", "Latitude");
            objbulk.ColumnMappings.Add("Longitude", "Longitude");

            con.Open();
            objbulk.WriteToServer(dt);
            con.Close();
        }

        private void InsertExceldata2(string filepath, string filename)
        {
            string fullpath = Server.MapPath("/excelfolder/") + filename;
            ExcelConn(fullpath);
            string query = string.Format("Select * from [{0}]", "Sheet1$");
            OleDbCommand Ecom = new OleDbCommand(query, Econ);
            Econ.Open();

            DataSet ds = new DataSet();
            OleDbDataAdapter oda = new OleDbDataAdapter(query, Econ);
            Econ.Close();
            oda.Fill(ds);

            DataTable dt = ds.Tables[0];

            SqlBulkCopy objbulk = new SqlBulkCopy(con);
            objbulk.DestinationTableName = "dbo.School2";
            objbulk.ColumnMappings.Add("RollNumber", "RollNumber");
            objbulk.ColumnMappings.Add("OfficialSchoolName", "OfficialSchoolName");
            objbulk.ColumnMappings.Add("Address1", "Address1");
            objbulk.ColumnMappings.Add("Address2", "Address2");
            objbulk.ColumnMappings.Add("Address3", "Address3");
            objbulk.ColumnMappings.Add("Address4", "Address4");
            objbulk.ColumnMappings.Add("County", "County");
            objbulk.ColumnMappings.Add("Eircode", "Eircode");
            objbulk.ColumnMappings.Add("PhoneNumber", "PhoneNumber");
            objbulk.ColumnMappings.Add("Email", "Email");
            objbulk.ColumnMappings.Add("PrincipalName", "PrincipalName");
            objbulk.ColumnMappings.Add("DeisSchool", "DeisSchool");
            objbulk.ColumnMappings.Add("SchoolGender", "SchoolGender");
            objbulk.ColumnMappings.Add("PupilAttendanceType", "PupilAttendanceType");
            objbulk.ColumnMappings.Add("IrishClassification", "IrishClassification");
            objbulk.ColumnMappings.Add("GaeltachtArea", "GaeltachtArea");
            objbulk.ColumnMappings.Add("FeePayingSchool", "FeePayingSchool");
            objbulk.ColumnMappings.Add("Religion", "Religion");
            objbulk.ColumnMappings.Add("OpenClosedStatus", "OpenClosedStatus");
            objbulk.ColumnMappings.Add("TotalGirls", "TotalGirls");
            objbulk.ColumnMappings.Add("TotalBoys", "TotalBoys");
            objbulk.ColumnMappings.Add("TotalPupils", "TotalPupils");

            con.Open();
            objbulk.WriteToServer(dt);
            con.Close();
        }
    }
}

1 Ответ

0 голосов
/ 02 ноября 2019

Мой первый совет - делать массовые вставки в СУБД, а не в коде. Выполнение их с помощью кода может привести только к дополнительным проблемам.

Что касается анализа файлов .xlsx, драйвер OleDB, вероятно, не нужен. Существует несколько основных правил для работы с офисными форматами:

  • , если вы можете ограничить его новыми (.xlsx), вы можете использовать OpenXML SDK . Или кто-нибудь из оберток, созданных вокруг него. Или даже только классы .ZipArchive и XMLReader.
  • , если вам нужно также поддерживать старые форматы (.xls), вы должны использовать (t) ржавый Office COM Interop. Это имеет все обычную проблему COM Interop, и дополнительно требует установки офиса и интерактивного сеанса
  • для любой технологии отображения и проблемы, может быть третий вариант. Но это немного и далеко между. Поскольку мы всегда обращались к Interop, мы никогда не разрабатывали полноценный класс обработки Office, как это делают многие другие языки.

Я бы поставил OlebDB в эту последнюю категорию - редкое и очень специфическое решение. .

Всегда рекомендуется использовать первую опцию.

И Officer COM Interop следует скрытно скрыть, удалив старые форматы из опций формата файла. Учитывая, что это веб-приложение, которое, скорее всего, будет работать как сервисы, вы все равно не получите обязательный интерактивный сеанс.

Конечно, вариант .csv также возможен. И действительно, Excel имеет полную поддержку .CSV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...