Как выполнить SQL-запрос в таблице Excel?
Я пытаюсь создать подтаблицу из другой таблицы всех полей фамилии, отсортированных A-Z, которые имеют поле номера телефона, которое не является нулевым. Я мог бы сделать это довольно легко с SQL, но я понятия не имею, как запустить SQL-запрос в Excel. У меня возникает соблазн импортировать данные в postgresql и просто запросить их там, но это кажется немного чрезмерным.
для того, что я пытаюсь сделать, SQL-запрос SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastname будет делать трюк. Это кажется слишком простым для того, чтобы быть чем-то что Excel не может изначально. Как я могу запустить SQL-запрос, как это из Excel?
11 ответов:
есть много прекрасных способов сделать это, которые другие уже предложили. Следуя вдоль "получить данные в Excel через SQL-трек", вот несколько советов.
Excel имеет "мастер подключения к данным", который позволяет импортировать или связать из другого источника данных или даже в том же файле Excel.
в составе Microsoft Office (и ОС) есть два поставщика интересов: старый "Microsoft.Реактивный.OLEDB", и самые последние "Microsoft.ТУЗ.OLEDB". Ищите их при настройке соединения (например, с помощью мастера подключения к данным).
после подключения к книге Excel рабочий лист или диапазон является эквивалентом таблицы или представления. Имя таблицы рабочего листа - это имя рабочего листа со знаком доллара ( " $ " ), добавленным к нему и заключенным в квадратные скобки ("[" и "]"); диапазона, это просто имя диапазона. Чтобы указать безымянный диапазон ячеек в качестве источника записей, добавьте стандартные обозначения строк/столбцов Excel в конце имени листа в квадратных скобках.
родной SQL будет (более или менее) SQL Microsoft Access. (В прошлом он назывался JET SQL; однако Access SQL эволюционировал, и я считаю, что JET является устаревшей старой технологией.)
пример чтения рабочего листа: выберите * из [Sheet1$]
пример, чтение диапазона: SELECT * FROM Мой_диапазон
пример чтения безымянного диапазона ячеек: SELECT * FROM [Sheet1$A1: B10]
есть много много много книг и веб-сайтов, доступных, чтобы помочь вам работать через детали.
=== дополнительные примечания ===
предупреждение об указании листов: поставщик предполагает, что ваша таблица данных начинается с самой верхней, самой левой, непустой ячейки на указанном листе. Другими словами, ваша таблица данных может начинаться в строке 3, столбец C без проблем. Однако нельзя, например, ввести заголовок листа выше и слева от данных в ячейке A1.
предупреждение об указании диапазонов: при указании листа в качестве источника записей поставщик добавляет новые записи ниже существующих записей на листе, как позволяет пространство. При указании диапазона (именованного или неназванного) Jet также добавляет новые записи ниже существующих записи в диапазоне, как позволяет пространство. Однако при выполнении запроса в исходном диапазоне результирующий набор записей не включает вновь добавленные записи за пределами диапазона.
типы данных (стоит попробовать) для создания таблицы: короткий, длинный, один, двойной, валюты, даты и времени, бит, байт, идентификатор GUID, BigBinary, LongBinary, типа varbinary, LongText, тип varchar, десятичной.
подключение к" old tech " Excel (файлы с расширением xls):
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyFolder\MyWorkbook.xls;Extended Properties=Excel 8.0;. Используйте тип базы данных источника Excel 5.0 для Книги Microsoft Excel 5.0 и 7.0 (95) и используйте исходный тип базы данных Excel 8.0 для книг Microsoft Excel 8.0 (97), 9.0 (2000) и 10.0 (2002).подключение к" последнему " Excel (файлы с расширением xlsx):
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;"обработка данных как текста: параметр IMEX обрабатывает все данные как текст. Поставщик=Microsoft.ТУЗ.Oledb для.12.0; Источник Данных=Excel2007file.xlsx; расширенные свойства= "Excel 12.0 Xml; HDR=да; IMEX=1";
(подробности на http://www.connectionstrings.com/excel)
дополнительная информация на http://msdn.microsoft.com/en-US/library/ms141683 (v=sql.90).aspx, и at http://support.microsoft.com/kb/316934
подключение к Excel через ADODB через VBA подробно на http://support.microsoft.com/kb/257819
детали Microsoft JET 4 на http://support.microsoft.com/kb/275561
вы можете сделать это изначально следующим образом:
- выберите таблицу и используйте Excel, чтобы отсортировать ее по фамилии
- создайте 2-строчный по 1-столбцу расширенный критерий фильтра, скажем в E1 и E2, где E1 пуст, а E2 содержит формулу
=C6=""где C6-первая ячейка данных столбца номер телефона.- выберите таблицу и используйте расширенный фильтр, скопируйте в диапазон, используя диапазон критериев в E1:E2 и укажите, где вы хотите скопировать выход к
Если вы хотите сделать это программно, я предлагаю вам использовать Macro Recorder для записи вышеуказанных шагов и посмотреть на код.
tl; dr; Excel делает все это изначально-используйте фильтры или таблицы
(http://office.microsoft.com/en-gb/excel-help/filter-data-in-an-excel-table-HA102840028.aspx)
вы можете открыть excel программно через oledb-соединение и выполнить SQL в таблицах на листе.
но вы можете сделать все, что вы просите сделать без каких-либо формул просто фильтры.
- щелкните в любом месте в пределах вы смотрите на
- перейти к данным на ленте
- выберите фильтр"" его около середины и выглядит как воронка
- теперь у вас будут стрелки на плотной стороне каждой ячейки в первой строке таблицы
- нажмите стрелку на номер телефона и снимите флажок пустые (последнее вариант)
- нажмите стрелку на фамилию и выберите-Z на заказ (верхний вариант)
иметь, чтобы играть вокруг.. некоторые вещи, чтобы отметить:
- вы можете выбрать отфильтрованные строки и вставить их в другом месте
- в строке состояния слева вы увидите, сколько строк вам критериям отфильтровать из общего числа строк. (например, 308 из 313 найденных записей)
- вы можете фильтровать по цвету в excel 2010 on подопечные
- иногда я создаю вычисляемые столбцы, которые дают статусы или очищенные версии данных, которые затем можно фильтровать или Сортировать по тезисам. (например, как формулы в других ответах)
сделайте это с помощью фильтров, если вы не собираетесь делать это много или вы хотите автоматизировать импорт данных где-то или что-то.. но для полноты картины:
опция c#:
OleDbConnection ExcelFile = new OleDbConnection( String.Format( "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR=YES\"", filename)); ExcelFile.Open();удобное место для начала, чтобы взглянуть на схему, как там может быть больше, чем вы думаете:
List<String> excelSheets = new List<string>(); // Add the sheet name to the string array. foreach (DataRow row in dt.Rows) { string temp = row["TABLE_NAME"].ToString(); if (temp[temp.Length - 1] == '$') { excelSheets.Add(row["TABLE_NAME"].ToString()); } }затем, когда вы хотите запросить лист:
OleDbDataAdapter da = new OleDbDataAdapter("select * from [" + sheet + "]", ExcelFile); dt = new DataTable(); da.Fill(dt);Примечание-используйте таблицы в excel!:
Excel имеет функциональность "таблицы", которые делают данные ведут себя больше как таблица.. это дает вам некоторые большие преимущества, но не позволит вам сделать каждый тип запроса.
http://office.microsoft.com/en-gb/excel-help/overview-of-excel-tables-HA010048546.aspx
для табличных данных в excel это мое значение по умолчанию.. первое, что я делаю, это нажимаю на данные, затем выберите "формат как таблица" из раздела home на ленте. это дает вам фильтрацию и сортировку по умолчанию и позволяет получить доступ к таблице и полям по имени (например, таблица[fieldname]) это также позволяет агрегировать функции по столбцам, например max и в среднем
вы can использовать SQL в Excel. Она только хорошо спрятана. Смотрите этот учебник:
http://smallbusiness.chron.com/use-sql-statements-ms-excel-41193.html
Если вам нужно сделать это один раз, просто следуйте описаниям Чарльза, но также можно сделать это с помощью формул Excel и вспомогательных столбцов, если вы хотите сделать фильтр динамическим.
предположим, что данные находятся в таблице данных листа и начинаются в строке 2 следующих столбцов:
- A: фамилия
- B: firstname
- C: номер телефона
вам нужно два вспомогательных столбца на этом лист.
- D2:
=if(A2 = "", 1, 0), Это столбец фильтра, соответствующий вашему условию where- E2:
=if(D2 <> 1, "", sumifs(D:D48576, A:A48576, "<"&A2) + sumifs(D:D2, A:A2, A2)), Это соответствует приказускопируйте эти формулы, насколько ваши данные идут.
на листе, который должен отображать ваш результат, создайте следующие столбцы.
- A: последовательность чисел, начиная с 1 в строке 2, это ограничивает общее количество строк, которые вы можете получить (вид как ограничение в продолжение)
- B2:
=match(A2, DataSheet!$E:$E48576, 0), это строка соответствующих данных- C2:
=iferror(index(DataSheet!A:A48576, $B2), ""), это фактические данные или пустые, если данных не существуетскопируйте формулы в B2 и C2 и скопируйте последнюю колонку C В D и E.
вы можете экспериментировать с собственным драйвером БД для Excel на языке / платформе по вашему выбору. В мире Java, вы можете попробовать сhttp://code.google.com/p/sqlsheet/ который предоставляет драйвер JDBC для работы с листами Excel напрямую. Точно так же вы можете получить драйверы для технологии DB для других платформ.
тем не менее, я могу гарантировать, что вы скоро столкнетесь с рядом функций, которые предоставляют эти библиотеки-оболочки. Лучший способ будет использовать Apache HSSF / POI или аналогичный уровень библиотеки, но для этого потребуется больше усилий по кодированию.
Microsoft Access и LibreOffice Base могут открывать электронную таблицу в качестве источника и запускать на ней sql-запросы. Это был бы самый простой способ запустить все виды запросов и избежать беспорядка запуска макросов или написания кода.
Excel также имеет автофильтры и сортировку данных, которые будут выполнять множество простых запросов, таких как ваш пример. Если вам нужна помощь с этими функциями, Google будет лучшим источником для учебников, чем я.
возможно, я неправильно понимаю, но разве это не то, что делает сводная таблица? У вас есть данные в таблице или просто отфильтрованный список? Если это не таблица, сделайте ее одной (ctrl+l), если это так, то просто активируйте любую ячейку в таблице и вставьте сводную таблицу на другой лист. Затем добавьте столбцы Фамилия, Имя, номер телефона в раздел строки. Затем добавьте номер телефона в раздел фильтра и отфильтруйте нулевые значения. Теперь вроде как нормально.
Я предлагаю вам взглянуть на MySQL csv storage engine который по существу позволяет загружать любой csv-файл (легко созданный из excel) в базу данных, как только у вас есть это, вы можете использовать любую команду SQL, которую вы хотите.
стоит взглянуть на него.
могу я предложить дать QueryStorm a try-это плагин для Excel, что делает его довольно удобным для использования SQL в Excel.
кроме того, это freemium. Если вы не заботитесь о автозаполнения, кривые ошибки и т. д., Вы можете использовать его бесплатно. Просто скачайте и установите, и у вас есть поддержка SQL в Excel.
отказ от ответственности: я автор.
если у вас GDAL / OGR скомпилированный с библиотекой против экспата, вы можете использовать XLSX драйвер читать .xlsx-файлы и запуск SQL-выражений из командной строки. Например, из osgeo4w оболочка в том же каталоге, что и электронная таблица, используйте ogrinfo утилиты:
ogrinfo -dialect sqlite -sql "SELECT name, count(*) FROM sheet1 GROUP BY name" Book1.xlsxбудет работать SQLite запрос
sheet1, и вывести результат запроса в необычном форма:INFO: Open of `Book1.xlsx' using driver `XLSX' successful. Layer name: SELECT Geometry: None Feature Count: 36 Layer SRS WKT: (unknown) name: String (0.0) count(*): Integer (0.0) OGRFeature(SELECT):0 name (String) = Red count(*) (Integer) = 849 OGRFeature(SELECT):1 name (String) = Green count(*) (Integer) = 265 ...или выполнить тот же запрос с помощью ogr2ogr сделать простой CSV file:
$ ogr2ogr -f CSV out.csv -dialect sqlite \ -sql "SELECT name, count(*) FROM sheet1 GROUP BY name" Book1.xlsx $ cat out.csv name,count(*) Red,849 Green,265 ...делать то же самое со старыми .xls файлы, вам понадобится драйвер XLS, построенный против библиотеки FreeXL, которая не очень распространена (например, не из OSGeo4w).
Comments