Подключение к электронной таблице Excel с использованием OleDbConnection, сортировка по номеру столбца - PullRequest
0 голосов
/ 04 июля 2011

Я подключаюсь к электронной таблице Excel через OleDbConnection.

Как мне заказать по ColumnNumber? Я хотел бы сделать что-то вроде: SELECT * FROM [Sheet1 $] ORDERBY ColumnNumber где ColumnNumber - это число типа 1 или 2? Есть идеи ? Примечание: файл, который я пытаюсь открыть, не имеет заголовков.

 private String BuildConnectionStringXLS()
        {
            String fileName = GetFileName();

            Dictionary<string, string> props = new Dictionary<string, string>();
            props["Provider"] = "Microsoft.Jet.OLEDB.4.0";
            props["Data Source"] = fileName;
            props["Extended Properties"] = "\"Excel 8.0;HDR=No;IMEX=1\"";
            StringBuilder sb = new StringBuilder();
            foreach (KeyValuePair<string, string> prop in props) 
            {
                sb.Append(prop.Key); 
                sb.Append('=');
                sb.Append(prop.Value); 
                sb.Append(';'); 
            }
            return sb.ToString();
        }




    public DataTable GetFullTable(int columnToOrderBy)
        {
            String fileName = GetFileName();

            DataTable resultDataTable = new DataTable();
            String connectionString = BuildConnectionString();
            OleDbConnection conn = new OleDbConnection(connectionString);
            conn.Open();
            OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [Sheet1$] ORDERBY ColumnNumber", conn);
            da.Fill(resultDataTable);
            conn.Close();
            return resultDataTable;
        }

1 Ответ

0 голосов
/ 04 июля 2011
Меня удивляет, что вы звоните [sheet1 $] напрямую, без ссылки на какой-либо связанный сервер. Вот 2 возможных подхода:

Использование связанного сервера

Сначала создайте связанный сервер для доступа к данным Excel, как показано ниже: (Я предполагаю, что у вас уже есть JET или ACE провайдер для Excel)
  exec sp_addLinkedServer @server='ExcelLnkdServr', 
                    @srvproduct='ACE 12.0', 
                    @provider='Microsoft.ACE.OLEDB.12.0', 
                    @datasrc='\\sysdev\loadExcel.xlsx',
                    @provstr='Excel 12.0;HDR=Yes';
/*  If the above creation is successful, you can see a listing when use SP_LINKEDSERVERS in SSMS. Now you can query the sheet using order by as below: */
   select * from ExcelLnkdServr...[Sheet1$]                    
  order by 1 asc, 2 desc 

Использование Adhoc Queries

Вы можете OPENROWSET, OPENDATASOURCE или OPENQUERY, как показано ниже: (Второй вариант не требует создания связанного сервера)
 select * from openquery(ExcelLnkdServr, 'SELECT * FROM [Sheet1$] order by 1 asc, 3 desc') 
SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0',
    'Excel 12.0;Database=\\sysdev\loadExcel.xlsx;HDR=Yes','Select * from [Sheet1$] order by 1 asc') 
...