Member 14183767 Ответов: 3

Как пропустить первую строку в загрузке файла excel


у меня есть небольшой сайт, где пользователи загружают лист excel и хранятся в БД. загруженные листы имеют заголовок в формате A1:D, затем имена столбцов, а затем данные. я хотел бы пропустить заголовок В A1:D и начать импорт оттуда

я пытался скопировать, как выглядит мой лист:
Report for March 2019				
Task    Caption   Start Date	
19139   GP        01/11/2017		

я хочу пропустить заголовок "отчет за март 2019 года".

я использую sqlbulk copy и oledb, и я установил HDR=Yes в строке подключения

Что я уже пробовал:

//declare destination table
        string ssqltable = "mytab";
        // make sure your sheet name is correct, here sheet name is sheet1, so you can change your sheet name if have different
        string myexceldataquery = "Select * FROM [Details$])";
        try
        {
            //create our connection strings
            string sexcelconnectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelfilepath + ";Extended Properties=" + "\"excel 12.0;hdr=yes;\"";

            string sclearsql = "TRUNCATE TABLE " + ssqltable;
            SqlConnection sqlconn = new SqlConnection(strConnString);
            SqlCommand sqlcmd = new SqlCommand(sclearsql, sqlconn);
            sqlconn.Open();
            sqlcmd.ExecuteNonQuery();

            //series of commands to bulk copy data from the excel file into our sql table
            OleDbConnection oledbconn = new OleDbConnection(sexcelconnectionstring);
            OleDbCommand oledbcmd = new OleDbCommand(myexceldataquery, oledbconn);
            oledbconn.Open();
            OleDbDataReader dr = oledbcmd.ExecuteReader();




            SqlBulkCopy bulkcopy = new SqlBulkCopy(strConnString);
            bulkcopy.DestinationTableName = ssqltable;
            //Mapping Table column    

            bulkcopy.ColumnMappings.Add("Task", "[Task]");
            bulkcopy.ColumnMappings.Add("Caption", "[Caption]");
            bulkcopy.ColumnMappings.Add("Start Date", "[Start_Date]");



            {
                bulkcopy.WriteToServer(dr);

            }
            oledbconn.Close();
            sqlconn.Close();

3 Ответов

Рейтинг:
27

Maciej Los

Попробовать это:

string myexceldataquery = "Select * FROM [Details$A2:G];";


Member 14183767

привет, спасибо , я попробовал это сделать первым , но получил сообщение об ошибке "синтаксическая ошибка в предложении from".

Member 14183767

Большое спасибо , это работает

Maciej Los

Всегда пожалуйста.

Рейтинг:
13

#realJSOP

Ваш select statment должен предоставлять диапазон строк/столбцов для извлечения, а не только начальную ячейку.

Что-то вроде SELECT * FROM [Details$A2:C3]


Member 14183767

Привет , я получаю следующую ошибку "синтаксическая ошибка в предложении FROM". и количество строк в моих листах варьируется

Member 14183767

Привет, спасибо, что это работает! у меня была скобка, которая вызывала синтаксическую ошибку

Рейтинг:
0

Gerry Schmitz

Попробуйте выполнить чтение на устройстве чтения данных, прежде чем передавать его на WriteToServer.

Если WriteToServer не "перемещает" (большинство "потоковых читателей" этого не делают), то массовое копирование должно начинаться со второй записи.

OleDbDataReader dr = oledbcmd.ExecuteReader();
dr.Read();
...