这是我的小测试应用程序,它生成一个Excel 2007 XLSX文件:
uses
Excel2007;
function CreateExportExcelWorkbook(AApp: ExcelApplication; ALCID: Integer): ExcelWorkbook;
var
OldDefaultSaveFormat: XlFileFormat;
begin
OldDefaultSaveFormat := AApp.DefaultSaveFormat;
AApp.DefaultSaveFormat := xlOpenXMLWorkbook;
try
Result := AApp.Workbooks.Add(xlWBATWorksheet, ALCID);
finally
AApp.DefaultSaveFormat := OldDefaultSaveFormat;
end;
end;
procedure FixTopRows(AApp: ExcelApplication; ARowCount: Integer);
var
ActiveWindow: Window;
begin
ActiveWindow := AApp.ActiveWindow;
ActiveWindow.SplitColumn := 0;
ActiveWindow.SplitRow := ARowCount;
ActiveWindow.FreezePanes := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
cRowCount = 200;
cColCount = 10;
var
LCID: Integer;
ExcelApp: ExcelApplication;
Workbook: ExcelWorkbook;
Worksheet: ExcelWorksheet;
i, j: Integer;
FVarArray: Variant;
Cell1, Range: ExcelRange;
begin
LCID := GetUserDefaultLCID;
ExcelApp := CoExcelApplication.Create;
try
ExcelApp.Visible[LCID] := False;
ExcelApp.UserControl := False;
ExcelApp.DisplayAlerts[LCID] := False;
Workbook := CreateExportExcelWorkbook(ExcelApp, LCID);
Worksheet := Workbook.Worksheets.Item[1] as ExcelWorksheet;
FVarArray := VarArrayCreate([0, cRowCount - 1, 0, cColCount - 1], varVariant);
for j := 0 to cColCount - 1 do
FVarArray[0, j] := Format('Column %d', [j]);
for i := 1 to cRowCount - 1 do
for j := 0 to cColCount - 1 do
FVarArray[i, j] := 100 * i + j;
Cell1 := Worksheet.Cells.Range['A1', 'A1'];
Range := Worksheet.Range[Cell1, Cell1.Offset[cRowCount - 1, cColCount - 1]];
Range.Value[EmptyParam] := FVarArray;
VarClear(FVarArray);
Range.EntireColumn.AutoFit;
FixTopRows(ExcelApp, 1);
Range := Worksheet.Range[Cell1, Cell1.Offset[0, cColCount - 1]];
//Range := Cell1.EntireRow;
//Range.AutoFilter(1, 'All', EmptyParam, EmptyParam, True);
Workbook.SaveAs(ExpandFileName('test.xlsx'), EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
xlNoChange, EmptyParam, False, EmptyParam, EmptyParam, EmptyParam, LCID);
finally
ExcelApp.Quit;
end;
end;
单元Excel2007
是导入的Excel 2007类型库。这到目前为止工作正常。但是,我想在此屏幕截图中自动过滤标题行:
不幸的是,我尝试通过OLE自动化执行此操作导致OLE或Variant异常。知道我该怎么办吗?
注意:不应过滤数据 - 我只想要下拉按钮。
答案 0 :(得分:3)
您需要指定您未能执行的运算符。例如:
Worksheet.Cells.AutoFilter(1, EmptyParam, xlAnd, EmptyParam, True);
请注意,Criteria1
参数是可选的,可以省略,默认为'All'
。