2013-07-19 28 views
5

Tôi đang cố gắng truy vấn tên được xác định trong phạm vi trang tính với SQL bằng ODBC.Tên bảng cho tên được xác định trong phạm vi trang tính là gì?

tôi đã biết rằng công trình này:

SELECT * FROM [worksheet1$]  -- Query a whole worksheet 
SELECT * FROM [worksheet1$A1:C10] -- Query A1:C10 of a worksheet 
SELECT * FROM myname    -- Query a workbook scoped defined name 

Lưu ý rằng myname là workbook scoped và không bảng scoped.

tôi lại có thể ngờ rằng một cái gì đó giống như trong công thức Excel làm việc cho tên bảng ODBC cũng như:

SELECT * FROM worksheet1!myname -- Query a worksheet scoped defined name 

Tuy nhiên điều này không làm việc, tôi đã cố gắng một số biến thể cú pháp về điều này.

Điều này có khả thi không và nếu có, cú pháp sẽ sử dụng là gì?

Lưu ý cho các nhà phát triển Delphi: Cú pháp A1:C10 gây rắc rối trong TADOQuery, bạn phải thiết lập ParamCheck-False theo thứ tự để làm việc này.

Cập nhật:

Tôi đang sử dụng Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) Version 12.00.6606.1000 mà đi kèm với Microsoft Office 2007.

Tôi đã kiểm tra rằng các thành phần cơ sở dữ liệu Delphi Tôi đang sử dụng đang hành xử theo cách tương tự như Microsoft Query và Microsoft Access 2007.

+0

Một giả định rằng '[worksheet1 $ myname]' không hoạt động? – eggyal

+1

Bạn đã thử điều này từ Delphi chỉ, hoặc cũng từ một trong các sản phẩm MS Office khác? Ví dụ: MS Access? –

+0

@eggyal Công trình này, nhưng chỉ trong phiên bản 14 (và mới hơn) của trình điều khiển ODBC khi tôi phát hiện ra bằng thử và lỗi. –

Trả lời

1

Giả sử bạn có một file Excel (xlsx trong trường hợp của tôi) có tên sau đây (Excel công thức ký hiệu):

  • myname
  • worksheet1!myname
  • worksheet2!myname

các phiên bản khác nhau trình điều khiển ODBC của Excel có hành vi khác nhau:

Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) Phiên bản 12 đi kèm với Microsoft Office 2007 hoạt động như sau:

Các không gian tên được làm phẳng.

Tất cả những gì bạn có thể truy vấn là SELECT * FROM myname. Rõ ràng điều này trả về dữ liệu từ tên đầu tiên được xác định.

Các Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb) Version 14 mà đi kèm với Microsoft Office 2010 (and can be downloaded separatly from Microsoft) cư xử như thế này:

Bạn có thể thực sự truy vấn cả ba trong số họ:

SELECT * FROM myname 
SELECT * FROM [worksheet1$myname] 
SELECT * FROM [worksheet2$myname] 

Vì vậy, đây được rõ ràng cố định trong Microsoft Office 2010.

Khắc phục không tương thích ngược. Khi bạn đã có một tên trang tính được định nghĩa trong năm 2007, bạn có thể truy vấn nó bằng cú pháp myname chỉ hoạt động cho tên bảng tính trong năm 2010. Vì vậy, cần thận trọng khi xử lý tình trạng này trên các phiên bản Office khác nhau.

Lưu ý: Nếu liên kết tải xuống đã từng chết, hãy tìm kiếm Microsoft Access Database Engine 2010 Redistributable.

1

Thử cách sau để giúp bạn tìm ra tên Delphi đang tìm kiếm.

  1. Thả hộp tổ hợp trên biểu mẫu.
  2. Chạy mã sau để điền vào hộp tổ hợp có tên Delphi sẽ chấp nhận: AdoConnection1.GetTableNames(ComboBox1.Items,True);
  3. Chạy ứng dụng. Combobox sẽ cung cấp cho bạn một danh sách các tên có thể truy vấn.

Sử dụng Delphi XE2 và Office 2010 (tệp excel được lưu dưới dạng văn phòng 97 xls) Tôi đã tạo một phạm vi có tên trang tính (sheet1! Numberlist) và chạy truy vấn ADO trong Delphi. Truy vấn là SELECT * FROM [sheet1$numberlist]. Có lẽ đó là trình điều khiển ODBC của bạn?

+0

Có các trình điều khiển ODBC thực sự khác nhau, tôi sẽ kiểm tra điều này. Cuộc gọi GetTableNames là một ý tưởng hay. –

+0

Trình điều khiển tôi đang sử dụng là 'Trình điều khiển Microsoft Excel (* .xls, * .xlsx, * .xlsm, * .xlsb) 'Phiên bản' 12.00.6606.1000' –

+0

Cú pháp của bạn hoạt động trong Office 2010 trở lên, xem câu trả lời của tôi. –

Các vấn đề liên quan