看谁能解决这个问题???(精通OLE的请进.)(50分)

  • 主题发起人 主题发起人 yifei1900
  • 开始时间 开始时间
Y

yifei1900

Unregistered / Unconfirmed
GUEST, unregistred user!
[red]1.如何得到已使用的区域的行数.
也就是说,如果我有一些工作薄,数据格式一样,但是内容不同,有的多,有的少,如果用OLE写一个程序能提取所有工作薄的数据,不可能让程序扫描65332行(Excel工作薄的总行数)吧,我现在的做法是在最后一行第一列添加"#End",然后用
String(ExcelApp.ActiveSheet.Rang['A'+count].Value) <> '#End'
这个条件作为循环条件.
请高手出招.
2.我的一些Excel工作薄中有一些单元格是合并的,并且合并的没有规律,所以不能用一种算法算出哪些单元格是合并的.请问,有没有一种方法判断哪些单元格是合并的.
[/red][:D][:D][:D][:D][:D]
 
转贴前面的:
来自:wcy12td, 时间:2003-5-4 10:56:00, ID:1826238
在excel表中,你的记录在哪些范围可以求出!~~~
b_filedCount :=eclApp.ActiveSheet.UsedRange.columns.Count;
//返回excel 表中的列数
b_row :=eclApp.activesheet.UsedRange.rows.count;
//返回excel 表中的行数

希望能对你有所帮助
 
建议你去看看Excel中的VBA帮助,一切都会迎刃而解。
 
用sql语句

ado直接联

sql server 用opendataSource
 
SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:/6.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[Sheet1$]

 
SELECT *
FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
'Data Source="c:/book1.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...[f2$]
 
致myid0602:
请问你有没有在delphi中调试过,反正我是没有调试通过,如果你能调试通过,请给我那
段代码,谢谢.我的邮箱:yifei1900@163.net.
因为我用你的方法,并没能成功.
yifei
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, DBTables, StdCtrls,ComObj,Excel2000, OleServer;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
XLApp: Variant;
Sheet: Variant;
i,j:integer;
begin
Screen.Cursor := crHourGlass;
if not VarIsEmpty(XLApp) then begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
VarClear(XLApp);
end;
//通过ole创建Excel对象
try
XLApp := CreateOleObject('Excel.Application');
except
Screen.Cursor := crDefault;
ShowMessage('可能没有安装EXCEL ');
Exit;
end;
XLApp.WorkBooks.Add[XLWBatWorksheet];
XLApp.WorkBooks[1].WorkSheets[1].Name := '工作薄';
Sheet := XLApp.Workbooks[1].WorkSheets['工作薄'];

for i := 0 to 10 - 1 do begin
Sheet.cells[1,i+1]:='第'+inttostr(i+1)+'列';
end;
for j := 1 to 100 - 1 do
for i := 0 to 10 - 1 do
Sheet.cells[j+1,i+1]:=inttostr(random(1000));
XlApp.Visible := True;
Screen.Cursor := crDefault;
i :=xlapp.ActiveSheet.UsedRange.columns.Count;//返回excel 表中的列数
j :=xlApp.activesheet.UsedRange.rows.count; //返回excel 表中的行数
Caption :='列数:'+inttostr(i)+', 行数:'+inttostr(j);
end;

end.

经过测试,没有问题
 
TO:hfghfghfg
如果我要實現手工指定用哪 個sheet,則如何實現!
[Sheet1$] 能否用參數或變量來代替
 
取得最后一个单元格的方法:
var
ir, ic : Integer;
……
wkSheet.Cells.SpecialCells(xlCellTypeLastCell,EmptyParam).Activate;
ir := Excel.ActiveCell.Row;
ic := Excel.ActiveCell.Column;

ir,ic就是最后一格的行列
 
推荐使用 myid0602 的方法,另外 zhangshunzhong 的方法也不错,只是如果刚好最后一个单元格是合并的单元格,只能取到这个合并格的第一个格。

判断哪些单元格是合并的--
方法:if XLApp.Selection.MergeCells then
或:if XLApp.Range["A1:D6"].MergeCells then

还有,注意用 UsedRange 方式时,你必须确认没有使用的单元格的如果设了格式,
得清空所有格式,不然就被认为已用的,zhangshunzhong 的方法也不例外。
 
后退
顶部