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 AddPageBreakToCol(ACol: Cardinal);
|
||||||
procedure AddPageBreakToRow(ARow: Cardinal);
|
procedure AddPageBreakToRow(ARow: Cardinal);
|
||||||
|
function IsPageBreakCol(ACol: Cardinal): Boolean;
|
||||||
|
function IsPageBreakRow(ARow: Cardinal): Boolean;
|
||||||
procedure RemovePageBreakFromCol(ACol: Cardinal);
|
procedure RemovePageBreakFromCol(ACol: Cardinal);
|
||||||
procedure RemovePageBreakFromRow(ARow: Cardinal);
|
procedure RemovePageBreakFromRow(ARow: Cardinal);
|
||||||
|
|
||||||
@ -8400,7 +8402,7 @@ procedure TsWorksheet.AddPageBreakToCol(ACol: Cardinal);
|
|||||||
var
|
var
|
||||||
lCol: PCol;
|
lCol: PCol;
|
||||||
begin
|
begin
|
||||||
lCol := AddCol(ACol);
|
lCol := GetCol(ACol);
|
||||||
Include(lCol^.Options, croPageBreak);
|
Include(lCol^.Options, croPageBreak);
|
||||||
ChangedCol(ACol);
|
ChangedCol(ACol);
|
||||||
end;
|
end;
|
||||||
@ -8414,11 +8416,35 @@ procedure TsWorksheet.AddPageBreakToRow(ARow: Cardinal);
|
|||||||
var
|
var
|
||||||
lRow: PRow;
|
lRow: PRow;
|
||||||
begin
|
begin
|
||||||
lRow := AddRow(ARow);
|
lRow := GetRow(ARow);
|
||||||
Include(lRow^.Options, croPageBreak);
|
Include(lRow^.Options, croPageBreak);
|
||||||
ChangedRow(ARow);
|
ChangedRow(ARow);
|
||||||
end;
|
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
|
Removes the PageBreak flag for the column record with the specified column
|
||||||
index.
|
index.
|
||||||
@ -8431,8 +8457,11 @@ var
|
|||||||
lCol: PCol;
|
lCol: PCol;
|
||||||
begin
|
begin
|
||||||
lCol := FindCol(ACol);
|
lCol := FindCol(ACol);
|
||||||
if lCol <> nil then begin
|
if Assigned(lCol) then begin
|
||||||
Exclude(lCol^.Options, croPageBreak);
|
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);
|
ChangedCol(ACol);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -8448,8 +8477,11 @@ var
|
|||||||
lRow: PRow;
|
lRow: PRow;
|
||||||
begin
|
begin
|
||||||
lRow := FindRow(ARow);
|
lRow := FindRow(ARow);
|
||||||
if lRow <> nil then begin
|
if Assigned(lRow) then begin
|
||||||
Exclude(lRow^.Options, croPageBreak);
|
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);
|
ChangedRow(ARow);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -91,6 +91,7 @@ type
|
|||||||
procedure WriteColumns(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
procedure WriteColumns(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
procedure WriteExcelWorkbook(AStream: TStream);
|
procedure WriteExcelWorkbook(AStream: TStream);
|
||||||
procedure WriteNames(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
procedure WriteNames(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
|
procedure WritePageBreaks(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
procedure WriteRows(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
procedure WriteRows(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
procedure WriteStyle(AStream: TStream; AIndex: Integer);
|
procedure WriteStyle(AStream: TStream; AIndex: Integer);
|
||||||
procedure WriteStyles(AStream: TStream);
|
procedure WriteStyles(AStream: TStream);
|
||||||
@ -2187,6 +2188,66 @@ begin
|
|||||||
);
|
);
|
||||||
end;
|
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;
|
procedure TsSpreadExcelXMLWriter.WriteRows(AStream: TStream;
|
||||||
AWorksheet: TsBasicWorksheet);
|
AWorksheet: TsBasicWorksheet);
|
||||||
var
|
var
|
||||||
@ -2503,6 +2564,7 @@ begin
|
|||||||
WriteNames(AStream, AWorksheet);
|
WriteNames(AStream, AWorksheet);
|
||||||
WriteTable(AStream, AWorksheet);
|
WriteTable(AStream, AWorksheet);
|
||||||
WriteWorksheetOptions(AStream, AWorksheet);
|
WriteWorksheetOptions(AStream, AWorksheet);
|
||||||
|
WritePageBreaks(AStream, AWorksheet);
|
||||||
AppendToStream(AStream,
|
AppendToStream(AStream,
|
||||||
' </Worksheet>' + LF
|
' </Worksheet>' + LF
|
||||||
);
|
);
|
||||||
|
@ -69,6 +69,7 @@ type
|
|||||||
procedure ReadBorders(ANode: TDOMNode);
|
procedure ReadBorders(ANode: TDOMNode);
|
||||||
procedure ReadCell(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
procedure ReadCell(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
||||||
procedure ReadCellXfs(ANode: TDOMNode);
|
procedure ReadCellXfs(ANode: TDOMNode);
|
||||||
|
procedure ReadColRowBreaks(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
||||||
function ReadColor(ANode: TDOMNode): TsColor;
|
function ReadColor(ANode: TDOMNode): TsColor;
|
||||||
procedure ReadCols(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
procedure ReadCols(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
||||||
procedure ReadComments(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
procedure ReadComments(ANode: TDOMNode; AWorksheet: TsBasicWorksheet);
|
||||||
@ -135,6 +136,7 @@ type
|
|||||||
function PrepareFormula(const AFormula: String): String;
|
function PrepareFormula(const AFormula: String): String;
|
||||||
procedure ResetStreams;
|
procedure ResetStreams;
|
||||||
procedure WriteBorderList(AStream: TStream);
|
procedure WriteBorderList(AStream: TStream);
|
||||||
|
procedure WriteColBreaks(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
procedure WriteCols(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
procedure WriteCols(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
procedure WriteComments(AWorksheet: TsBasicWorksheet);
|
procedure WriteComments(AWorksheet: TsBasicWorksheet);
|
||||||
procedure WriteDefinedNames(AStream: TStream);
|
procedure WriteDefinedNames(AStream: TStream);
|
||||||
@ -153,6 +155,7 @@ type
|
|||||||
procedure WritePageMargins(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
procedure WritePageMargins(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
procedure WritePageSetup(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
procedure WritePageSetup(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
procedure WritePrintOptions(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
procedure WritePrintOptions(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
|
procedure WriteRowBreaks(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
procedure WriteSheetData(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
procedure WriteSheetData(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
procedure WriteSheetFormatPr(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
procedure WriteSheetFormatPr(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
procedure WriteSheetPr(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
procedure WriteSheetPr(AStream: TStream; AWorksheet: TsBasicWorksheet);
|
||||||
@ -1051,6 +1054,43 @@ begin
|
|||||||
end;
|
end;
|
||||||
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;
|
function TsSpreadOOXMLReader.ReadColor(ANode: TDOMNode): TsColor;
|
||||||
var
|
var
|
||||||
s: String;
|
s: String;
|
||||||
@ -2678,6 +2718,8 @@ begin
|
|||||||
ReadPrintOptions(Doc_FindNode('printOptions'), FWorksheet);
|
ReadPrintOptions(Doc_FindNode('printOptions'), FWorksheet);
|
||||||
ReadPageMargins(Doc_FindNode('pageMargins'), FWorksheet);
|
ReadPageMargins(Doc_FindNode('pageMargins'), FWorksheet);
|
||||||
ReadPageSetup(Doc_FindNode('pageSetup'), FWorksheet);
|
ReadPageSetup(Doc_FindNode('pageSetup'), FWorksheet);
|
||||||
|
ReadColRowBreaks(Doc_FindNode('rowBreaks'), FWorksheet);
|
||||||
|
ReadColRowBreaks(Doc_FindNode('colBreaks'), FWorksheet);
|
||||||
ReadHeaderFooter(Doc_FindNode('headerFooter'), FWorksheet);
|
ReadHeaderFooter(Doc_FindNode('headerFooter'), FWorksheet);
|
||||||
|
|
||||||
FreeAndNil(Doc);
|
FreeAndNil(Doc);
|
||||||
@ -3034,6 +3076,28 @@ begin
|
|||||||
'</borders>');
|
'</borders>');
|
||||||
end;
|
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;
|
procedure TsSpreadOOXMLWriter.WriteCols(AStream: TStream;
|
||||||
AWorksheet: TsBasicWorksheet);
|
AWorksheet: TsBasicWorksheet);
|
||||||
var
|
var
|
||||||
@ -3480,6 +3544,27 @@ begin
|
|||||||
'<printOptions' + s + ' />');
|
'<printOptions' + s + ' />');
|
||||||
end;
|
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;
|
procedure TsSpreadOOXMLWriter.WriteSheetData(AStream: TStream;
|
||||||
AWorksheet: TsBasicWorksheet);
|
AWorksheet: TsBasicWorksheet);
|
||||||
var
|
var
|
||||||
@ -5078,6 +5163,8 @@ begin
|
|||||||
WritePrintOptions(FSSheets[FCurSheetNum], AWorksheet);
|
WritePrintOptions(FSSheets[FCurSheetNum], AWorksheet);
|
||||||
WritePageMargins(FSSheets[FCurSheetNum], AWorksheet);
|
WritePageMargins(FSSheets[FCurSheetNum], AWorksheet);
|
||||||
WritePageSetup(FSSheets[FCurSheetNum], AWorksheet);
|
WritePageSetup(FSSheets[FCurSheetNum], AWorksheet);
|
||||||
|
WriteRowBreaks(FSSheets[FCurSheetNum], AWorksheet);
|
||||||
|
WriteColBreaks(FSSheets[FCurSheetNum], AWorksheet);
|
||||||
WriteHeaderFooter(FSSheets[FCurSheetNum], AWorksheet);
|
WriteHeaderFooter(FSSheets[FCurSheetNum], AWorksheet);
|
||||||
|
|
||||||
{ This item is required for all embedded images.
|
{ This item is required for all embedded images.
|
||||||
|
@ -52,11 +52,18 @@ type
|
|||||||
// Set up expected values:
|
// Set up expected values:
|
||||||
procedure SetUp; override;
|
procedure SetUp; override;
|
||||||
procedure TearDown; override;
|
procedure TearDown; override;
|
||||||
|
|
||||||
procedure TestWriteRead_InsDelColRow(ATestIndex: Integer;
|
procedure TestWriteRead_InsDelColRow(ATestIndex: Integer;
|
||||||
AFormat: TsSpreadsheetFormat);
|
AFormat: TsSpreadsheetFormat);
|
||||||
procedure TestWriteRead_HideShowColRow(IsCol: Boolean;
|
procedure TestWriteRead_HideShowColRow(IsCol: Boolean;
|
||||||
IsHide: boolean; IsDefaultColRow: Boolean; AFormat: TsSpreadsheetFormat);
|
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
|
published
|
||||||
|
|
||||||
// *** Excel 8 tests ***
|
// *** Excel 8 tests ***
|
||||||
@ -165,6 +172,7 @@ type
|
|||||||
procedure TestWriteRead_InsDelColRow_33_OOXML; // row through merged block
|
procedure TestWriteRead_InsDelColRow_33_OOXML; // row through merged block
|
||||||
procedure TestWriteRead_InsDelColRow_34_OOXML; // row after merged block
|
procedure TestWriteRead_InsDelColRow_34_OOXML; // row after merged block
|
||||||
|
|
||||||
|
|
||||||
// *** OpenDocument tests ***
|
// *** OpenDocument tests ***
|
||||||
|
|
||||||
// Writes out simple cell layout and inserts columns
|
// Writes out simple cell layout and inserts columns
|
||||||
@ -274,6 +282,18 @@ type
|
|||||||
procedure TestWriteRead_ShowRow_XML;
|
procedure TestWriteRead_ShowRow_XML;
|
||||||
procedure TestWriteRead_ShowRow_ODS;
|
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;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -2093,6 +2113,299 @@ begin
|
|||||||
end;
|
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
|
initialization
|
||||||
RegisterTest(TSpreadWriteRead_ColRow_Tests);
|
RegisterTest(TSpreadWriteRead_ColRow_Tests);
|
||||||
InitTestData;
|
InitTestData;
|
||||||
|
Reference in New Issue
Block a user