Làm cách nào để chạy truy vấn SQL trên bảng Excel?


81

Tôi đang cố gắng tạo một bảng phụ từ một bảng khác gồm tất cả các trường họ được sắp xếp AZ có trường số điện thoại không rỗng. Tôi có thể làm điều này khá dễ dàng với SQL, nhưng tôi không biết cách chạy truy vấn SQL trong Excel. Tôi muốn nhập dữ liệu vào postgresql và chỉ cần truy vấn nó ở đó, nhưng điều đó có vẻ hơi quá mức.

Đối với những gì tôi đang cố gắng làm, truy vấn SQL SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastnamesẽ thực hiện thủ thuật. Nó có vẻ quá đơn giản để trở thành thứ mà Excel không thể làm được. Làm cách nào để chạy một truy vấn SQL như thế này từ trong Excel?


Bạn có muốn thực hiện việc này trong chính SQL hay từ trong một ứng dụng không?
John Bingham

2
Tôi đã điều tra này khá kỹ lưỡng và đã viết lên những phát hiện tại exceldevelopmentplatform.blogspot.com/2018/10/...
S Meaden

Câu trả lời:


69

Có nhiều cách tốt để hoàn thành việc này, mà những cách khác đã gợi ý. Sau đây là "lấy dữ liệu Excel thông qua theo dõi SQL", đây là một số gợi ý.

  1. Excel có "Trình hướng dẫn Kết nối Dữ liệu" cho phép bạn nhập hoặc liên kết từ một nguồn dữ liệu khác hoặc thậm chí trong cùng một tệp Excel.

  2. Là một phần của Microsoft Office (và OS) là hai nhà cung cấp được quan tâm: "Microsoft.Jet.OLEDB" cũ và "Microsoft.ACE.OLEDB" mới nhất. Tìm chúng khi thiết lập kết nối (chẳng hạn như với Trình hướng dẫn kết nối dữ liệu).

  3. Sau khi được kết nối với sổ làm việc Excel, một trang tính hoặc phạm vi tương đương với một bảng hoặc dạng xem. Tên bảng của một trang tính là tên của trang tính có thêm dấu đô la ("$") và được bao quanh bởi dấu ngoặc vuông ("[" và "]"); của một phạm vi, nó chỉ đơn giản là tên của phạm vi. Để chỉ định một dải ô chưa được đặt tên làm nguồn bản ghi của bạn, hãy nối ký hiệu hàng / cột chuẩn của Excel vào cuối tên trang tính trong dấu ngoặc vuông.

  4. SQL gốc sẽ (ít nhiều sẽ là) SQL của Microsoft Access. (Trước đây, nó được gọi là JET SQL; tuy nhiên Access SQL đã phát triển và tôi tin rằng JET không còn được dùng trong công nghệ cũ nữa.)

  5. Ví dụ, đọc một trang tính: SELECT * FROM [Sheet1$]

  6. Ví dụ, đọc một phạm vi: SELECT * FROM MyRange

  7. Ví dụ, đọc một dải ô không được đặt tên: SELECT * FROM [Sheet1$A1:B10]

  8. Có rất nhiều sách và trang web có sẵn để giúp bạn làm việc thông qua các chi tiết.

=== Ghi chú thêm ===

Theo mặc định, giả định rằng hàng đầu tiên của nguồn dữ liệu Excel của bạn chứa các tiêu đề cột có thể được sử dụng làm tên trường. Nếu không đúng như vậy, bạn phải tắt cài đặt này, nếu không hàng dữ liệu đầu tiên của bạn "biến mất" để được sử dụng làm tên trường. Điều này được thực hiện bằng cách thêm tùy chọn HDR= settingvào Thuộc tính mở rộng của chuỗi kết nối. Giá trị mặc định, không cần phải chỉ định, là HDR=Yes. Nếu bạn không có tiêu đề cột, bạn cần chỉ định HDR=No; nhà cung cấp đặt tên cho các trường của bạn là F1, F2, v.v.

Thận trọng khi chỉ định trang tính: Nhà cung cấp giả định rằng bảng dữ liệu của bạn bắt đầu bằng ô trống trên cùng, ngoài cùng bên trái, không trống trên trang tính được chỉ định. Nói cách khác, bảng dữ liệu của bạn có thể bắt đầu ở Hàng 3, Cột C mà không có vấn đề gì. Tuy nhiên, ví dụ: bạn không thể nhập tiêu đề tập hợp ở trên và bên trái dữ liệu trong ô A1.

Lưu ý khi chỉ định phạm vi: Khi bạn chỉ định trang tính làm nguồn bản ghi của mình, nhà cung cấp sẽ thêm các bản ghi mới bên dưới các bản ghi hiện có trong trang tính khi không gian cho phép. Khi bạn chỉ định một phạm vi (có tên hoặc chưa đặt tên), Jet cũng thêm các bản ghi mới bên dưới các bản ghi hiện có trong phạm vi khi không gian cho phép. Tuy nhiên, nếu bạn yêu cầu trên phạm vi ban đầu, tập hợp bản ghi kết quả không bao gồm các bản ghi mới được thêm bên ngoài phạm vi.

Các kiểu dữ liệu (giá trị cố gắng) cho C REATE TABLE: Short, Long, Single, Double, Currency, DateTime, Bit, Byte, GUID, BigBinary, LongBinary, VarBinary, LongText, VarChar, Decimal.

Kết nối với "công nghệ cũ" Excel (các tệp có gia hạn xls): Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyFolder\MyWorkbook.xls;Extended Properties=Excel 8.0;. Sử dụng kiểu cơ sở dữ liệu nguồn Excel 5.0 cho sổ làm việc Microsoft Excel 5.0 và 7.0 (95) và sử dụng kiểu cơ sở dữ liệu nguồn Excel 8.0 cho sổ làm việc Microsoft Excel 8.0 (97), 9.0 (2000) và 10.0 (2002).

Kết nối với Excel "mới nhất" (tệp có phần mở rộng tệp xlsx): Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;"

Xử lý dữ liệu dưới dạng văn bản: Cài đặt IMEX coi tất cả dữ liệu là văn bản. Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";

(Thêm chi tiết tại http://www.connectionstrings.com/excel )

Thông tin thêm tại http://msdn.microsoft.com/en-US/library/ms141683(v=sql.90).aspx và tại http://support.microsoft.com/kb/316934

Kết nối với Excel qua ADODB qua VBA chi tiết tại http://support.microsoft.com/kb/257819

Chi tiết về Microsoft JET 4 tại http://support.microsoft.com/kb/275561


4
Kết nối dữ liệu yêu cầu một tên tệp, đây là một nút hiển thị khi nhiệm vụ là truy vấn tệp hiện tại. Hơn nữa, một truy vấn không thể được sử dụng giống như cách một công thức có thể, bạn chỉ có thể sử dụng một truy vấn cố định để điền một phạm vi; và nó không được cập nhật tự động. Vì vậy, nó không thể sử dụng để truy vấn tệp hiện tại và không thể sử dụng như là một thay thế cho các công thức.
ivan_pozdeev

2
@ivan_pozdeev Tôi vừa xác nhận với bản thân bằng Excel 2010 rằng người ta có thể truy vấn tệp hiện tại; Tôi không biết liệu các phiên bản Excel / Office sau này có làm cho điều này không còn khả thi hay không. Tôi đồng ý rằng việc tạo bảng tự tham chiếu thông qua Trình hướng dẫn kết nối dữ liệu là không hợp lý - phần lớn là do kết nối được thực hiện bằng cách sử dụng đường dẫn đầy đủ đến sổ làm việc, vì vậy việc đổi tên / sao chép / di chuyển sổ làm việc sẽ dẫn đến phá vỡ nó hoặc kết quả khó hiểu. Tuy nhiên, đối với các sổ làm việc mà việc sử dụng VBA không phải là một vấn đề, thì việc truy vấn tự tham chiếu rất dễ quản lý.
rskar

@ivan_pozdeev Tôi cũng đồng ý rằng Excel không được tối ưu hóa để tự động làm mới các bảng tự tham chiếu; giả định luôn là dữ liệu có nguồn gốc bên ngoài. Có thể tự động làm mới thông qua tab Sử dụng của Thuộc tính kết nối (như tải lại sau mỗi phút) và với VBA, người ta có thể khai thác các sự kiện tính toán lại. Tuy nhiên, tôi không tin rằng tôi đã từng bán quá mức này để thay thế cho công thức.
rskar

2
"Có rất nhiều cách tốt để hoàn thành việc này" - nếu điều đó không che lấp những sai sót lớn mà tất cả những cách "tốt" này thực sự có đối với trường hợp sử dụng được yêu cầu ( thứ ngăn cản việc sử dụng rộng rãi của chúng), tôi không biết đó là gì.
ivan_pozdeev 20/08/2018

8

tl; dr; Excel thực hiện tất cả những điều này một cách nguyên bản - sử dụng bộ lọc và hoặc bảng

( http://office.microsoft.com/en-gb/excel-help/filter-data-in-an-excel-table-HA102840028.aspx )

Bạn có thể mở excel theo chương trình thông qua kết nối oledb và thực thi SQL trên các bảng trong trang tính.

Nhưng bạn có thể làm mọi thứ bạn yêu cầu mà không cần công thức chỉ có bộ lọc.

  1. nhấp vào bất kỳ đâu trong dữ liệu bạn đang xem
  2. chuyển đến dữ liệu trên thanh ribbon
  3. chọn "Lọc" nó nằm ở giữa và trông giống như một cái phễu
    • bạn sẽ có các mũi tên ở phía bên tay chặt chẽ của mỗi ô trong hàng đầu tiên của bảng của bạn ngay bây giờ
  4. nhấp vào mũi tên trên số điện thoại và bỏ chọn khoảng trống (tùy chọn cuối cùng)
  5. nhấp vào mũi tên trên họ và chọn thứ tự az (tùy chọn trên cùng)

vui chơi xung quanh .. một số điều cần lưu ý:

  1. bạn có thể chọn các hàng đã lọc và dán chúng ở một nơi khác
  2. trong thanh trạng thái bên trái, bạn sẽ thấy có bao nhiêu hàng đáp ứng tiêu chí lọc của bạn trong tổng số hàng. (ví dụ: 308 trong số 313 bản ghi được tìm thấy)
  3. bạn có thể lọc theo màu trong excel 2010 trên phường
  4. Đôi khi tôi tạo các cột được tính toán cung cấp trạng thái hoặc phiên bản dữ liệu đã được làm sạch, sau đó bạn cũng có thể lọc hoặc sắp xếp theo chủ đề. (ví dụ như các công thức trong các câu trả lời khác)

LÀM với bộ lọc trừ khi bạn định làm nhiều hoặc bạn muốn tự động nhập dữ liệu ở đâu đó hoặc thứ gì đó .. nhưng để hoàn chỉnh:

Tùy chọn 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();

một nơi hữu ích để bắt đầu là xem qua lược đồ vì có thể có nhiều thứ hơn bạn nghĩ:

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());
    }
}

sau đó khi bạn muốn truy vấn một trang tính:

 OleDbDataAdapter da = new OleDbDataAdapter("select * from [" + sheet + "]", ExcelFile);
 dt = new DataTable();
  da.Fill(dt);

LƯU Ý - Sử dụng Bảng trong excel !:

Excel có chức năng "bảng" làm cho dữ liệu hoạt động giống một bảng hơn .. điều này mang lại cho bạn một số lợi ích tuyệt vời nhưng sẽ không cho phép bạn thực hiện mọi loại truy vấn.

http://office.microsoft.com/en-gb/excel-help/overview-of-excel-tables-HA010048546.aspx

Đối với dữ liệu dạng bảng trong excel, đây là mặc định của tôi .. điều đầu tiên tôi làm là nhấp vào dữ liệu sau đó chọn "định dạng dưới dạng bảng" từ phần trang chủ trên ruy-băng. điều này cho phép bạn lọc và sắp xếp theo mặc định và cho phép bạn truy cập bảng và các trường theo tên (ví dụ: bảng [tên trường]), điều này cũng cho phép các hàm tổng hợp trên các cột, ví dụ: tối đa và trung bình


nếu bạn muốn giảm số cột, cá nhân tôi sẽ sao chép các hàng đã lọc sang một trang tính mới và xóa các cột tôi không cần. bạn có thể ẩn chúng nhưng hiếm khi đáng giá.

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

1
Tôi lọc mỗi ngày và c # để truy cập bảng tính một vài lần một tuần. khi sử dụng c #, nó có xu hướng nhập dữ liệu vào db để thực sự chơi với nó..để thực sự truy vấn bộ lọc hoặc sql của nó khi dữ liệu ở trong máy chủ sql không thực sự đáng để thực hiện ở cấp độ sql trung cấp đến excel.

7

Bạn có thể làm điều này nguyên bản như sau:

  1. Chọn bảng và sử dụng Excel để sắp xếp theo Họ
  2. Tạo tiêu chí bộ lọc nâng cao 2 hàng x 1 cột, giả sử trong E1 và E2, trong đó E1 trống và E2 chứa công thức =C6="" trong đó C6 là ô dữ liệu đầu tiên của cột số điện thoại.
  3. Chọn bảng và sử dụng bộ lọc nâng cao, sao chép vào một phạm vi, sử dụng phạm vi tiêu chí trong E1: E2 và chỉ định nơi bạn muốn sao chép đầu ra vào

Nếu bạn muốn thực hiện việc này theo chương trình, tôi khuyên bạn nên sử dụng Trình ghi Macro để ghi lại các bước trên và xem mã.


8
Câu hỏi chỉ định SQL.
S Meaden

4

Bạn có thể sử dụng SQL trong Excel. Nó chỉ được giấu kỹ. Xem hướng dẫn này:

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


2
Tuy nhiên, có vẻ như nó đang sử dụng SQL để chọn dữ liệu nhập vào Excel chứ không phải chạy các truy vấn đối với bảng tính hiện tại?
Rup

Bạn chỉ cần tạo tên cho từng bảng trong excel (trong trình quản lý tên) hoặc chỉ cần chọn bảng và nhập tên vào hộp nơi hiển thị địa chỉ ô. Sau đó, bạn có thể sử dụng nó để truy vấn trang tính. Trong truy vấn mà bạn đã có địa chỉ đầy đủ của tấm, vì vậy trong trường hợp bạn di chuyển các bảng tính ở những nơi khác trên đĩa của bạn, truy vấn sẽ không làm việc
Petrik

3

Tôi có thể khuyên bạn nên dùng thử QueryStorm - đó là một plugin cho Excel giúp sử dụng SQL trong Excel khá thuận tiện.

Ngoài ra, nó là miễn phí. Nếu bạn không quan tâm đến tính năng tự động hoàn thành, lỗi bình thường, v.v., bạn có thể sử dụng nó miễn phí. Chỉ cần tải xuống và cài đặt, bạn có hỗ trợ SQL trong Excel.

Disclaimer: Tôi là tác giả.


1
Thật không may, mặc dù đó là một công cụ tuyệt vời, nhưng hiện tại nó dường như chỉ phải trả tiền, ngoại trừ bản dùng thử 30 ngày.
Marc

2

Nếu bạn cần làm điều này một lần, chỉ cần làm theo mô tả của Charles, nhưng cũng có thể thực hiện việc này với các công thức Excel và cột trợ giúp trong trường hợp bạn muốn làm cho bộ lọc động.

Giả sử dữ liệu của bạn nằm trên DataSheet của trang tính và bắt đầu ở hàng 2 của các cột sau:

  • A: họ
  • B: tên đầu tiên
  • C: phonenumber

Bạn cần hai cột trợ giúp trên trang tính này.

  • D2:, =if(A2 = "", 1, 0)đây là cột lọc, tương ứng với điều kiện ở đâu của bạn
  • E2:, =if(D2 <> 1, "", sumifs(D$2:D$1048576, A$2:A$1048576, "<"&A2) + sumifs(D$2:D2, A$2:A2, A2))điều này tương ứng với thứ tự của

Sao chép các công thức này trong phạm vi dữ liệu của bạn.

Trên trang tính sẽ hiển thị kết quả của bạn, hãy tạo các cột sau.

  • A: Một dãy số bắt đầu bằng 1 trong hàng 2, điều này giới hạn tổng số hàng bạn có thể nhận được (giống như giới hạn trong phần tiếp theo)
  • B2:, =match(A2, DataSheet!$E$2:$E$1048576, 0)đây là hàng của dữ liệu tương ứng
  • C2:, =iferror(index(DataSheet!A$2:A$1048576, $B2), "")đây là dữ liệu thực tế hoặc trống nếu không có dữ liệu

Sao chép các công thức trong B2 và C2 và sao chép quá khứ cột C sang D và E.


-1

Bạn có thể thử nghiệm với trình điều khiển DB gốc cho Excel bằng ngôn ngữ / nền tảng bạn chọn. Trong thế giới Java, bạn có thể thử với http://code.google.com/p/sqlsheet/ cung cấp trình điều khiển JDBC để làm việc trực tiếp với trang tính Excel. Tương tự, bạn có thể lấy trình điều khiển cho công nghệ DB cho các nền tảng khác.

Tuy nhiên, tôi có thể đảm bảo rằng bạn sẽ sớm gặp khó khăn với số lượng các tính năng mà các thư viện trình bao bọc này cung cấp. Cách tốt hơn sẽ là sử dụng Apache HSSF / POI hoặc cấp độ thư viện tương tự nhưng sẽ cần nhiều nỗ lực mã hóa hơn.


-1

Tôi có thể hiểu lầm tôi, nhưng đây không phải chính xác là những gì một bảng tổng hợp làm? Bạn có dữ liệu trong một bảng hay chỉ một danh sách được lọc? Nếu nó không phải là một bảng, hãy làm cho nó trở thành một (ctrl + l) nếu có, sau đó chỉ cần kích hoạt bất kỳ ô nào trong bảng và chèn một bảng tổng hợp trên một trang tính khác. Sau đó Thêm các cột họ, tên, số điện thoại vào phần hàng. Sau đó Thêm số điện thoại vào phần bộ lọc và lọc ra các giá trị rỗng. Bây giờ Sắp xếp như bình thường.


-1

Tôi khuyên bạn nên xem qua công cụ lưu trữ csv MySQL , về cơ bản cho phép bạn tải bất kỳ tệp csv nào (dễ dàng tạo từ excel) vào cơ sở dữ liệu, khi bạn có, bạn có thể sử dụng bất kỳ lệnh SQL nào bạn muốn.

Nó đáng để có một cái nhìn vào nó.


-1

Nếu bạn đã biên dịch GDAL / OGR với thư viện Expat, bạn có thể sử dụng trình điều khiển XLSX để đọc tệp .xlsx và chạy biểu thức SQL từ dấu nhắc lệnh. Ví dụ: từ một trình bao osgeo4w trong cùng thư mục với bảng tính, hãy sử dụng tiện ích ogrinfo :

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

sẽ chạy truy vấn SQLite trên sheet1và xuất kết quả truy vấn ở dạng bất thường:

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

Hoặc chạy cùng một truy vấn bằng cách sử dụng ogr2ogr để tạo một tệp CSV đơn giản :

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

Để làm tương tự với các tệp .xls cũ hơn, bạn sẽ cần trình điều khiển XLS , được xây dựng dựa trên thư viện FreeXL, điều này không thực sự phổ biến (ví dụ: không phải từ OSGeo4w).


-2

Microsoft Access và LibreOffice Base có thể mở bảng tính dưới dạng nguồn và chạy các truy vấn sql trên đó. Đó sẽ là cách dễ nhất để chạy tất cả các loại truy vấn và tránh sự lộn xộn khi chạy macro hoặc viết mã.

Excel cũng có bộ lọc tự động và sắp xếp dữ liệu sẽ thực hiện rất nhiều truy vấn đơn giản như ví dụ của bạn. Nếu bạn cần trợ giúp về những tính năng đó, Google sẽ là nguồn hướng dẫn tốt hơn tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.