StringGrid và Excel hoạt động cùng nhau. Truy cập Excel từ Delphi

Nhiều tài liệu được tạo và lưu trữ ở định dạng bảng tính Microsoft Excel. Mặc dù thực tế là các bảng này có khả năng tự động xử lý tài liệu, nhưng chúng tôi, Delphists, cảm thấy dễ chịu hơn nhiều khi làm việc trong một môi trường quen thuộc, nơi cũng có nhiều khả năng phát triển hơn. Hãy xem cách lấy dữ liệu từ Excel. Đương nhiên, chúng ta sẽ đặt dữ liệu dạng bảng vào bảng StringGrid quen thuộc.

Để làm việc với Excel và các chương trình khác từ gói Microsoft Office, bạn phải thêm vào danh sách công dụng Mô-đun ComObj:

đơn vị Bài 1;

giao diện

công dụng
Windows, Tin nhắn, SysUtils, Biến thể, Lớp, Đồ họa, Điều khiển, Biểu mẫu,
Hộp thoại, StdCtrls, Lưới, ComObj;

var
Mẫu1: TForm1;
Excel: Biến thể;

Tiếp theo, bạn cần tạo một đối tượng Excel. Ứng dụng Excel được tạo trống, không có bảng nên bạn cần thêm ít nhất một sổ làm việc. Điều này cần phải được thực hiện trong một số loại trình xử lý, ví dụ như trình xử lý bấm nút, mặc dù bạn có thể thực hiện ngay trong OnCreate của Biểu mẫu:

Excel:=CreateOleObject("Excel.Application");
Excel.Application.WorkBooks.Add("File_Name.xls");

Nếu một sổ làm việc trống được tạo, phương thức Thêm sẽ được áp dụng mà không có tham số - không có tên tệp. Đương nhiên, bạn có thể nhắc người dùng chọn một tệp:

với OpenDialog1 LÀM
nếu như Hành hình sau đó
Excel.Application.WorkBooks.Add(Tên tệp);

Để gỡ lỗi, cần phải hiển thị bảng Excel và tốt hơn hết là bạn nên tắt tính năng đặt câu hỏi về việc lưu dữ liệu khi đóng:

Excel.Visible:=True; // Sau khi gỡ lỗi, bạn có thể nhận xét dòng này
Excel.DisplayAlerts:=False;

Hãy tạo ngay một phương thức để đóng đối tượng Excel, nếu không trong quá trình gỡ lỗi và ngay cả khi người dùng đang làm việc trên máy tính, rất nhiều quy trình Excel vô hình sẽ sinh ra người mẹ thân yêu đó!.. Trong trình xử lý OnCloseQuery của Biểu mẫu, hãy viết:

thử
Excel.Quit;
ngoại trừ
kết thúc;
CanClose:=True;

Đương nhiên, Excel sẽ bị thoát và sau đó toàn bộ ứng dụng sẽ đóng lại. Nhưng nếu chúng ta cần tiếp tục làm việc với chương trình sau khi đóng quy trình Excel thì mã này sẽ được đặt trong trình xử lý bấm nút. Tuy nhiên, trong trường hợp này nó là không đủ. Hãy dùng thử và bạn sẽ thấy khi xem danh sách các quy trình trong Trình quản lý tác vụ rằng quy trình Excel của chúng tôi vẫn hoạt động tốt! Điều này xảy ra vì nó vẫn được liên kết với biến đã tạo ra nó (Excel). Để thực sự hủy bỏ một tiến trình, bạn cần ngắt kết nối này. Hoàn thành đoạn mã trên với dòng:

Excel:=Chưa được gán;

Và khi chúng ta nhấp vào nút đóng, Excel của chúng ta sẽ biến mất khỏi danh sách các quy trình.

Bây giờ bạn cần lấy dữ liệu từ Excel. Trong Excel, các cột được đặt tên bằng các chữ cái, nhưng trong Delphi, chúng tôi gọi chúng như thường lệ, bằng số sê-ri. Xin lưu ý rằng vì trong Delphi chỉ mục cột là chỉ mục đầu tiên trong chỉ mục và trong bảng Excel, chỉ mục hàng là chỉ mục đầu tiên nên các chỉ mục phải được đặt ở những vị trí đối diện nhau. Trong trình xử lý bấm nút:

với ChuỗiGrid1 LÀM
tôi:=1 ĐẾN HàngĐếm-1 LÀM
j:=1 ĐẾN ColCount-1 LÀM
Ô:=Excel.WorkSheets.Item["Sheet1"].Cells;

Một cảnh báo nhỏ: nếu bạn kiểm tra mục nhập dữ liệu trong quá trình gỡ lỗi, thì trước khi nhấn nút của chúng tôi, bạn cần hoàn thành mục nhập vào Excel - nhấn Enter. Suy cho cùng, nếu ô trong bảng Excel vẫn ở chế độ chỉnh sửa thì chúng ta sẽ nhận được lời từ chối từ Excel.
Và xa hơn. Dữ liệu trong Excel được đánh địa chỉ bắt đầu từ 1. Nỗ lực lấy nội dung của các ô cố định không thành công. Vì vậy, nếu cần, các ô cố định trong bảng StringGrid phải được điền riêng.

Và bạn có thể lấy nội dung của một ô bằng cách chỉ định số hàng và số cột hoặc bằng cách chỉ định trực tiếp địa chỉ ô:

var S1, S2: Sợi dây;
bắt đầu
S1:=Excel.WorkSheets.Item["Sheet1"].Cells;
S2:=Excel.WorkSheets.Item["Sheet1"].Range["F5"];
kết thúc;

Biến S1 và S2 sẽ có cùng giá trị.

Bây giờ trong bảng StringGrid, chúng ta có dữ liệu để xử lý và thực hiện những gì chúng ta muốn với dữ liệu đó. Sau đó, bạn có thể chuyển dữ liệu đã xử lý trở lại bảng tính Excel. Việc này được thực hiện theo cách hoàn toàn tương tự, trong trình xử lý nhấp chuột của một nút khác:

tôi:=1 ĐẾN Grid.RowCount-1 LÀM
j:=1 ĐẾN Grid.ColCount-1 LÀM
Excel.WorkSheets.Item["Sheet1"].Cells:=Grid.Cells;

Nếu các thao tác này được thực hiện với một bảng Excel đang hoạt động thì bạn có thể rút ngắn bài viết và thay vào đó:

Excel.WorkSheets.Item["Sheet1"].Cells

Excel.Cells

Hoặc bạn có thể tạo một biến và gán cho nó giá trị của bảng Excel mà bạn đang làm việc:

var Tờ: Biến thể;
S1, S2: Chuỗi;
bắt đầu
Trang tính:=Excel.WorkSheets.Item["Sheet1"];
S1:=Tờ.Cells;
S2:=Sheet.Range["F5"];
kết thúc;

Chỉ cần lưu ý rằng bảng không chỉ có thể chứa dữ liệu trực tiếp trong các ô mà còn chứa cả công thức. Khi ghi dữ liệu từ bảng StringGrid của chúng tôi, mọi thứ ngoại trừ văn bản thực tế đang được viết sẽ bị hủy!

Cuối cùng bạn cần buộc bảng Excel lưu lại dữ liệu đã xử lý:

Excel.ActiveWorkbook.SaveAs("File_Name");// Hoặc SaveAs("OpenDialog1.FileName");

Bạn có thể in báo cáo. Đây là cách xác định chức năng in:

chức năng In ra(
Từ: Biến thể; //Không cần thiết. Số trang bắt đầu in.
Đến: Biến thể; //Không cần thiết. Số trang tiếp tục in.
Bản sao: Biến thể; //Không cần thiết. Số bản sao.
Xem trước: Biến thể; //Không cần thiết. Xem trước ( ĐÚNG VẬY hoặc SAI).
ActivePrinter: Biến thể; //Không cần thiết. Tên của máy in đang hoạt động.
PrintToFile: Biến thể; ĐÚNG VẬY việc in ấn sẽ đi đến một tập tin.
Đối chiếu: Biến thể //Không cần thiết. Khi giá trị ĐÚNG VẬY Bản sao của các trang được hợp nhất.
): Sách bài tập;

Bạn có thể sử dụng hàm này như một phương thức của một biến chỉ ra trang - Tờ giấy(Cũng Excel.ActiveWorkBook hoặc Excel.Bảng tính công việc):

Sheet.PrintOut(1, 1, 1, Sai, Đúng);

Việc in sẽ được thực hiện từ trang đầu tiên đến trang đầu tiên, một bản sao, không cần xem trước, không chỉ định máy in - việc in sẽ chuyển sang một tệp. Trước tiên, bạn sẽ được nhắc chỉ định tên tệp. Một loại tệp được tạo *.xps. Để xem nó, bạn cần các chương trình đặc biệt.

Đương nhiên, trong Delphi bạn cũng có thể thực hiện định dạng ô và các thao tác khác bằng bảng Excel. Tôi sẽ thêm thông tin này sau. Hiện tại, lần đầu tiên như vậy là đủ.

Làm việc với vùng ô Excel

Tôi muốn tiếp tục với thực tế là việc đọc và ghi dữ liệu từ một ô mất khá nhiều thời gian - có thể bạn đã nhận thấy. Có một cách để tăng tốc quá trình này. Để làm được điều này, bạn cần nắm vững các thao tác đơn giản khi làm việc với một vùng ô Excel.

Vùng ô trong bảng Excel cũng có kiểu Variant và được xác định bằng hình chữ nhật biểu thị ô trên bên trái và ô dưới bên phải:

Phạm vi Var: Biến thể;
bắt đầu

kết thúc;

Cụ thể, một vùng có thể bao gồm một ô:

Phạm vi:=Excel.Range, Excel.Cells];

Mục này dễ thực hiện hơn bằng cách chỉ ra địa chỉ như trong bảng Excel:

Phạm vi:=Excel.Range["A1"];

Bạn cũng có thể chỉ định vùng hình chữ nhật nếu bạn biết tên của các ô. Đây là vùng 4x4:

Phạm vi:=Excel.Range["A1:D4"];

Dưới đây là cách sao chép một vùng gồm các ô Excel 100X100 vào bảng StringGrid:

var Phạm vi: Biến thể;
i, j: Số nguyên;
bắt đầu
Phạm vi:=Excel.Range, Excel.Cells];
với ChuỗiGrid1 LÀM
tôi:=1 ĐẾN 100 LÀM
j:=1 ĐẾN 100 LÀM
Ô:=Range.Cells;
kết thúc;

Đó là tất cả! Trên máy tính của tôi, thao tác sao chép một vùng gồm các ô Excel 100x100 vào bảng StringGrid kéo dài khoảng 300 mili giây, nhanh hơn 2 bậc so với đọc và ghi từng ô một.

Và, ví dụ, thao tác nhập một giá trị duy nhất vào tất cả các ô của một vùng thậm chí còn đơn giản hơn. Hãy thêm từ “Xin chào” vào vùng 100x100 được xác định ở trên:

Excel.Range, Excel.Cells]:="Xin chào";

Việc làm sạch vùng được thực hiện bằng phương pháp Clear:

Excel.Range, Excel.Cells].Clear;

Trao đổi dữ liệu với MS Excel V. Delphi với sự giúp đỡ OLE.

Các đồng nghiệp thân mến!

Sớm muộn gì chúng ta cũng phải đối mặt với nhiệm vụ trao đổi dữ liệu với các ứng dụng trọn gói bộ phần mềm Microsoft Office. Một trong số đó là MS Excel. Và đặc biệt về tương tác với sản phẩm này bộ phần mềm Microsoft Office sẽ được thảo luận trong bài viết này.

Một cách để tương tác Delphi c MS Excel- là kết nối với nó như OLE sự vật.

Vì thế.
Trước hết, để làm việc với MS ExcelOLE thêm vào phần Công dụng mô-đun ComObjActiveX.

Và điều đầu tiên chúng ta cần kiểm tra là nó đã được cài đặt chưa MS Excel về nguyên tắc trên máy tính của người dùng.
Để làm điều này, chúng ta sẽ sử dụng hàm CLSIDTừProgID, trông trong sổ đăng ký CLSID cho người được truyền đi ID chương trình:
Trợ giúp từ MSDN: Phương pháp CLSIDTừProgID
Tùy chọn:
pszProgID: CựcStr- Một chuỗi có tên của đối tượng
csid: TCLSID- Con trỏ tới cấu trúc TGUID mà đối tượng tìm thấy được chuyển đến;
Trả về:
kết quả- Kết quả có thể nhận các giá trị sau:
S_OK- đối tượng được tìm thấy;
CO_E_CLASSSTRING- Đăng ký CLSIDID chương trình không có hiệu lực;
REGDB_E_WRITEREGDB- Viết sai CLSID vào sổ đăng ký.
Từ kết quả đã liệt kê chúng ta cần S_OK.
Hãy viết hàm để xác định sự có mặt Excel từ người dùng:

Hàm IsXlsInstall: boolean; hoặc CLSID: TCLSID; bắt đầu Kết quả:= (CLSIDFromProgID("Excel.Application", CLSID) = S_OK); kết thúc;

Nếu như Excelđã cài đặt rồi hãy kết nối với nó. Bạn có thể làm điều này theo hai cách: GetActiveOleObject- Nhận liên kết đến một phiên bản đang chạy Excel hoặc TạoOleObject- Tạo một thể hiện mới Excel.
Nếu chúng ta có nhiệm vụ nhận dữ liệu từ một máy đang chạy Excel, thì chúng ta chỉ nên sử dụng tùy chọn đầu tiên, trong các trường hợp khác, chúng ta cố gắng kết nối và nếu điều đó không hiệu quả thì chúng ta sẽ tạo nó.
Hãy viết 2 hàm để kết nối XlsConnect và ra mắt một cái mới XlsBắt đầu:
Hãy thêm một biến Ứng dụng FXls với loại Khác nhau, sẽ chứa một tham chiếu đến đối tượng Excel.

FXlsApp riêng tư: biến thể; *** hàm XlsConnect: boolean; bắt đầu Kết quả:= Sai; thử FXlsApp:= GetActiveOleObject("Excel.Application"); Kết quả:= Đúng; ngoại trừ kết thúc; kết thúc; thủ tục XlsStart; bắt đầu FXlsApp:= CreateOleObject("Excel.Application"); kết thúc;

Bây giờ bạn có thể thêm một nút, khi nhấp vào chúng tôi sẽ kết nối với MS Excel sử dụng các hàm viết:

Quy trình btnConnectClick(Người gửi: TObject); bắt đầu nếu không phải IsXlsInstall thì raise Exception.Create("Không tìm thấy ứng dụng MS Excel trên máy tính này!"); nếu không phải XlsConnect thì XlsStart; FXlsApp.Visible:= Đúng; kết thúc;

Cửa sổ mặc định Excel chạy ở chế độ nền. Đường kẻ FXlsApp.Visible:= Đúng; tạo một cửa sổ nền Excel dễ thấy.

Cửa sổ Excel Một bảng tính trống sẽ bắt đầu và bạn cần thêm sổ làm việc vào đó. Điều này được thực hiện bằng cách sử dụng phương pháp WorkBooks.Add, thao tác này sẽ thêm sách mới hoặc mở sách đã lưu trước đó nếu bạn chỉ định đường dẫn đến tệp.
Hãy thêm một thủ tục sẽ thực hiện việc này:

Quy trình XWorkbookAdd(const FilePath: string = ""); bắt đầu FXlsApp.WorkBooks.Add(FilePath); kết thúc;

Cuốn sách đã được thêm vào, bây giờ chúng ta hãy thử viết điều gì đó vào đó nhé.

FXlsApp.Cells := "Chuỗi thử nghiệm";

Ở đâu Hàng ngang là chỉ số hàng và Col— chỉ mục cột bắt đầu bằng một.

FXlsApp.Range["A1"] := "Ô A1";

Ở đâu Phạm vi là một mảng các ô và A1- quen thuộc với Excel tọa độ ô.
Một phạm vi có thể được chỉ định làm tọa độ. Ví dụ, mã

FXlsApp.Range["A3:A10"] := 5;

sẽ điền vào tất cả các ô bằng số 5 A3 Qua A10, và mã

FXlsApp.Range["A3:A10"].Interior.Color:= clMoneyGreen;

sẽ làm nổi bật phạm vi tương tự bằng màu xanh nhạt.
Theo hướng ngược lại, tức là lấy dữ liệu từ Excel, hoạt động tương tự. Đường kẻ

ShowMessage(FXlsApp.Cells);

Sẽ hiển thị thông báo có nội dung của ô có tọa độ: Row=5, Column=1.

Sau khi thực hiện xong các thao tác cần thiết với Excel, chúng ta có thể lưu sách kết quả vào một tệp bằng lệnh sau:

FXlsApp.ActiveWorkbook.SaveAs("C:\Test.xlsx");

Ở đâu Sổ làm việc đang hoạt động- cuốn sách hiện tại.
Và đóng ứng dụng Excel yêu cầu:

FXlsApp.Quit;

Bạn hiểu các tùy chọn kiểm soát này như thế nào? Excel từ Delphi không bị giới hạn. Và có một cách khá đơn giản để tìm ra cách thực hiện hành động cần thiết với Excel từ Delphi.
Nó được gọi là Macro.

Hãy tưởng tượng rằng chúng ta cần hợp nhất nhiều ô thành một và chúng ta không biết cách thực hiện. Nhưng chúng tôi muốn tìm hiểu. Để làm điều này, chúng tôi thực hiện các bước sau:
1. Khởi chạy Excel và tạo một cuốn sách trống.
2. Chạy lệnh “Record Macro”, mặc định tên macro sẽ là “Macro1”. (Trong các phiên bản khác nhau Excel Lệnh này nằm trong các mục menu khác nhau).
3. Chọn một phạm vi ô nhất định và nhấp vào nút “Hợp nhất và đặt vào giữa”.
4. Dừng ghi macro.
5. Mở danh sách macro và chọn macro đã ghi của bạn ở đó.
6. Nhấp vào nút “Thay đổi”
Trình soạn thảo bắt đầu Microsoft Visual Basic cho ứng dụng trong đó chúng ta thấy mã của các hành động được thực hiện:

Sub Macro1() " " Macro1 Macro " Có lựa chọn .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = Kết thúc sai với lựa chọn .Hợp nhất kết thúc phụ

Chúng ta hãy xem xét kỹ hơn những gì anh ấy đã viết cho chúng tôi ở đây:
Với sự lựa chọn— Đối với phạm vi ô đã chọn, đặt thuộc tính:
Căn chỉnh theo chiều ngang = xlCenter— Hướng ngang = chính giữa.
Căn chỉnh dọc = xlBottom— Hướng dọc — dọc theo cạnh dưới.
WrapText = Sai— Tính năng ngắt dòng văn bản bằng từ bị tắt.
Định hướng = 0- Định hướng 0 độ.
Thêm thụt lề = Sai— Sử dụng bật/tắt thụt lề tự động.
Mức thụt lề = 0- Thụt lề mức 0.
ShrinkToFit = Sai— Nén văn bản để vừa bật/tắt cột.
Thứ tự đọc = xlContext- Thứ tự đọc theo ngữ cảnh.
Hợp nhất các tế bào = Sai- Bật/tắt các ô đã hợp nhất
Kết thúc với— Kết thúc phần công việc với phạm vi đã chọn.
Lựa chọn.Hợp nhất- Hợp nhất phạm vi đã chọn.

Bây giờ hãy thử hợp nhất các ô từ Delphi:

Chúng tôi chọn phạm vi chúng tôi cần.

FXlsApp.Selection.MergeCells:= True;

Chúng tôi hợp nhất các ô bằng cách đặt thuộc tính. Hoặc sử dụng phương pháp:

FXlsApp.Selection.Merge;

Bằng cách này, bạn có thể lấy được mã cho hầu hết mọi thao tác cần thiết.
Và nếu một số thuộc tính hoặc phương pháp đặt ra câu hỏi, bạn có thể sử dụng trợ giúp trên MSDN.

Xin lưu ý tính đặc thù của việc làm việc với mảng trong VBA. Chỉ mục trong mảng trong Delphiđược gói trong dấu ngoặc vuông, trong khi ở VBA chúng sẽ ở dạng tròn. Và mã trong Delphi

FXlsApp.Range["B5:C8"].Chọn;

V. VBA sẽ trông giống như

Phạm vi("D5:H14").Chọn;

Dưới đây tôi sẽ đưa ra một chút Câu hỏi thường gặp về vấn đề tương tác với Excel từ Delphi

Làm cách nào để xác định giá trị không đổi trong Excel để sử dụng trong Delphi?

Trong trình soạn thảo VBA Chúng tôi đặt điểm dừng đối diện với hằng số quan tâm. Nhấp vào thực thi và khi quá trình thực thi dừng lại, hãy trỏ đến hằng số quan tâm:

Làm cách nào để tắt tính năng xuất tin nhắn trong Excel?

FXlsApp.DisplayAlerts:= Sai;

Làm thế nào để có được danh sách sách từ Excel?

Đối với i:= 1 đến FXlsApp.Workbooks.Count do ListBox1.Items.Add(FXlsApp.Workbooks.Item[i].Name);

Làm cách nào để tắt hiển thị lưới?

FXlsApp.ActiveWindow.DisplayGridlines:= Sai;

Làm cách nào để hiển thị trang tính hiện tại dưới dạng bản xem trước khi in?

FXlsApp.ActiveWindow.SelectedSheets.PrintPreview;

Làm cách nào để in đậm một số văn bản trong ô?

Hàng Var: số nguyên; // Chỉ số chuỗi Col: số nguyên; // Chỉ mục ô TextSelStart: số nguyên; // Bắt đầu từ ký tự TextSelLength: số nguyên; // Số lượng ký tự được chọn bắt đầu FXlsApp.Cells.Characters(TextSelStart, TextSelLength).Font.Bold:= True; kết thúc;

Làm cách nào để tự động điều chỉnh chiều cao hàng cho ô được dán?

Var merge_area: biến thể; cell_width, cell_width, i: số nguyên bắt đầu // Lưu phạm vi của các ô đã hợp nhất vào một biến merge_area:= FXlsApp.Range["D5"].MergeArea; // Lưu chiều rộng của ô mà chúng ta sẽ chọn chiều cao cell_width:= FXlsApp.Range["D5"].ColumnWidth; cell_width:= 0; for i:= 1 to merge_area.Columns.Count do // Lấy tổng chiều rộng của tất cả các cột trong phạm vi đã hợp nhất cell_width:= cell_width + merge_area.Columns[i].ColumnWidth; // Hủy hợp nhất các ô merge_area.UnMerge; // Đặt chiều rộng của ô quan tâm bằng tổng chiều rộng FXlsApp.Range["D5"].ColumnWidth:= cell_width; // Gọi phương thức tiêu chuẩn để tự động điều chỉnh chiều cao hàng FXlsApp.Rows.EntireRow.AutoFit; // Trả về chiều rộng ban đầu của ô quan tâm FXlsApp.Range["D5"].ColumnWidth:= cell_width; // Dán các phạm vi lại với nhau merge_area.Merge; kết thúc;

Làm cách nào để có được phạm vi ô đã sử dụng?

Kết quả:= exApp.ActiveSheet.UsedRange;

Làm cách nào để lấy chữ cái cột theo chỉ mục?

Sử dụng Toán học; *** hàm ColIdxToStr(const Col: số nguyên): chuỗi const CharsCount: số nguyên = 26; Độ lệch: số nguyên = 64; Thứ hạng var: byte; Col, Tmp: số nguyên; bắt đầu Kết quả:= ""; trong khi Col > 0 thì bắt đầu Xếp hạng:= 0; Tmp:=Col; trong khi Tmp > CharsCount bắt đầu Tmp:= Ceil(Tmp / CharsCount - 1); Inc(Xếp hạng); kết thúc; Kết quả:= Kết quả + Chr(Tmp + Offset); Col:= Col - Trunc(Power(CharsCount,Rank)) * Tmp; kết thúc; kết thúc;

Bạn có thể dừng lại ở mỗi giai đoạn của mô hình này và nghiên cứu nó trong nhiều tháng. Nếu có nhu cầu đặc biệt nghiên cứu thêm bất kỳ tính chất và phương pháp nào, chúng tôi chắc chắn sẽ quay lại nghiên cứu. Bây giờ, hãy bắt đầu làm việc ở Delphi với các trang sổ làm việc.

2. Kích hoạt bảng tính Excel như thế nào?

Như bạn đã biết khi tạo một bảng tính trống Excel tự động thêm 3 trang trống vào sổ làm việc này. Để làm việc với một trang tính cụ thể ( Bảng tính hoặc đơn giản Tờ giấy) trang tính này phải được kích hoạt. Một cách để kích hoạt một bảng tính Excel V. Delphi như sau:

chuỗi tài nguyên rsEInvalidSheetIndex = "Chỉ mục không hợp lệ được chỉ định cho WorkBooks. Kích hoạt trang tính bị hủy bỏ"; rsEInvalidSheetActivate = "Kích hoạt trang tính đã hoàn tất có lỗi"; hàm ActivateSheet(WBIndex: số nguyên ; SheetName: chuỗi ): boolean ; var i: số nguyên ; bắt đầu Kết quả : = false ; nếu WBIndex > MyExcel. Sách bài tập. Đếm sau đó tăng Ngoại lệ. Tạo (rsEInvalidSheetIndex) ; thử tìm i : = 1 vào MyExcel. Sổ làm việc [WBIndex]. Tấm. Đếm làm gì nếu AnsiLowerCase (MyExcel. WorkBooks [ WBIndex]. Sheets . Item [ i]. Name ) = AnsiLowerCase (SheetName) thì bắt đầu MyExcel. Sổ làm việc [WBIndex]. Tấm. Mục [i]. Kích hoạt ; Kết quả: = đúng; phá vỡ; kết thúc ; ngoại trừ tăng Ngoại lệ. Tạo (rsEInvalidSheetActivate); kết thúc ; kết thúc ;

Ở đây, các tham số của hàm được đặt thành chỉ mục sổ làm việc (WBIndex) trong bộ sưu tập Sách bài tập và tên của trang tính.

Nếu muốn, bạn có thể kích hoạt cùng một trang tính theo chỉ mục trong bộ sưu tập Bảng tính- đồng thời, bản thân chức năng cũng được đơn giản hóa một chút (không cần điều kiện kiểm tra tên trang tính).

Ngoài ra, nếu bạn chắc chắn rằng sổ làm việc bạn cần đang hoạt động tại một thời điểm nhất định thì bạn có thể tránh sử dụng một biến bổ sung (chỉ mục sổ làm việc WBIndex) và kích hoạt trang tính như sau:

MyExcel. ActiveWorkBook. Tấm. Mục [i]. Kích hoạt ;

Bây giờ chúng ta hãy xem xét kỹ hơn các phương thức được đối tượng sử dụng Bảng tính.

3. Phương pháp làm bảng tính Excel

Bây giờ chúng ta hãy nhìn vào đối tượng chi tiết hơn Bảng tính.

Hình vẽ thể hiện các phương pháp mà tôi đã từng sử dụng trong công việc của mình.

Tổng đối tượng Bảng tính tổng cộng 30 các phương pháp khác nhau mà bạn có thể sử dụng.

Phương pháp Sự miêu tả
Kích hoạt Làm cho trang tính hiện tại hoạt động. Chúng tôi đã thảo luận về cách thức hoạt động của phương pháp này.
đếm tất cả các sổ làm việc đang mở, một trang tính cụ thể trong sổ làm việc hoặc một phạm vi ô được chỉ định trong một trang tính
kiểm tra chính tả trên trang đã chọn
lưu tất cả các thay đổi vào tập tin
xóa trang tính hiện tại Bảng tính
lựa chọn tờ
sao chép trang tính sang vị trí khác trong sổ làm việc
dán nội dung của clipboard vào một bảng tính
trả về một đối tượng đại diện cho một sơ đồ đơn (đối tượng Đối tượng biểu đồ Đối tượng biểu đồ) trên tờ giấy
di chuyển tờ giấy. Phương pháp này tương tự như phương pháp Sao chép. Điểm khác biệt duy nhất là sau khi dán, tờ đã sao chép sẽ bị xóa khỏi sách

Bây giờ chúng ta hãy xem xét từng phương pháp được trình bày ở trên.

Dưới đây, như sự biểu lộ tấm nên nhô ra ( Bảng tính), trừ khi có quy định khác.

Phương pháp tính toán

Tính toán sổ làm việc, trang tính hoặc phạm vi ô.

Điều đáng chú ý là lệnh gọi phương thức Tính toán không chỉ có thể thực hiện được đối với một bảng tính cụ thể trong sổ làm việc Excel. Hãy xem xét các tùy chọn để gọi phương thức Tính toán.

var MyExcel: OleVariant; MyExcel. Tính toán

đoạn mã dưới đây tính toán trang hoạt động

MyExcel. ActiveWorkBook. Bảng công việc đang hoạt động. Tính toán

Hãy tính tất cả các công thức trong cột A, B và C:

MyExcel. ActiveWorkBook. Bảng công việc đang hoạt động. Phạm vi sử dụng. Cột("A:C"). Tính toán

Phương pháp kiểm tra chính tả

Cuộc gọi phương thức trông như thế này:

sự biểu lộ. Kiểm tra chính tả (Từ điển tùy chỉnh, Bỏ qua chữ hoa, Luôn đề xuất, SpellLang)

Đồng thời, như sự biểu lộ tấm nên nhô ra ( Bảng tính).

Tham số Kiểu Sự miêu tả
Từ điển tùy chỉnh Khác nhau Với một chuỗi chỉ định tên của tệp từ điển người dùng sẽ được xem xét nếu từ đó không được tìm thấy trong từ điển chính. Nếu đối số này bị bỏ qua, từ điển mặc định sẽ được sử dụng
Bỏ qua chữ hoa Khác nhau ĐÚNG VẬY, nếu cần thiết, để Microsoft Excel bỏ qua những từ được viết bằng chữ in hoa. SAIđể Microsoft Excel kiểm tra tất cả các từ. Nếu đối số này bị bỏ qua, cài đặt Excel hiện tại sẽ được sử dụng.
Luôn đề xuất Khác nhau ĐÚNG VẬY, để Microsoft Excel hiển thị danh sách gợi ý cho các cách viết khác khi phát hiện một từ viết sai chính tả. SAI, ĐẾN Microsoft Excel Tôi đang đợi nhập đúng chính tả. Nếu đối số này bị bỏ qua, cài đặt hiện tại sẽ được sử dụng.
chính tả Khác nhau ngôn ngữ từ điển. Có thể lấy giá trị của một trong các hằng số MsoLanguageID , ví dụ như tiếng Nga SpellLang = 1049, cho tiếng Anh (Mỹ) SpellLang = 1033 vân vân. Thêm chi tiết về số nhận dạng ngôn ngữ.

Làm cách nào để kiểm tra ngữ pháp trên bảng Excel ở Delphi?

MyExcel. ActiveWorkBook. Bảng công việc đang hoạt động. CheckSpelling(CustomDictionary:=EmptyParam, IgnoreUppercase:=false, AlwaysSuggest:=EmptyParam, SpellLang:=1033)

trong trường hợp này MS Excel sẽ kiểm tra bảng tính hiện tại, bao gồm cả việc kiểm tra các từ viết hoa. Ngôn ngữ xác minh là tiếng Nga. Xin lưu ý rằng để gọi phương thức, chúng tôi đã chỉ định rõ ràng tham số nào sẽ được gán giá trị nào. Hơn nữa, để bỏ qua bất kỳ tham số nào, chúng tôi đã sử dụng Thông số trống(tham số trống), nằm trong Delphi là một biến kiểu OleBiến thể.

Rõ ràng là phương pháp gọi phương thức này (với chỉ dẫn rõ ràng về tất cả các tham số) không hoàn toàn thuận tiện cho bạn và không được áp dụng rộng rãi trong lập trình bằng tiếng Anh. Delphi , tuy nhiên, đây là cách duy nhất và không có cách nào khác để gọi các phương thức được sử dụng trong Excel .

Phương thức SaveAs

Lưu một bảng tính bảng tính Excel.

Cuộc gọi phương thức:

biểu thức.SaveAs(Tên tệp, Định dạng tệp, Mật khẩu, WriteResPassword, ReadOnlyResword, CreateBackup, AddToMru, TextCodepage, TextVisualLayout, Local)
Tham số Kiểu Sự miêu tả
Tên tệp Khác nhau một chuỗi đại diện cho tên của tập tin sẽ được lưu. Bạn phải chỉ định đường dẫn đầy đủ tới tệp, nếu không tệp sẽ được lưu vào thư mục Excel .
Định dạng tệp Khác nhau Định dạng tệp được sử dụng khi lưu. Theo mặc định, tệp được lưu ở định dạng bạn đã chọn lần cuối Excel.
Mật khẩu Khác nhau mật khẩu cho tập tin (không quá 15 ký tự). Mật khẩu là trường hợp nhạy cảm.
ViếtResMật khẩu Khác nhau mật khẩu sẽ được sử dụng để thực hiện các thay đổi đối với sổ làm việc. Nếu mật khẩu không được chỉ định, sách sẽ được mở ở chế độ Chỉ đọc.
Chỉ đọcĐề xuất Khác nhau nếu tham số bằng ĐÚNG VẬY, khi mở một tệp, trên màn hình sẽ xuất hiện một thông báo khuyến nghị rằng tệp nên được mở ở chế độ chỉ đọc.
Tạo bản sao Khác nhau ĐÚNG VẬY, để tạo một tập tin sao lưu
ThêmToMru Khác nhau ĐÚNG VẬY, để thêm tên file đã lưu vào danh sách file đã mở gần đây trong menu chính Excel
Trang mã văn bảnTextVisualLayout Khác nhau hiện không được sử dụng và giữ lại để tương thích ngược
Địa phương Khác nhau tham số tùy chọn, mặc định bằng SAI.Nghĩa ĐÚNG VẬY- lưu tệp bằng ngôn ngữ Microsoft Excel (bao gồm cài đặt bảng điều khiển).

MyExcel.ActiveWorkBook.ActiveWorkSheet.SaveAs("C\:MyExcelFile.xls")

Trong trường hợp này, cài đặt mặc định sẽ được sử dụng khi lưu.

Nếu bạn cần lưu file Excel ở định dạng khác thì trong tham số Định dạng tệp bạn có thể sử dụng một trong các giá trị liệt kê xlĐịnh dạng tệp . Một số ý nghĩa xlĐịnh dạng tệp được trình bày ở bảng dưới đây:

Tên Nghĩa Sự miêu tả Phần mở rộng tập tin
xlCSV6 CSV*.csv
xlExcel856 Sổ làm việc Excel 97-2003*.xls
xlHtml44 định dạng HTML*.htm; *.HTML
xlOpenDocumentBảng tính60 Bảng tính OpenDocument*.ods
xlOpenXMLSổ làm việc51 Mở sách XML*.xlsx

Hãy viết một thủ tục nhỏ cho phép bạn lưu một bảng Excel ở nhiều định dạng khác nhau:

const xlCSV = 6 ; xlExcel8 = 56 ; xlHtml = 44 ; xlOpenDocumentBảng tính = 60; xlOpenXMLWorkbook = 51 ; chuỗi tài nguyên rsESaveActiveSheet = "Lỗi lưu bảng tính đang hoạt động"; thủ tục SaveAs(const AFileName: TFileName; AFileFormat: số nguyên ) ; bắt đầu thử MyExcel. ActiveWorkBook. Bảng hoạt động. SaveAs(AFileName, AFileFormat); ngoại trừ tăng Ngoại lệ. Tạo(rsESaveActiveSheet); kết thúc ; kết thúc ;

Xóa phương pháp

Xóa một bảng tính Excel.

MyExcel.ActiveWorkBook.WorkSheets.Item.Select

Chọn trang tính thứ ba của sổ làm việc

Phương pháp sao chép

Sao chép một trang tính đến một vị trí khác trong sổ làm việc.

Cuộc gọi phương thức:

biểu thức.Copy(Trước, Sau)

Tuy nhiên, nếu bạn sử dụng tham số Trước, thì bạn không nên sử dụng Sau đó và ngược lại. Hãy để tôi lưu ý bạn rằng thực tế là BẢNG được chỉ định chứ không phải chỉ mục trang tính.

Làm cách nào để sao chép bảng Excel sang Delphi?

MyExcel.ActiveWorkBook.WorkSheets.Item.Copy(Sau:=MyExcel.ActiveWorkBook.WorkSheets.Item)

Trong trường hợp này, trang đầu tiên sẽ được sao chép và dán sau trang thứ ba.

Phương pháp dán

Dán nội dung của clipboard vào một bảng Excel.

Cuộc gọi phương thức:

biểu thức.Dán (Đích, Liên kết)

Làm cách nào để dán nội dung clipboard vào bảng Excel ở Delphi?

MyExcel.ActiveWorkBook.ActiveSheet.Paste(Destination:=MyExcel.ActiveWorkBook.ActiveSheet.Range("D1:D5"))

Trong trường hợp này, nội dung của bộ đệm sẽ được chèn vào cột D từ hàng 1 đến hàng 5. Cần lưu ý rằng nếu nội dung của bộ đệm không thỏa mãn điều kiện, chẳng hạn chỉ có 1 số trong bộ đệm, sau đó một ngoại lệ được ném ra.

Phương pháp Đối tượng biểu đồ

Trả về một đối tượng đại diện cho một sơ đồ đơn (đối tượng Đối tượng biểu đồ) hoặc tập hợp tất cả các sơ đồ (đối tượng Đối tượng biểu đồ) trên tờ giấy.

Cuộc gọi phương thức:

biểu thức.ChartObjects

Làm cách nào để lấy biểu đồ trong bảng Excel ở Delphi?

MyExcel.ActiveWorkBook.ActiveSheet.ChartObjects

Trong trường hợp này, cái đầu tiên sẽ được nhận.

Phương pháp di chuyển

Di chuyển một tờ giấy. Phương pháp này tương tự như phương pháp . Điểm khác biệt duy nhất là sau khi dán, trang đã sao chép sẽ bị xóa khỏi sách.

Đây là một phần của các phương pháp mà tôi đã từng sử dụng khi làm việc với Excel V. Delphi . Nhìn chung có thể nói rằng trong Delphi có thể được kiểm soát MS Excel không tệ hơn khi làm việc trực tiếp với ứng dụng này, điều chính là không quên phương thức hoặc thuộc tính nào chịu trách nhiệm cho việc gì :). À, để không quên, tôi đã tạo một Bản đồ tư duy nhỏ để định kỳ bổ sung và cập nhật. Bằng cách nhấp vào liên kết, bạn có thể thấy các đối tượng Excel, các phương thức chúng sử dụng, các tham số phương thức và kiểu của chúng phù hợp với các loại Delphi. Nói chung, một bảng cheat đồ họa nhỏ dành cho những người thích mày mò với Excel ở Delphi.

Bài đánh giá này thảo luận về các thiết kế cơ bản cho phép bạn truy cập sổ làm việc Excel từ DELPHI.

Tổ chức truy cập vào sách EXCEL

Để tương tác với MS excel trong chương trình bạn phải sử dụng module ComObj
sử dụng ComObj;
và khai báo một biến để truy cập MS excel kiểu sau:
var Excel: Biến thể;

Trong trường hợp đơn giản nhất, việc khởi tạo một biến Excel có thể được thực hiện như sau:
Excel:= CreateOleObject("Excel.Application");

Tạo một cuốn sách mới:
Excel.Workbooks.Add;

Mở một cuốn sách hiện có (trong đó đường dẫn là đường dẫn đến tệp có phần mở rộng xls.):
Excel.Workbooks.Open;

Để mở một sổ làm việc hiện có ở chế độ chỉ đọc:
Excel.Workbooks.Open;

Đóng Excel:
Excel.ActiveWorkbook.Close;
Excel.Application.Quit;

Chặn các yêu cầu Excel (xác nhận, thông báo), ví dụ chặn yêu cầu lưu file:
Excel.DisplayAlerts:=False;

Hiển thị Excel trên màn hình:
Excel.Visible:= True;
hoặc ẩn:
Excel.Visible:= Sai;

In nội dung của bảng excel đang hoạt động:
Excel.ActiveSheet.PrintOut;

Đọc/ghi dữ liệu trong EXCEL

Bạn có thể truy cập một ô trong sổ làm việc Excel hiện tại như sau:
Excel.Range["B2"]:="Xin chào!";- để ghi một giá trị vào một ô hoặc
s:=Excel.Range["B2"]; - để đọc,
trong đó B2 là địa chỉ ô.

Hoặc sử dụng kiểu liên kết R1C1:
Excel.Range]:="Xin chào!";, tọa độ ô ở đâu.

Nói chung, bạn có thể gán bất kỳ giá trị nào cho một ô Excel (ký tự, số nguyên, phân số, ngày tháng) và Excel sẽ đặt định dạng mặc định trong ô đó.

Định dạng ô trong EXCEL

Bạn có thể chọn (chọn) một nhóm ô cho công việc tiếp theo như thế này:
Excel.Range, Excel.Cells].Chọn;
hoặc
Excel.Range["A1:C5"].Select;
trong trường hợp này, vùng nằm giữa ô A1 và C5 sẽ được chọn.

Sau khi thực hiện lựa chọn, bạn có thể thiết lập:
1) hợp nhất các ô
Excel.Selection.MergeCells:=True;
2) gói từ
Excel.Selection.WrapText:=True;
3) căn chỉnh theo chiều ngang
Excel.Selection.HorizontalAlignment:=3;
Khi được đặt thành 1, căn chỉnh mặc định sẽ được sử dụng, khi được đặt thành 2, căn chỉnh là trái, 3 là căn giữa và 4 là phải.
4) căn chỉnh theo chiều dọc
Excel.Selection.VerticalAlignment:=1;
các giá trị được gán giống như căn chỉnh theo chiều ngang.
5) đường viền cho các ô

Khi được đặt thành 1, đường viền ô được vẽ bằng các đường liền mảnh.
Ngoài ra, bạn có thể chỉ định các giá trị cho thuộc tính Borders, ví dụ bằng 3. Khi đó, chỉ có đường viền trên cho khối lựa chọn sẽ được đặt:
Excel.Selection.Borders.LineStyle:=1;
Giá trị của thuộc tính Borders chỉ định sự kết hợp khác nhau của các cạnh ô.
Trong cả hai trường hợp, bạn có thể sử dụng các giá trị trong phạm vi từ 1 đến 10.

Sử dụng mật khẩu trong EXCEL

Việc đặt mật khẩu cho sổ làm việc đang hoạt động có thể được thực hiện như sau:
thử
// cố gắng đặt mật khẩu
Excel.ActiveWorkbook.protect("vượt qua");
ngoại trừ
// hành động nếu nỗ lực đặt mật khẩu không thành công
kết thúc;

trong đó pass là mật khẩu để đặt cho sách.

Việc xóa mật khẩu của sách cũng tương tự, dùng lệnh
Excel.ActiveWorkbook.Unprotect("vượt qua");

Việc đặt và xóa mật khẩu cho trang hoạt động của sổ làm việc Excel được thực hiện bằng lệnh
Excel.ActiveSheet.protect("vượt qua"); // đặt mật khẩu
Excel.ActiveSheet.Unprotect ("vượt qua"); // xóa mật khẩu

trong đó pass là mật khẩu được đặt để bảo vệ sách.

Các thao tác phụ trợ trong EXCEL

Xóa các hàng bằng cách dịch chuyển lên:
Excel.Rows["5:15"].Select;
Excel.Selection.Delete;

Khi thực hiện các thao tác này, các dòng từ 5 đến 15 sẽ bị xóa.

Đặt vùng đóng băng trên bảng tính Excel đang hoạt động
// giải phóng khu vực nếu nó được đặt
Excel.ActiveWindow.FreezePanes:=False;
// chọn ô mong muốn, trong trường hợp này là D3
Excel.Range["D3"].Select;
// thiết lập vùng bị đóng băng
Excel.ActiveWindow.FreezePanes:=True;

Chúc may mắn!

Bài đánh giá này thảo luận về các cấu trúc cơ bản cho phép bạn truy cập sổ làm việc Excel từ Delphi.

Tổ chức truy cập vào sách EXCEL

Để tương tác với MS Excel trong một chương trình, bạn phải sử dụng mô-đun ComObj và khai báo một biến để truy cập loại biến thể MS Excel.

sử dụng ComObj;
var Excel: Biến thể;

Trong trường hợp đơn giản nhất, bạn có thể khởi tạo một biến Excel như thế này:

Excel:= CreateOleObject("Excel.Application");

Tạo một cuốn sách mới:

Excel.Workbooks.Add;

Mở một cuốn sách hiện có (trong đó đường dẫn là đường dẫn đến tệp có phần mở rộng xls.):

Excel.Workbooks.Open;

Để mở một sổ làm việc hiện có ở chế độ chỉ đọc:

Excel.Workbooks.Open;

Đóng Excel:

Excel.ActiveWorkbook.Close;
Excel.Application.Quit;

Chặn các yêu cầu Excel (xác nhận, thông báo), ví dụ chặn yêu cầu lưu file:

Excel.DisplayAlerts:=False;

Hiện hoặc ẩn Excel trên màn hình:

Excel.Visible:= True;
Excel.Visible:= Sai;

In nội dung của bảng tính Excel đang hoạt động:

Excel.ActiveSheet.PrintOut;

Đọc/ghi dữ liệu trong EXCEL

Bạn có thể truy cập một ô trong sổ làm việc Excel hiện tại như sau:

Excel.Range["b2"]:="Xin chào!"; // ghi giá trị vào ô
s:=Excel.Range["b2"]; // đọc giá trị từ ô

Trong đó b2 là địa chỉ ô.

Hoặc sử dụng kiểu liên kết R1C1:

Excel.Range]:="Xin chào!";

Tọa độ ô ở đâu.

Nói chung, bạn có thể gán bất kỳ giá trị nào cho một ô Excel (ký tự, số nguyên, phân số, ngày tháng) và Excel sẽ đặt định dạng mặc định trong ô đó.

Định dạng ô trong EXCEL

Bạn có thể chọn (chọn) một nhóm ô cho công việc tiếp theo như thế này:

Excel.Range, Excel.Cells].Chọn;
// hoặc
Excel.Range["A1:C5"].Select;

Trong trường hợp này, vùng nằm giữa ô A1 và C5 sẽ được chọn.

Sau khi thực hiện lựa chọn, bạn có thể thiết lập:
1) Hợp nhất các ô:

Excel.Selection.MergeCells:=True;

2) Gói từ:

Excel.Selection.WrapText:=True;

3) Căn chỉnh theo chiều ngang:

Excel.Selection.HorizontalAlignment:=3;

Khi được đặt thành 1, căn chỉnh mặc định sẽ được sử dụng, khi được đặt thành 2, căn chỉnh là trái, 3 là căn giữa và 4 là phải. 4) Căn chỉnh theo chiều dọc

Excel.Selection.VerticalAlignment:=1;

Các giá trị được gán giống như căn chỉnh theo chiều ngang.
5) Đường viền ô:

Khi được đặt thành 1, đường viền ô được vẽ bằng các đường liền mảnh.
Ngoài ra, bạn có thể chỉ định các giá trị cho thuộc tính Borders, ví dụ bằng 3. Khi đó, chỉ có đường viền trên cho khối lựa chọn sẽ được đặt:

Excel.Selection.Borders.LineStyle:=1;

Giá trị của thuộc tính Borders chỉ định sự kết hợp khác nhau của các cạnh ô.
Trong cả hai trường hợp, bạn có thể sử dụng các giá trị trong phạm vi từ 1 đến 10.

Sử dụng mật khẩu trong EXCEL

Việc đặt mật khẩu cho sổ làm việc đang hoạt động có thể được thực hiện như sau:

thử
// cố gắng đặt mật khẩu
Excel.ActiveWorkbook.protect("vượt qua");
ngoại trừ
// hành động nếu nỗ lực đặt mật khẩu không thành công
kết thúc;

Trong đó pass là mật khẩu để đặt cho sách.

Việc xóa mật khẩu của sách cũng tương tự, dùng lệnh

Excel.ActiveWorkbook.Unprotect ("vượt qua");

Việc đặt và xóa mật khẩu cho trang hoạt động của sổ làm việc Excel được thực hiện bằng lệnh

Excel.ActiveSheet.protect("vượt qua"); // đặt mật khẩu
Excel.ActiveSheet.Unprotect("vượt qua"); // xóa mật khẩu

Trong đó pass là mật khẩu được đặt để bảo vệ sách.

Các thao tác phụ trợ trong EXCEL

Xóa các hàng có dịch chuyển lên trên (khi thực hiện các thao tác này, các hàng từ 5 đến 15 sẽ bị xóa):

Excel.Rows["5:15"].Select;
Excel.Selection.Delete;

Để đặt vùng đóng băng trên bảng tính Excel đang hoạt động:

// giải phóng khu vực nếu nó được đặt
Excel.ActiveWindow.FreezePanes:=False;
// chọn ô mong muốn, trong trường hợp này là D3
Excel.Range["D3"].Select;
// thiết lập vùng bị đóng băng
Excel.ActiveWindow.FreezePanes:=True;