type XlsxSheetData = class public function Create(sheet_data: SheetData); function Operator[](index: integer): XlsxSheetDataRow; function Cell(r: integer; c: integer): C; function Rows(index: integer): XlsxSheetDataRow; function Serialize(); private rows_: array of XlsxSheetDataRow; sheet_data_: SheetData; end; function XlsxSheetData.Create(sheet_data: SheetData); begin rows_ := array(); sheet_data_ := sheet_data; rows := sheet_data.Rows(); for i:=0 to length(rows)-1 do begin r := strToInt(rows[i].R); rows_[r] := new XlsxSheetDataRow(rows[i]); end // println("rows = {}", rows_); end; function Operator XlsxSheetData.[](index: integer): XlsxSheetDataRow; begin if ifnil(rows_[index]) and tslassigning then begin row := new Row(sheet_data_, "", "row"); rows_[index] := new XlsxSheetDataRow(row); pos := -1; for k,_ in rows_ do // TODO:此处弊端是要遍历所有k,可考虑维护一个新array,用二分 if pos < k and k < index then pos := k; pos = -1 ? sheet_data_.AppendChild(row) : sheet_data_.InsertAfter(row, rows_[pos].Data()); end return rows_[index]; end; function XlsxSheetData.Rows(index: integer): XlsxSheetDataRow; begin return self[index]; end; function XlsxSheetData.Cell(r: integer; c: integer): C; begin bk := tslassigning; tslassigning := 1; c := self[r][c]; tslassigning := bk; return c; end; function XlsxSheetData.Serialize(); begin for k,row in rows_ do begin r := row.Data(); r.R := k; row.Serialize(); end // sheet_data_.Serialize(); end;