fpspreadsheet: Read/write PageBreaks in xlsx format, write in Excel2003/xml format.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7069 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2019-07-23 23:10:20 +00:00
parent 6fb1f76bc2
commit aece082d53
4 changed files with 498 additions and 4 deletions

View File

@ -491,6 +491,8 @@ type
procedure AddPageBreakToCol(ACol: Cardinal);
procedure AddPageBreakToRow(ARow: Cardinal);
function IsPageBreakCol(ACol: Cardinal): Boolean;
function IsPageBreakRow(ARow: Cardinal): Boolean;
procedure RemovePageBreakFromCol(ACol: Cardinal);
procedure RemovePageBreakFromRow(ARow: Cardinal);
@ -8400,7 +8402,7 @@ procedure TsWorksheet.AddPageBreakToCol(ACol: Cardinal);
var
lCol: PCol;
begin
lCol := AddCol(ACol);
lCol := GetCol(ACol);
Include(lCol^.Options, croPageBreak);
ChangedCol(ACol);
end;
@ -8414,11 +8416,35 @@ procedure TsWorksheet.AddPageBreakToRow(ARow: Cardinal);
var
lRow: PRow;
begin
lRow := AddRow(ARow);
lRow := GetRow(ARow);
Include(lRow^.Options, croPageBreak);
ChangedRow(ARow);
end;
{@@ ----------------------------------------------------------------------------
Returns true if the column with the specified index is the first one after a
manual page break.
-------------------------------------------------------------------------------}
function TsWorksheet.IsPageBreakCol(ACol: Cardinal): Boolean;
var
lCol: PCol;
begin
lCol := FindCol(ACol);
Result := Assigned(lCol) and (croPageBreak in lCol^.Options);
end;
{@@ ----------------------------------------------------------------------------
Returns true if the row with the specified index is the first one after a
manual page break.
-------------------------------------------------------------------------------}
function TsWorksheet.IsPageBreakRow(ARow: Cardinal): Boolean;
var
lRow: PRow;
begin
lRow := FindRow(ARow);
Result := Assigned(lRow) and (croPageBreak in lRow^.Options);
end;
{@@ ----------------------------------------------------------------------------
Removes the PageBreak flag for the column record with the specified column
index.
@ -8431,8 +8457,11 @@ var
lCol: PCol;
begin
lCol := FindCol(ACol);
if lCol <> nil then begin
if Assigned(lCol) then begin
Exclude(lCol^.Options, croPageBreak);
// Free and delete node when the col record only has default values now.
if (lCol^.Options = []) and (lCol^.FormatIndex = 0) and (lCol^.ColWidthType = cwtDefault) then
RemoveCol(ACol);
ChangedCol(ACol);
end;
end;
@ -8448,8 +8477,11 @@ var
lRow: PRow;
begin
lRow := FindRow(ARow);
if lRow <> nil then begin
if Assigned(lRow) then begin
Exclude(lRow^.Options, croPageBreak);
// Free and delete node if the row record only has default values now.
if (lRow^.Options = []) and (lRow^.FormatIndex = 0) and (lRow^.RowHeightType = rhtDefault) then
RemoveRow(ARow);
ChangedRow(ARow);
end;
end;

View File

@ -91,6 +91,7 @@ type
procedure WriteColumns(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WriteExcelWorkbook(AStream: TStream);
procedure WriteNames(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WritePageBreaks(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WriteRows(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WriteStyle(AStream: TStream; AIndex: Integer);
procedure WriteStyles(AStream: TStream);
@ -2187,6 +2188,66 @@ begin
);
end;
procedure TsSpreadExcelXMLWriter.WritePageBreaks(AStream: TStream;
AWorksheet: TsBasicWorksheet);
var
i: Integer;
nc, nr: Integer;
sheet: TsWorksheet absolute AWorksheet;
s: String;
col: PCol;
row: PRow;
begin
nc := 0;
for i := 0 to sheet.Cols.Count - 1 do
if (croPageBreak in PCol(sheet.Cols[i])^.Options) then inc(nc);
nr := 0;
for i:= 0 to sheet.Rows.Count - 1 do
if (croPageBreak in PRow(sheet.Rows[i])^.Options) then inc(nr);
if (nc = 0) and (nr = 0) then
exit;
s := INDENT2 +
'<PageBreaks xmlns="urn:schemas-microsoft-com:office:excel">' + LF;
if nc > 0 then begin
s := s + INDENT3 +
'<ColBreaks>' + LF;
for i := 0 to sheet.Cols.Count - 1 do begin
col := PCol(sheet.Cols[i]);
if (croPageBreak in col^.Options) then
s := s + INDENT4 +
'<ColBreak>' + LF + INDENT5 +
'<Column>' + IntToStr(col^.Col) + '</Column>' + LF + INDENT4 +
'</ColBreak>' + LF;
end;
s := s + INDENT3 +
'</ColBreaks>' + LF;
end;
if nr > 0 then begin
s := s + INDENT3 +
'<RowBreaks>' + LF;
for i := 0 to sheet.Rows.Count - 1 do begin
row := PRow(sheet.Rows[i]);
if (croPageBreak in row^.Options) then
s := s + INDENT4 +
'<RowBreak>' + LF + INDENT5 +
'<Row>' + IntToStr(row^.Row) + '</Row>' + LF + INDENT4 +
'</RowBreak>' + LF;
end;
s := s + INDENT3 +
'</RowBreaks>' + LF;
end;
s := s + INDENT2 +
'</PageBreaks>' + LF;
AppendToStream(AStream, s);
end;
procedure TsSpreadExcelXMLWriter.WriteRows(AStream: TStream;
AWorksheet: TsBasicWorksheet);
var
@ -2503,6 +2564,7 @@ begin
WriteNames(AStream, AWorksheet);
WriteTable(AStream, AWorksheet);
WriteWorksheetOptions(AStream, AWorksheet);
WritePageBreaks(AStream, AWorksheet);
AppendToStream(AStream,
' </Worksheet>' + LF
);

View File

@ -69,6 +69,7 @@ type
procedure ReadBorders(ANode: TDOMNode);
procedure ReadCell(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
procedure ReadCellXfs(ANode: TDOMNode);
procedure ReadColRowBreaks(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
function ReadColor(ANode: TDOMNode): TsColor;
procedure ReadCols(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
procedure ReadComments(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
@ -135,6 +136,7 @@ type
function PrepareFormula(const AFormula: String): String;
procedure ResetStreams;
procedure WriteBorderList(AStream: TStream);
procedure WriteColBreaks(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WriteCols(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WriteComments(AWorksheet: TsBasicWorksheet);
procedure WriteDefinedNames(AStream: TStream);
@ -153,6 +155,7 @@ type
procedure WritePageMargins(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WritePageSetup(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WritePrintOptions(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WriteRowBreaks(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WriteSheetData(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WriteSheetFormatPr(AStream: TStream; AWorksheet: TsBasicWorksheet);
procedure WriteSheetPr(AStream: TStream; AWorksheet: TsBasicWorksheet);
@ -1051,6 +1054,43 @@ begin
end;
end;
procedure TsSpreadOOXMLReader.ReadColRowBreaks(ANode: TDOMNode;
AWorksheet: TsBasicWorksheet);
var
s: String;
sheet: TsWorksheet absolute AWorksheet;
node: TDOMNode;
nodeName: String;
n: Integer;
isCol: Boolean;
begin
if (ANode = nil) or (AWorksheet = nil) then // just to make sure...
exit;
nodeName := ANode.NodeName;
isCol := nodeName = 'colBreaks';
node := ANode.FirstChild;
while node <> nil do
begin
nodeName := node.NodeName;
if nodeName = 'brk' then begin
s := GetAttrValue(node, 'id');
if (s <> '') and TryStrToInt(s, n) then
begin
s := GetAttrValue(node, 'man');
if s = '1' then
begin
if isCol then
sheet.AddPageBreakToCol(n)
else
sheet.AddPageBreakToRow(n);
end;
end;
end;
node := node.NextSibling;
end;
end;
function TsSpreadOOXMLReader.ReadColor(ANode: TDOMNode): TsColor;
var
s: String;
@ -2678,6 +2718,8 @@ begin
ReadPrintOptions(Doc_FindNode('printOptions'), FWorksheet);
ReadPageMargins(Doc_FindNode('pageMargins'), FWorksheet);
ReadPageSetup(Doc_FindNode('pageSetup'), FWorksheet);
ReadColRowBreaks(Doc_FindNode('rowBreaks'), FWorksheet);
ReadColRowBreaks(Doc_FindNode('colBreaks'), FWorksheet);
ReadHeaderFooter(Doc_FindNode('headerFooter'), FWorksheet);
FreeAndNil(Doc);
@ -3034,6 +3076,28 @@ begin
'</borders>');
end;
procedure TsSpreadOOXMLWriter.WriteColBreaks(AStream: TStream;
AWorksheet: TsBasicWorksheet);
var
sheet: TsWorksheet absolute AWorksheet;
n: Integer;
i: Integer;
begin
n := 0;
for i := 0 to sheet.Cols.Count - 1 do
if (croPageBreak in PCol(sheet.Cols[i])^.Options) then inc(n);
if n = 0 then
exit;
AppendToStream(AStream, Format(
'<colBreaks count="%d" manualBreakCount="%d">', [n, n]));
for i := 0 to sheet.Cols.Count - 1 do
AppendToStream(AStream, Format(
'<brk id="%d" max="1048575" man="1" />', [PCol(sheet.Cols[i])^.Col]));
AppendToStream(AStream,
'</colBreaks>');
end;
procedure TsSpreadOOXMLWriter.WriteCols(AStream: TStream;
AWorksheet: TsBasicWorksheet);
var
@ -3480,6 +3544,27 @@ begin
'<printOptions' + s + ' />');
end;
procedure TsSpreadOOXMLWriter.WriteRowBreaks(AStream: TStream;
AWorksheet: TsBasicWorksheet);
var
i, n: Integer;
sheet: TsWorksheet absolute AWorksheet;
begin
n := 0;
for i := 0 to sheet.Rows.Count-1 do
if (croPageBreak in PRow(sheet.Rows[i])^.Options) then inc(n);
if n = 0 then
exit;
AppendToStream(AStream, Format(
'<rowBreaks count="%d" manualBreakCount="%d">', [n, n]));
for i := 0 to sheet.Rows.Count - 1 do
AppendToStream(AStream, Format(
'<brk id="%d" max="16383" man="1" />', [PRow(sheet.Rows[i])^.Row]));
AppendToStream(AStream,
'</rowBreaks>');
end;
procedure TsSpreadOOXMLWriter.WriteSheetData(AStream: TStream;
AWorksheet: TsBasicWorksheet);
var
@ -5078,6 +5163,8 @@ begin
WritePrintOptions(FSSheets[FCurSheetNum], AWorksheet);
WritePageMargins(FSSheets[FCurSheetNum], AWorksheet);
WritePageSetup(FSSheets[FCurSheetNum], AWorksheet);
WriteRowBreaks(FSSheets[FCurSheetNum], AWorksheet);
WriteColBreaks(FSSheets[FCurSheetNum], AWorksheet);
WriteHeaderFooter(FSSheets[FCurSheetNum], AWorksheet);
{ This item is required for all embedded images.

View File

@ -52,11 +52,18 @@ type
// Set up expected values:
procedure SetUp; override;
procedure TearDown; override;
procedure TestWriteRead_InsDelColRow(ATestIndex: Integer;
AFormat: TsSpreadsheetFormat);
procedure TestWriteRead_HideShowColRow(IsCol: Boolean;
IsHide: boolean; IsDefaultColRow: Boolean; AFormat: TsSpreadsheetFormat);
procedure TestWriteRead_AddPageBreak_Col(Hidden: Boolean; AFormat: TsSpreadsheetFormat);
procedure TestWriteRead_AddPageBreak_Row(Hidden: Boolean; AFormat: TsSpreadsheetFormat);
procedure TestWriteRead_RemovePageBreak_Col(Hidden: Boolean; AFormat: TsSpreadsheetFormat);
procedure TestWriteRead_RemovePageBreak_Row(Hidden: Boolean; AFormat: TsSpreadsheetFormat);
published
// *** Excel 8 tests ***
@ -165,6 +172,7 @@ type
procedure TestWriteRead_InsDelColRow_33_OOXML; // row through merged block
procedure TestWriteRead_InsDelColRow_34_OOXML; // row after merged block
// *** OpenDocument tests ***
// Writes out simple cell layout and inserts columns
@ -274,6 +282,18 @@ type
procedure TestWriteRead_ShowRow_XML;
procedure TestWriteRead_ShowRow_ODS;
// Add a page break column
procedure TestWriteRead_AddPageBreak_Col_OOXML;
procedure TestWriteRead_AddPageBreak_ColHidden_OOXML;
procedure TestWriteRead_AddPageBreak_Row_OOXML;
procedure TestWriteRead_AddPageBreak_RowHidden_OOXML;
// Remove a page break column
procedure TestWriteRead_RemovePageBreak_Col_OOXML;
procedure TestWriteRead_RemovePageBreak_ColHidden_OOXML;
procedure TestWriteRead_RemovePageBreak_Row_OOXML;
procedure TestWriteRead_RemovePageBreak_RowHidden_OOXML;
end;
implementation
@ -2093,6 +2113,299 @@ begin
end;
{ *** Add/remove page breaks *** }
{ Add page break to column
- Hidden: set the Hidden flag in the options to test whether it is damaged }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Col(
Hidden: Boolean; AFormat: TsSpreadsheetFormat);
const
COL_INDEX = 5;
var
book: TsWorkbook;
sheet: TsWorksheet;
tempFile: String;
col: PCol;
begin
TempFile := GetTempFileName;
// Create dummy workbook with forced page break and save to temp file
book := TsWorkbook.Create;
try
sheet := book.AddWorksheet('Test');
sheet.AddPageBreakToCol(COL_INDEX);
if Hidden then
sheet.HideCol(COL_INDEX);
col := sheet.FindCol(COL_INDEX);
CheckEquals(true, col <> nil,
'Col record not found, col ' + IntToStr(COL_INDEX));
CheckEquals(true, croPageBreak in col^.Options,
'Unsaved PageBreak flag mismatch, col ' + IntToStr(COL_INDEX));
if Hidden then
CheckEquals(true, croHidden in col^.Options,
'Unsaved Hidden flag mismatch, col ' + IntToStr(COL_INDEX));
book.WriteToFile(tempFile, AFormat, true);
finally
book.Free;
end;
// Read test file
book := TsWorkbook.Create;
try
book.ReadFromFile(tempFile, AFormat);
sheet := book.GetFirstWorksheet;
col := sheet.FindCol(COL_INDEX);
CheckEquals(true, col <> nil,
'Saved col record not found, col ' + IntToStr(COL_INDEX));
CheckEquals(true, croPageBreak in col^.Options,
'Saved PageBreak flag mismatch, col ' + IntToStr(COL_INDEX));
finally
book.Free;
DeleteFile(TempFile);
end;
end;
{ Add page break to row
- Hidden: set the Hidden flag in the options to test whether it is damaged }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Row(
Hidden: Boolean; AFormat: TsSpreadsheetFormat);
const
ROW_INDEX = 5;
var
book: TsWorkbook;
sheet: TsWorksheet;
tempFile: String;
row: PRow;
begin
TempFile := GetTempFileName;
// Create dummy workbook with forced page break and save to temp file
book := TsWorkbook.Create;
try
sheet := book.AddWorksheet('Test');
sheet.AddPageBreakToRow(ROW_INDEX);
if Hidden then
sheet.HideRow(ROW_INDEX);
row := sheet.FindRow(ROW_INDEX);
CheckEquals(true, row <> nil,
'Row record not found, row ' + IntToStr(ROW_INDEX));
CheckEquals(true, croPageBreak in row^.Options,
'Unsaved PageBreak flag mismatch, row ' + IntToStr(ROW_INDEX));
if Hidden then
CheckEquals(true, croHidden in row^.Options,
'Unsaved Hidden flag mismatch, row ' + IntToStr(ROW_INDEX));
book.WriteToFile(tempFile, AFormat, true);
finally
book.Free;
end;
// Read test file
book := TsWorkbook.Create;
try
book.ReadFromFile(tempFile, AFormat);
sheet := book.GetFirstWorksheet;
row := sheet.FindRow(ROW_INDEX);
CheckEquals(true, row <> nil,
'Saved row record not found, row ' + IntToStr(ROW_INDEX));
CheckEquals(true, croPageBreak in row^.Options,
'Saved PageBreak flag mismatch, row ' + IntToStr(ROW_INDEX));
finally
book.Free;
DeleteFile(TempFile);
end;
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Col_OOXML;
begin
TestWriteRead_AddPageBreak_Col(false, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_Row_OOXML;
begin
TestWriteRead_AddPageBreak_Row(false, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_ColHidden_OOXML;
begin
TestWriteRead_AddPageBreak_Col(true, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_AddPageBreak_RowHidden_OOXML;
begin
TestWriteRead_AddPageBreak_Row(true, sfOOXML);
end;
{ Remove page break
- Hidden: set the Hidden flag in the options to test whether it is damaged
In the test, the entire row/col record is removed when Hidden is false. }
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Col(
Hidden: Boolean; AFormat: TsSpreadsheetFormat);
const
COL_INDEX = 5;
var
book: TsWorkbook;
sheet: TsWorksheet;
tempFile: String;
col: PCol;
begin
TempFile := GetTempFileName;
// Create dummy workbook with forced page break and save to temp file
book := TsWorkbook.Create;
try
sheet := book.AddWorksheet('Test');
sheet.AddPageBreakToCol(COL_INDEX);
if Hidden then
sheet.HideCol(COL_INDEX);
col := sheet.FindCol(COL_INDEX);
CheckEquals(true, col <> nil,
'Col record not found, col ' + IntToStr(COL_INDEX));
CheckEquals(true, croPageBreak in col^.Options,
'Unsaved PageBreak flag mismatch, col ' + IntToStr(COL_INDEX));
if Hidden then
CheckEquals(true, croHidden in col^.Options,
'Unsaved Hidden flag mismatch, col ' + IntToStr(COL_INDEX));
sheet.RemovePageBreakFromCol(COL_INDEX);
col := sheet.FindCol(COL_INDEX);
if Hidden then begin
CheckEquals(true, col <> nil,
'Col record not found, col ' + IntToStr(COL_INDEX));
CheckEquals(false, croPageBreak in col^.Options,
'Unsaved PageBreak flag mismatch, col ' + IntToStr(COL_INDEX));
CheckEquals(true, croHidden in col^.Options,
'Unsaved Hidden flag mismatch, col ' + IntToStr(COL_INDEX));
end else begin
CheckEquals(true, col = nil,
'Unsaved col record still found, col ' + IntToStr(COL_INDEX));
end;
book.WriteToFile(tempFile, AFormat, true);
finally
book.Free;
end;
// Read test file
book := TsWorkbook.Create;
try
book.ReadFromFile(tempFile, AFormat);
sheet := book.GetFirstWorksheet;
col := sheet.FindCol(COL_INDEX);
if Hidden then begin
CheckEquals(true, col <> nil,
'Col record not found, col ' + IntToStr(COL_INDEX));
CheckEquals(false, croPageBreak in col^.Options,
'Saved PageBreak flag mismatch, col ' + IntToStr(COL_INDEX));
CheckEquals(true, croHidden in col^.Options,
'Saved Hidden flag mismatch, col ' + IntToStr(COL_INDEX));
end else begin
CheckEquals(true, col = nil,
'Saved col record still found, col ' + IntToStr(COL_INDEX));
end;
finally
book.Free;
DeleteFile(tempFile);
end;
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Row(
Hidden: Boolean; AFormat: TsSpreadsheetFormat);
const
ROW_INDEX = 5;
var
book: TsWorkbook;
sheet: TsWorksheet;
tempFile: String;
row: PRow;
begin
TempFile := GetTempFileName;
// Create dummy workbook with forced page break and save to temp file
book := TsWorkbook.Create;
try
sheet := book.AddWorksheet('Test');
sheet.AddPageBreakToRow(ROW_INDEX);
if Hidden then
sheet.HideRow(ROW_INDEX);
row := sheet.FindRow(ROW_INDEX);
CheckEquals(true, row <> nil,
'Row record not found, row ' + IntToStr(ROW_INDEX));
CheckEquals(true, croPageBreak in row^.Options,
'Unsaved PageBreak flag mismatch, row ' + IntToStr(ROW_INDEX));
if Hidden then
CheckEquals(true, croHidden in row^.Options,
'Unsaved Hidden flag mismatch, row ' + IntToStr(ROW_INDEX));
sheet.RemovePageBreakFromRow(ROW_INDEX);
row := sheet.FindRow(ROW_INDEX);
if Hidden then begin
CheckEquals(true, row <> nil,
'Row record not found, row ' + IntToStr(ROW_INDEX));
CheckEquals(false, croPageBreak in row^.Options,
'Unsaved PageBreak flag mismatch, row ' + IntToStr(ROW_INDEX));
CheckEquals(true, croHidden in row^.Options,
'Unsaved Hidden flag mismatch, row ' + IntToStr(ROW_INDEX));
end else begin
CheckEquals(true, row = nil,
'Unsaved row record still found, row ' + IntToStr(ROW_INDEX));
end;
book.WriteToFile(tempFile, AFormat, true);
finally
book.Free;
end;
// Read test file
book := TsWorkbook.Create;
try
book.ReadFromFile(tempFile, AFormat);
sheet := book.GetFirstWorksheet;
row := sheet.FindRow(ROW_INDEX);
if Hidden then begin
CheckEquals(true, row <> nil,
'Row record not found, col ' + IntToStr(ROW_INDEX));
CheckEquals(false, croPageBreak in row^.Options,
'Saved PageBreak flag mismatch, row ' + IntToStr(ROW_INDEX));
CheckEquals(true, croHidden in row^.Options,
'Saved Hidden flag mismatch, row ' + IntToStr(ROW_INDEX));
end else begin
CheckEquals(true, row = nil,
'Saved row record still found, row ' + IntToStr(ROW_INDEX));
end;
finally
book.Free;
DeleteFile(tempFile);
end;
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Col_OOXML;
begin
TestWriteRead_RemovePageBreak_Col(false, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_Row_OOXML;
begin
TestWriteRead_RemovePageBreak_Row(false, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_ColHidden_OOXML;
begin
TestWriteRead_RemovePageBreak_Col(true, sfOOXML);
end;
procedure TSpreadWriteRead_ColRow_Tests.TestWriteRead_RemovePageBreak_RowHidden_OOXML;
begin
TestWriteRead_RemovePageBreak_Row(true, sfOOXML);
end;
initialization
RegisterTest(TSpreadWriteRead_ColRow_Tests);
InitTestData;