Як запустити запит SQL на таблиці Excel?


83

Я намагаюся створити підтаблицю з іншої таблиці всіх полів прізвища, відсортованих AZ, які мають поле телефонного номера, яке не є нульовим. Я міг би зробити це досить просто з SQL, але я не маю уявлення, як запустити SQL-запит в Excel. Я маю спокусу імпортувати дані у postgresql і просто запитати їх там, але це здається трохи надмірним.

Що стосується того, що я намагаюся зробити, запит SQL SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastnameзробив би трюк. Це здається занадто простим, щоб це було щось, чого Excel не може зробити власним чином. Як я можу запустити такий запит SQL із програми Excel?


Ви хочете робити це в самому SQL або в додатку?
Джон Бінгем,

2
Я дослідив це досить ретельно і виклав
S Meaden

Відповіді:


70

Є багато чудових способів зробити це, про що вже пропонували інші. Продовжуючи "отримувати дані Excel за допомогою доріжки SQL", ось кілька підказок.

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

  2. У складі Microsoft Office (та ОС) є два провайдери, що представляють інтерес: старий "Microsoft.Jet.OLEDB" та останній "Microsoft.ACE.OLEDB". Шукайте їх під час встановлення з’єднання (наприклад, за допомогою майстра підключення даних).

  3. Після підключення до книги Excel робочий аркуш або діапазон є еквівалентом таблиці або подання. Назва таблиці робочого аркуша - це назва робочого аркуша із доданим до нього знаком долара ("$") та оточеним квадратними дужками ("[" та "]"); діапазону, це просто назва діапазону. Щоб вказати безіменний діапазон комірок як джерело записів, додайте стандартну нотацію рядків / стовпців Excel до кінця імені аркуша в квадратних дужках.

  4. Власний SQL буде (більш-менш таким) SQL Microsoft Access. (Раніше він називався JET SQL; однак Access SQL еволюціонував, і я вважаю, що JET застаріла стара техніка.)

  5. Приклад, читання робочого аркуша: SELECT * FROM [Sheet1$]

  6. Приклад, читання діапазону: SELECT * FROM MyRange

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

  8. Існує багато багатьох книг та веб-сайтів, які допоможуть вам пропрацювати деталі.

=== Подальші примітки ===

За замовчуванням передбачається, що перший рядок джерела даних Excel містить заголовки стовпців, які можна використовувати як імена полів. Якщо це не так, вам слід вимкнути це налаштування, або ваш перший рядок даних "зникне", щоб використовуватись як імена полів. Це робиться шляхом додавання необов’язкового HDR= settingдо розширених властивостей рядка підключення. За замовчуванням, яке не потрібно вказувати, є HDR=Yes. Якщо у вас немає заголовків стовпців, потрібно вказати HDR=No; постачальник називає ваші поля F1, F2 тощо.

Застереження щодо визначення робочих аркушів. Постачальник припускає, що ваша таблиця даних починається з самої верхньої, самої лівої, не порожньої комірки на вказаному аркуші. Іншими словами, ваша таблиця даних може починатися з рядка 3, стовпець C без проблем. Однак ви не можете, наприклад, ввести заголовок робочого аркуша зверху та ліворуч від даних у комірці А1.

Застереження щодо вказівки діапазонів. Коли ви вказуєте робочий аркуш як джерело записів, постачальник додає нові записи нижче існуючих записів на аркуші, як дозволяє місце. Коли ви вказуєте діапазон (з іменем чи без імені), Jet також додає нові записи нижче існуючих записів у діапазоні, як дозволяє простір. Однак якщо ви вимагаєте вихідний діапазон, отриманий набір записів не включає нещодавно додані записи поза діапазоном.

Типи даних (варто спробувати) для C REATE TABLE: Short, Long, Single, Double, Currency, DateTime, Bit, Byte, GUID, BigBinary, LongBinary, VarBinary, LongText, VarChar, Decimal.

Підключення до «старої» технологій 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 обробляє всі дані як текст. Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";

(Детальніше на http://www.connectionstrings.com/excel )

Більше інформації на веб- сайті http://msdn.microsoft.com/en-US/library/ms141683(v=sql.90).aspx та на веб-сайті http://support.microsoft.com/kb/316934

Підключення до Excel через ADODB через VBA, деталізовано на веб-сторінці http://support.microsoft.com/kb/257819

Подробиці про Microsoft JET 4 за адресою http://support.microsoft.com/kb/275561


4
Для з’єднання даних потрібне ім’я файлу, яке є запобіжником, коли завдання полягає в запиті поточного файлу. Більше того, запит не можна використовувати так само, як формула, ви можете використовувати лише фіксований запит для заповнення діапазону; і воно не оновлюється автоматично. Отже, неможливо здійснити запит до поточного файлу та не можна використовувати як випадаючу заміну формул.
ivan_pozdeev

2
@ivan_pozdeev Я щойно підтвердив для себе, використовуючи Excel 2010, що можна запитувати поточний файл; Я не знаю, чи пізніші версії Excel / Office роблять це вже неможливим. Я б погодився, що створення самореференційних таблиць за допомогою Майстра підключення даних є незграбним - здебільшого тому, що підключення здійснюється з використанням повного шляху до книги, тому перейменування / копіювання / переміщення книги призведе до її злому або заплутування результатів. Однак для книг, де використання VBA не є проблемою, самореференційний запит є дуже керованим.
rskar

@ivan_pozdeev Я б також погодився з тим, що Excel не оптимізований для автоматичного оновлення самореференційних таблиць; презумпція - це завжди зовнішні дані. Автообновлення можливо на вкладці Використання у властивостях підключення (як при перезавантаженні через кожні стільки хвилин), а за допомогою VBA можна підключити події перерахунку. Тим не менше, я не вірю, що коли-небудь перепродавав це як заміну формул.
rskar

2
"Є багато прекрасних способів зробити це" - якщо це не затьмарює основні вади, які насправді мають усі ці "прекрасні" способи для запитуваного випадку використання (а саме це перешкоджає їх широкому використанню), я не знаю, що є.
ivan_pozdeev

8

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. клацніть стрілку на прізвищі та виберіть az порядок (верхній варіант)

пограти .. деякі речі, на які слід звернути увагу:

  1. Ви можете вибрати відфільтровані рядки та вставити їх в інше місце
  2. у рядку стану зліва ви побачите, скільки рядків відповідає критеріям фільтрації із загальної кількості рядків. (наприклад, 308 з 313 записів знайдено)
  3. ви можете відфільтрувати за кольором у Excel 2010 на палатах
  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 це моє за замовчуванням .. перше, що я роблю, це натиснути на дані, а потім вибрати "форматувати як таблицю" з головного розділу на стрічці. це дає вам можливість фільтрування та сортування за замовчуванням, а також дозволяє отримати доступ до таблиці та полів за іменами (наприклад, таблиця [ім'я поля]), це також дозволяє сукупні функції у стовпцях, наприклад, макс. та середнє


якщо ви хочете зменшити стовпці, я особисто скопіюю відфільтровані рядки на новий аркуш і видалю не потрібні мені стовпці. ви могли їх сховати, але це рідко того варте.

1
using System.Data.OleDb; using System.Data;

1
Я фільтрую кожен день і c #, щоб отримати доступ до електронних таблиць кілька разів на тиждень. при використанні c # це, як правило, імпорт даних у базу даних, щоб по-справжньому грати з ним ... для фактичного запиту його фільтрів або sql, коли дані перебувають на сервері sql, насправді не варто робити на проміжному рівні sql до рівня excel.

7

Ви можете зробити це безпосередньо наступним чином:

  1. Виділіть таблицю та за допомогою Excel сортуйте її за прізвищем
  2. Створіть розширений критерій фільтрації на 2 рядки на 1 стовпець, скажімо в E1 та E2, де E1 порожній, а E2 містить формулу, =C6="" де C6 є першою коміркою даних стовпця телефонного номера.
  3. Виберіть таблицю та скористайтеся розширеним фільтром, скопіюйте в діапазон, використовуючи діапазон критеріїв у E1: E2 і вкажіть, куди потрібно скопіювати вихідні дані

Якщо ви хочете зробити це програмно, я пропоную вам використовувати Макрореєстратор для запису вищевказаних кроків і перегляду коду.


8
Питання вказує SQL.
S Meaden

4

Ви можете використовувати SQL в Excel. Це лише добре приховано. Дивіться цей підручник:

http://smallbusiness.chron.com/use-sql-statements-ms-excel-41193.html


3
Схоже, він використовує SQL для вибору даних для імпорту в Excel, однак, не запускає запити щодо поточної електронної таблиці?
Rup

Вам просто потрібно створити імена для кожної таблиці в Excel (в диспетчері імен) або просто вибрати таблицю та ввести ім'я у поле, де відображається адреса комірки. Тоді ви можете використовувати його для запиту щодо робочого аркуша. У запиті ви отримали повну адресу аркуша, тому, якщо ви перемістите електронну таблицю в інше місце на диску, запит не спрацює
Петрік,

3

Я можу запропонувати спробувати QueryStorm - це плагін для Excel, який робить досить зручним використання SQL в Excel.

Крім того, це Freemium. Якщо ви не дбаєте про автозаповнення, помилки та інші, ви можете використовувати його безкоштовно. Просто завантажте та встановіть, і ви отримаєте підтримку SQL у Excel.

Застереження: Я автор.


1
На жаль, незважаючи на те, що це чудовий інструмент, зараз він видається лише платним, крім 30-денної пробної версії.
Марк

2

Якщо вам потрібно зробити це один раз, просто дотримуйтесь описів Чарльза, але це також можна зробити за допомогою формул Excel та допоміжних стовпців, якщо ви хочете зробити фільтр динамічним.

Припустимо, що ваші дані знаходяться на аркуші DataSheet і починаються з рядка 2 наступних стовпців:

  • В: прізвище
  • Б: ім’я
  • C: номер телефону

На цьому аркуші потрібні дві допоміжні колонки.

  • D2:, =if(A2 = "", 1, 0)це стовпець фільтра, що відповідає вашому умові де
  • E2:, =if(D2 <> 1, "", sumifs(D$2:D$1048576, A$2:A$1048576, "<"&A2) + sumifs(D$2:D2, A$2:A2, A2))це відповідає порядку за

Скопіюйте ці формули, наскільки ваші дані.

На аркуші, який повинен відображати ваш результат, створіть такі стовпці.

  • В: Послідовність чисел, що починаються з 1 у рядку 2, це обмежує загальну кількість рядків, яку ви можете отримати (начебто обмеження в продовженні)
  • B2:, =match(A2, DataSheet!$E$2:$E$1048576, 0)це рядок відповідних даних
  • C2: =iferror(index(DataSheet!A$2:A$1048576, $B2), "")це фактичні дані або порожні, якщо даних немає

Скопіюйте формули в B2 та C2 та скопіюйте стовпець C до D та E.


0

Якщо ви безпосередньо запитуєте файли Excel, спробуйте esProc. Зверніться до https://esprocforbp.medium.com/direct-query-excel-text-files-using-sql-5315788231e4 . Не тільки підтримує звичайний SQL, але також підтримує HAVING групи, Підзапит, Вкладений підзапит, Приєднання, навіть "з ... як" Вираз таблиці, наприклад:

$with A as
(select NAME as DEPT from E:/department.xlsx where NAME='HR' or NAME='Sales') 
select A.DEPT DEPT,count(*) NUM,avg(B.SAL_ARY) AVG_SALARY from A left join E:/employee.xlsx B on A.DEPT=B.DEPT
where B.GENDER='F' group by A.DEPT

Якщо ви хочете зробити запит щодо області в Excel, скопіюйте дані в буфер обміну. Потім esProc отримує таблицю даних, отримуючи доступ до функції буфера обміну, а потім виконує запити до однієї таблиці. Якщо ви хочете зробити запит у декількох областях, скопіюйте кожну область даних у esProc та отримайте кілька таблиць у esProc та виконайте запит із кількома таблицями, як у прикладі.

ЗАМОВЛЕННЯ: Це про наш інструмент esProc. Це Freemium.


-1

Ви можете експериментувати з власним драйвером БД для Excel на вибраній вами мові / платформі. У світі Java ви можете спробувати за допомогою http://code.google.com/p/sqlsheet/, який надає драйвер JDBC для безпосередньої роботи з аркушами Excel. Так само ви можете отримати драйвери для технології БД для інших платформ.

Однак я можу гарантувати, що незабаром ви вдаритеся об стіну кількістю функцій, які надають ці бібліотеки обгортки. Кращим способом буде використання Apache HSSF / POI або аналогічний рівень бібліотеки, але для цього потрібно буде докласти більше зусиль для кодування.


-1

Можливо, я неправильно мене розумію, але хіба це не саме те, що робить зведена таблиця? У вас є дані в таблиці або просто відфільтрований список? Якщо це не таблиця, зробіть її однією (ctrl + l), якщо вона є, тоді просто активуйте будь-яку комірку таблиці та вставте зведену таблицю на інший аркуш. Потім додайте прізвище стовпців, ім’я, номер телефону до розділу рядків. Потім додайте номер телефону до розділу фільтру та відфільтруйте нульові значення. Тепер сортуй як звичайно.


-1

Я пропоную вам поглянути на механізм зберігання CSV MySQL, який, по суті, дозволяє завантажувати будь-який файл CSV (легко створюється з Excel) у базу даних, коли ви це отримаєте, ви можете використовувати будь-яку команду SQL, яку хочете.

Варто поглянути на нього.


-1

Якщо у вас GDAL / OGR, скомпільований із бібліотекою Expat, ви можете використовувати драйвер XLSX для читання файлів .xlsx та запуску виразів SQL із командного рядка. Наприклад, з оболонки osgeo4w в тому ж каталозі, що і електронна таблиця, використовуйте утиліту ogrinfo :

ogrinfo -dialect sqlite -sql "SELECT name, count(*) FROM sheet1 GROUP BY name" Book1.xlsx

буде запускати запит SQLitesheet1 і виводити результат запиту у незвичній формі:

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 :

$ 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).


-2

Microsoft Access і LibreOffice Base можуть відкрити електронну таблицю як джерело та запускати на ній запити sql. Це був би найпростіший спосіб запускати всілякі запити та уникати безладу під час запуску макросів або написання коду.

Excel також має автофільтри та сортування даних, які дозволять виконати багато простих запитів, таких як ваш приклад. Якщо вам потрібна допомога з цими функціями, Google буде кращим джерелом для підручників, ніж я.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.