diff --git a/components/fpspreadsheet/source/common/fpspreadsheet.pas b/components/fpspreadsheet/source/common/fpspreadsheet.pas index cb55adc56..e55ed6334 100644 --- a/components/fpspreadsheet/source/common/fpspreadsheet.pas +++ b/components/fpspreadsheet/source/common/fpspreadsheet.pas @@ -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; diff --git a/components/fpspreadsheet/source/common/xlsxml.pas b/components/fpspreadsheet/source/common/xlsxml.pas index 74bee2c6a..ab5b8f7be 100644 --- a/components/fpspreadsheet/source/common/xlsxml.pas +++ b/components/fpspreadsheet/source/common/xlsxml.pas @@ -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 + + '' + LF; + + if nc > 0 then begin + s := s + INDENT3 + + '' + 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 + + '' + LF + INDENT5 + + '' + IntToStr(col^.Col) + '' + LF + INDENT4 + + '' + LF; + end; + s := s + INDENT3 + + '' + LF; + end; + + if nr > 0 then begin + s := s + INDENT3 + + '' + 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 + + '' + LF + INDENT5 + + '' + IntToStr(row^.Row) + '' + LF + INDENT4 + + '' + LF; + end; + s := s + INDENT3 + + '' + LF; + end; + + s := s + INDENT2 + + '' + 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, ' ' + LF ); diff --git a/components/fpspreadsheet/source/common/xlsxooxml.pas b/components/fpspreadsheet/source/common/xlsxooxml.pas index a3a1a4c48..0bf4decea 100644 --- a/components/fpspreadsheet/source/common/xlsxooxml.pas +++ b/components/fpspreadsheet/source/common/xlsxooxml.pas @@ -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 ''); 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( + '', [n, n])); + for i := 0 to sheet.Cols.Count - 1 do + AppendToStream(AStream, Format( + '', [PCol(sheet.Cols[i])^.Col])); + AppendToStream(AStream, + ''); +end; + procedure TsSpreadOOXMLWriter.WriteCols(AStream: TStream; AWorksheet: TsBasicWorksheet); var @@ -3480,6 +3544,27 @@ begin ''); 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( + '', [n, n])); + for i := 0 to sheet.Rows.Count - 1 do + AppendToStream(AStream, Format( + '', [PRow(sheet.Rows[i])^.Row])); + AppendToStream(AStream, + ''); +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. diff --git a/components/fpspreadsheet/tests/colrowtests.pas b/components/fpspreadsheet/tests/colrowtests.pas index e630a24ef..3ae231e26 100644 --- a/components/fpspreadsheet/tests/colrowtests.pas +++ b/components/fpspreadsheet/tests/colrowtests.pas @@ -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;