線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4992
推到 Plurk!
推到 Facebook!

顯示Excel的資料(新手)

答題得分者是:christie
tokiama
一般會員


發表:34
回覆:60
積分:23
註冊:2009-04-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-10-25 10:43:15 IP:220.140.xxx.xxx 訂閱
請問一下:
[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var Excel:Variant;
begin
Excel:=CreateOleObject('Excel.Application');
Excel.WorkBooks.open('C:\Documents and Settings\Administrator\桌面\Excel\TEST1.xls');
StringGrid1.Cells[1,1]:=Excel.WorkBooks[1].WorkSheets[1].Cells[1,1];
Excel.WorkBooks[1].close;
Excel.Quit;
end;

end.
[/code]
我已經成功的可以去開起Excel的檔案了,可是我要怎麼顯示Excel裡的資料呢?

我只能載一個→StringGrid1.Cells[1,1]:=Excel.WorkBooks[1].WorkSheets[1].Cells[1,1];

想說要用回圈,可是...我如果不知道Excel的資料到哪裡那我要怎麼用回圈?

請問一下有誰知道怎麼樣才可以知道Excel的資料有幾欄幾列嗎?
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我爬了文後...

發現有這個可以用→ wc:=Excel.WorkBooks[1].WorkSheets[1].Cells.SpecialCells(xlCellTypelastCell,EmptyParam).row;

可是這回是這個出錯→[ Error] Unit1.pas(36): Undeclared identifier: 'xlCellTypelastCell'

我的 Unit 又少加了?

編輯記錄
tokiama 重新編輯於 2009-10-25 14:37:53, 註解 無‧
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-10-25 20:06:34 IP:122.116.xxx.xxx 未訂閱
請問您有 

USES comobj, Excel2000

嗎?
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
tokiama
一般會員


發表:34
回覆:60
積分:23
註冊:2009-04-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-10-25 21:10:15 IP:220.140.xxx.xxx 訂閱
想跟大家請教一下;

我是用StringGrid去顯示Excel的內容的,然後修改StringGrid時順便改便Excel內的資料。

在要儲存檔案或是離開時才會執行 Excel.WorkBooks[1].close; 跟 Excel.Quit;。

雖然已經可以讀取、修改、儲存了,可是必須在知道Excel的資料的最後一筆是在多少列、多少行的前提下,並寫死在讀檔的時後。

如下:
[code delphi]
var
Form1: TForm1;
Excel:olevariant;
Eout:olevariant;
x,y:integer;
implementation

{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
if opendialog1.Execute then begin
Eout:=true;
Excel:=CreateOleObject('Excel.Application');
Excel.WorkBooks.open(opendialog1.FileName);
////////////////////////////////////////////////////////////////////////
for i:=1 to 3 do //上下向
for j:=1 to 3 do //左又向
StringGrid1.Cells[i,j]:=Excel.WorkBooks[1].WorkSheets[1].Cells[j,i];
////////////////////////////////////////////////////////////////////////
end;
end;
[/code]
請問一下前輩們有沒有什麼方法可以知道Excel的最後一筆資料在第幾行第幾列?

===================引 用 st33chen 文 章===================
請問您有 USES comobj, Excel2000 嗎?
===================引 用 st33chen 文 章===================

Comobj 有,Excel2000 使用後會出現 → [Fatal Error] Unit1.pas(7): File not found: 'Excel2000.dcu' ,所以就把Excel2000拿掉了。

Excel2000是什麼?能麻煩哪位跟我說一下嗎?謝謝 & 麻煩了。
編輯記錄
tokiama 重新編輯於 2009-10-25 21:11:25, 註解 無‧
tokiama 重新編輯於 2009-10-25 23:26:17, 註解 無‧
tokiama 重新編輯於 2009-10-25 23:30:00, 註解 無‧
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-10-26 09:34:30 IP:59.120.xxx.xxx 未訂閱
以下 :
[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var
i, j: Integer;
BoxNo: String;
MsExcel, MsExcelWorkBook, MsExcelWorkSheet: Variant;
begin
if OpenDialog1.Execute then
begin
MsExcel := CreateOleObject( 'Excel.Application');
MsExcelWorkBook := msExcel.Workbooks.Open(OpenDialog1.FileName);
MsExcelWorkSheet := msExcel.Worksheets.Item[1];
for i := 3 to MsExcelWorkSheet.Rows.Count do
for j := 3 to MsExcelWorkSheet.Columns.Count do
begin

end;
end;
end;

[/code]

或以下網址:
http://delphi.ktop.com.tw/board.php?cid=168&fid=923&tid=73304#5

供參考...
編輯記錄
老大仔 重新編輯於 2009-10-26 09:40:40, 註解 無‧
tokiama
一般會員


發表:34
回覆:60
積分:23
註冊:2009-04-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-10-26 22:38:54 IP:61.225.xxx.xxx 訂閱
這方法本新手去試了一下!

可以是可以....只是我光讀檔程式就跑了很久....

就算我只有讀15X15筆也要跑上快13秒左右,是我本身在用雙迴圈那地方就寫不好了嗎?

===================引 用 老大仔 文 章===================
以下?:
[code delphi]
procedure TForm1.Button1Click(Sender: TObject);
var
??? i, j: Integer;
??? BoxNo: String;
??? MsExcel, MsExcelWorkBook, MsExcelWorkSheet: Variant;
begin
??? if OpenDialog1.Execute then
??? begin
??? MsExcel := CreateOleObject( 'Excel.Application');
??? MsExcelWorkBook := msExcel.Workbooks.Open(OpenDialog1.FileName);
??? MsExcelWorkSheet := msExcel.Worksheets.Item[1];
??? for i := 3 to MsExcelWorkSheet.Rows.Count do
? for j := 3 to MsExcelWorkSheet.Columns.Count do
? begin
??
? end;
??? end;
end;

[/code]

或以下網址:
http://delphi.ktop.com.tw/board.php?cid=168&fid=923&tid=73304#5

供參考...
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-10-27 09:11:40 IP:59.120.xxx.xxx 未訂閱

[code delphi]
for i := 1 to msexcel.workbooks[1].worksheets[1].usedrange.rows.count do
for j := 1 to msexcel.workbooks[1].worksheets[1].usedrange.columns.count do
begin

end;
end;

[/code]
christie
資深會員


發表:30
回覆:299
積分:475
註冊:2005-03-25

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-10-27 13:39:04 IP:59.125.xxx.xxx 未訂閱
請參考一下

uses ComObj;

function Xls_To_StringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
xlCellTypeLastCell = $0000000B;
var
XLApp,
Sheet: OLEVariant;
RangeMatrix: Variant;
x, y, k, r: Integer;
begin
Result := False;
// Create Excel-OLE Object
XLApp := CreateOleObject('Excel.Application');
try
// Hide Excel
XLApp.Visible := False;
// Open the Workbook
XLApp.Workbooks.Open(AXLSFile);
//XLApp.Workbooks.Add(-4167);
//Sheet:=XLApp.Workbooks[1].WorkSheets[1]; // 1
Sheet:=XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];//'藥品-外用'
//ExcelApp.Workbooks.Add(xlWBatWorkSheet);

//Sheet := XLApp.Workbooks[2].WorkSheets[1]; //ExtractFileName(AXLSFile)
// In order to know the dimension of the WorkSheet, i.e the number of rows
// and the number of columns, we activate the last non-empty cell of it
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
// Get the value of the last row
x := XLApp.ActiveCell.Row;
// Get the value of the last column
y := XLApp.ActiveCell.Column;
// Set Stringgrid's row &col dimensions.
AGrid.RowCount := x;
AGrid.ColCount := y;
// Assign the Variant associated with the WorkSheet to the Delphi Variant
RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;
// Define the loop for filling in the TStringGrid
k := 1;
repeat
for r := 1 to y do
AGrid.Cells[(r - 1), (k - 1)] := RangeMatrix[K, R];
Inc(k, 1);
AGrid.RowCount := k 1;
until k > x;
// Unassign the Delphi Variant Matrix
RangeMatrix := Unassigned;
finally
// Quit Excel
if not VarIsEmpty(XLApp) then
begin
// XLApp.DisplayAlerts := False;
XLApp.Quit;
XLAPP := Unassigned;
Sheet := Unassigned;
Result := True;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Xls_To_StringGrid(StringGrid1, '20091027.xls') then
ShowMessage('Table has been exported to String-Grid ! OK ')
end;
------
What do we live for if not to make life less difficult for each other?
系統時間:2024-05-16 17:37:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!