You've already forked lazarus-ccr
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:
@ -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;
|
||||
|
@ -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
|
||||
);
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user