我想从excel表中获取行数和列数。我目前正在使用此代码:
function TFprofiles.XlsToStringGrid(AGrid: TStringGrid; AXLSFile: string): Boolean;
const
xlCellTypeLastCell = $0000000B;
var
XLApp, Sheet: OLEVariant;
RangeMatrix: Variant;
x, y, k, r: Integer;
begin
Result:=False;
XLApp:=CreateOleObject('Excel.Application');
try
XLApp.Visible:=False;
XLApp.Workbooks.Open(AXLSFile);
Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Select;
y := XLApp.ActiveCell.Row;
x := XLApp.ActiveCell.Column;
AGrid.RowCount:=24;
AGrid.ColCount:=x;
RangeMatrix := XLApp.Range['B2', XLApp.Cells.Item[y,x]];
RangeMatrix := RangeMatrix.Value;
(...)
end;
一切正常,除了这一行:
x := XLApp.ActiveCell.Column;;
我的工作表有2个COLUMNS和ActiveCell.Column返回5,9,或除2之外的任何其他值!我选择并删除了其他单元格/列中的所有值
可能是什么问题?
谢谢!
您将Sheet定义为工作簿中的第一个工作表,然后在任何时候任意地决定是否打扰使用它。
Sheet := XLApp.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1];
y := Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Row;
x := Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Column;
...
RangeMatrix := Sheet.Range['B2', Sheet.Cells.Item[y,x]];
在尝试避免使用xlApp
时,我用Sheet
替换了几次.Select
。如果这不完美,那是因为我没有德尔福,但你应该得到一般的想法。
我发现它不是乱用“... SpecialCells(xlCellTypeLastCell ......”)。
像这样使用“UsedRange”更容易>>
x := Sheet.UsedRange.Rows.Count;
y := Sheet.UsedRange.Columns.Count;
SpecialCells的问题在于您无法在受保护的工作表上使用它。