Das ist zu 95% so, wie ich es gesucht habe^^ Zwar ist der Filter dann komplett weg (und nicht nur die Filterbedingungen raus) aber das ist nicht schlimm und umgeht damit das "Speicherproblem".
Edit: Mit "if AXLApp.ActiveSheet.FilterMode then AXLApp.ActiveSheet.
ShowAllData;" geht es wie gewollt
Danke für den Tipp HolgerX
Beim Laden der Datei sieht es dann so aus:
Delphi-Quellcode:
function XLS_To_StringGrid(AXLApp : OleVariant; AGrid : TStringGrid; Sheetname : string):Boolean;
const
xlCellTypeLastCell = $0000000B;
var
Sheet: OLEVariant;
RangeMatrix: Variant;
X, Y, K, R: Integer;
begin
Result := False;
try
try
if (Sheetname <> '') and HaveSheet(AXLApp, Sheetname) then begin
Sheet := AXLApp.WorkSheets[Sheetname];
end else
Sheet := AXLApp.WorkSheets[1];
// In order to know the dimension of the WorkSheet, i.e the number of rows
// and the number of columns, we activate the last non-empty cell of it
Sheet.select;
if AXLApp.ActiveSheet.FilterMode then AXLApp.ActiveSheet.ShowAllData; //Fix: Fehler durch gesetzte Filter vermeiden
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
X := AXLApp.ActiveCell.Row; // Get the value of the last row
Y := AXLApp.ActiveCell.Column; // Get the value of the last column
// Set Stringgrid's row &col dimensions.
AGrid.RowCount := X; // Excel-Row 1 = Header
AGrid.ColCount := Y;
RangeMatrix := Sheet.Range['A1', Sheet.Cells.Item[X, Y]].Value; // Assign the Variant associated with the WorkSheet to the Delphi Variant
// Define the loop for filling in the TStringGrid
K := 0;
While (K < X) do begin
Inc(K);
for r := 1 to y do
AGrid.Cells[(R - 1), (K - 1)] := RangeMatrix[K, R];
end;
Result := True;
except
// Logging...
end;
finally
RangeMatrix := Unassigned;
Sheet := Unassigned;
end;
end;
Und beim Speichern so:
Delphi-Quellcode:
function StringGridToXLS(AXLApp : OleVariant; AGrid : TStringGrid; Sheetname : string):Boolean;
const
xlCellTypeLastCell = $0000000B;
var
Sheet: OLEVariant;
MaxCol : Integer;
MaxRow : Integer;
Range : OleVariant;
Data : OleVariant;
Col : Integer;
Row : Integer;
R1,R2 : string;
begin
Result := False;
try
//Worksheet auswählen
if (Sheetname <> '') and HaveSheet(AXLApp, Sheetname) then
begin
Sheet := AXLApp.WorkSheets[sheetname];
end else
Sheet := AXLApp.WorkSheets[1];
Sheet.select;
if AXLApp.ActiveSheet.FilterMode then AXLApp.ActiveSheet.ShowAllData; //Fix: Fehler durch gesetzte Filter vermeiden
// Der vorhandenen Daten im Grid, nicht der möglichen in Excel...
MaxCol := AGrid.ColCount;
MaxRow := AGrid.RowCount;
if (MaxRow > 0) and (MaxCol > 0) then
begin
//Bereich auswählen
R1 := RefToCell(1, 1);
R2 := RefToCell(MaxCol, MaxRow);
Range := Sheet.Range[R1, R2];
if not VarIsNull(Range) then
begin
//Daten aus Grid holen
Data := VarArrayCreate([1, MaxRow, 1, MaxCol], varVariant);
for Row := 0 to Pred(MaxRow) do
begin
for Col := 0 to Pred(MaxCol) do
begin
Data[Succ(Row), Succ(Col)] := AGrid.Cells[Col, Row];
end;
end;
//Daten dem Excelsheet übergeben
Range.Value := Data;
Range.Columns.AutoFit;
Result := True;
end;
end;
finally
SaveExcel(AXLApp);
Range := UnAssigned;
Sheet := Unassigned;
Data := Unassigned;
end;
end;