excel - 如何为 Excel 工作表中的顶行启用自动筛选?

标签 excel delphi excel-2007 autofilter ole-automation

这是我的小测试应用程序,它生成 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类型库。到目前为止效果很好。不过,我想让标题行自动过滤,如下屏幕截图所示:screenshot of AutoFilter 不幸的是,我通过 OLE 自动化执行此操作的所有尝试都导致了 OLE 或变体异常。知道我应该如何进行吗?

注意:不应过滤数据 - 我只想要下拉按钮。

最佳答案

您需要指定运算符(operator),但您未能执行此操作。例如:

Worksheet.Cells.AutoFilter(1, EmptyParam, xlAnd, EmptyParam, True);

请注意,Criteria1 参数是可选的,可以省略,默认为'All'

关于excel - 如何为 Excel 工作表中的顶行启用自动筛选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18589760/

相关文章:

php - 如何下载包含 HTML 标签的 csv 文件

Delphi内联使用导致 'F2084 internal error'

delphi - 符号数值大整数的按位运算

excel - Excel中如何计算不等于通配符?

vba - 使用 VBA 复制大文件大小的范围

excel - 我想从 excel 导出格式化我的 csv 文件

excel - 显示 [h] :mm numberformat with comma separator for thousands of hours

excel - 这个公式有什么作用?

delphi - log4d 与 log4delphi

Excel如何查找1列中的值存在于另一列的值范围内