Как выполнить SQL-запрос в таблице Excel?



Я пытаюсь создать подтаблицу из другой таблицы всех полей фамилии, отсортированных A-Z, которые имеют поле номера телефона, которое не является нулевым. Я мог бы сделать это довольно легко с SQL, но я понятия не имею, как запустить SQL-запрос в Excel. У меня возникает соблазн импортировать данные в postgresql и просто запросить их там, но это кажется немного чрезмерным.



для того, что я пытаюсь сделать, SQL-запрос SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastname будет делать трюк. Это кажется слишком простым для того, чтобы быть чем-то что Excel не может изначально. Как я могу запустить SQL-запрос, как это из Excel?

1605   11  

11 ответов:

есть много прекрасных способов сделать это, которые другие уже предложили. Следуя вдоль "получить данные в Excel через SQL-трек", вот несколько советов.

  1. Excel имеет "мастер подключения к данным", который позволяет импортировать или связать из другого источника данных или даже в том же файле Excel.

  2. в составе Microsoft Office (и ОС) есть два поставщика интересов: старый "Microsoft.Реактивный.OLEDB", и самые последние "Microsoft.ТУЗ.OLEDB". Ищите их при настройке соединения (например, с помощью мастера подключения к данным).

  3. после подключения к книге Excel рабочий лист или диапазон является эквивалентом таблицы или представления. Имя таблицы рабочего листа - это имя рабочего листа со знаком доллара ( " $ " ), добавленным к нему и заключенным в квадратные скобки ("[" и "]"); диапазона, это просто имя диапазона. Чтобы указать безымянный диапазон ячеек в качестве источника записей, добавьте стандартные обозначения строк/столбцов Excel в конце имени листа в квадратных скобках.

  4. родной SQL будет (более или менее) SQL Microsoft Access. (В прошлом он назывался JET SQL; однако Access SQL эволюционировал, и я считаю, что JET является устаревшей старой технологией.)

  5. пример чтения рабочего листа: выберите * из [Sheet1$]

  6. пример, чтение диапазона: SELECT * FROM Мой_диапазон

  7. пример чтения безымянного диапазона ячеек: SELECT * FROM [Sheet1$A1: B10]

  8. есть много много много книг и веб-сайтов, доступных, чтобы помочь вам работать через детали.

=== дополнительные примечания ===

предупреждение об указании листов: поставщик предполагает, что ваша таблица данных начинается с самой верхней, самой левой, непустой ячейки на указанном листе. Другими словами, ваша таблица данных может начинаться в строке 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

вы можете сделать это изначально следующим образом:

  1. выберите таблицу и используйте Excel, чтобы отсортировать ее по фамилии
  2. создайте 2-строчный по 1-столбцу расширенный критерий фильтра, скажем в E1 и E2, где E1 пуст, а E2 содержит формулу =C6="" где C6-первая ячейка данных столбца номер телефона.
  3. выберите таблицу и используйте расширенный фильтр, скопируйте в диапазон, используя диапазон критериев в 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 в таблицах на листе.

но вы можете сделать все, что вы просите сделать без каких-либо формул просто фильтры.

  1. щелкните в любом месте в пределах вы смотрите на
  2. перейти к данным на ленте
  3. выберите фильтр"" его около середины и выглядит как воронка
    • теперь у вас будут стрелки на плотной стороне каждой ячейки в первой строке таблицы
  4. нажмите стрелку на номер телефона и снимите флажок пустые (последнее вариант)
  5. нажмите стрелку на фамилию и выберите-Z на заказ (верхний вариант)

иметь, чтобы играть вокруг.. некоторые вещи, чтобы отметить:

  1. вы можете выбрать отфильтрованные строки и вставить их в другом месте
  2. в строке состояния слева вы увидите, сколько строк вам критериям отфильтровать из общего числа строк. (например, 308 из 313 найденных записей)
  3. вы можете фильтровать по цвету в excel 2010 on подопечные
  4. иногда я создаю вычисляемые столбцы, которые дают статусы или очищенные версии данных, которые затем можно фильтровать или Сортировать по тезисам. (например, как формулы в других ответах)

сделайте это с помощью фильтров, если вы не собираетесь делать это много или вы хотите автоматизировать импорт данных где-то или что-то.. но для полноты картины:

опция 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

    Ничего не найдено.