2013-09-03 3 views
2

Вот мое маленькое тестовое приложение, которое генерирует 2007 XLSX файл Excel:Как включить AutoFilter для верхнего ряда в листе Excel?

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; 

Unit Excel2007 импортный Excel 2007 библиотеки типов. Пока это прекрасно. Однако я хотел бы сделать строку заголовка автоматической фильтрацией, как на этом скриншоте: screenshot of AutoFilter К сожалению, все мои попытки сделать это с помощью автоматизации OLE привели к исключениям OLE или Variant. Любая идея, как я должен действовать?

NB: Данные не следует фильтровать - мне просто нужны раскрывающиеся кнопки.

ответ

3

Необходимо указать оператора, которого вы не смогли выполнить. Например:

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

Обратите внимание, что параметр Criteria1 не является обязательным, могут быть опущены, и по умолчанию 'All'.

+1

Так просто ... Спасибо, @ Давид! –

Смежные вопросы