You've already forked lazarus-ccr
fpspreadsheet: XLSX reader supports expression conditional format. Add test case for it.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7546 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
@ -19,9 +19,6 @@
|
|||||||
<Version Value="2"/>
|
<Version Value="2"/>
|
||||||
</PublishOptions>
|
</PublishOptions>
|
||||||
<RunParams>
|
<RunParams>
|
||||||
<local>
|
|
||||||
<LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
|
|
||||||
</local>
|
|
||||||
<FormatVersion Value="2"/>
|
<FormatVersion Value="2"/>
|
||||||
<Modes Count="1">
|
<Modes Count="1">
|
||||||
<Mode0 Name="default">
|
<Mode0 Name="default">
|
||||||
|
@ -27,85 +27,9 @@ begin
|
|||||||
MyWorkbook := TsWorkbook.Create;
|
MyWorkbook := TsWorkbook.Create;
|
||||||
MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet');
|
MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet');
|
||||||
|
|
||||||
// Write some number cells
|
|
||||||
MyWorksheet.WriteNumber(0, 0, 1.0);
|
MyWorksheet.WriteNumber(0, 0, 1.0);
|
||||||
MyWorksheet.WriteNumber(0, 1, 2.0);
|
|
||||||
MyWorksheet.WriteNumber(0, 2, 3.0);
|
|
||||||
MyWorksheet.WriteNumber(0, 3, 4.0);
|
|
||||||
MyWorksheet.WriteUTF8Text(0, 4, '& " '' < >');
|
|
||||||
|
|
||||||
MyWorksheet.WriteText(0, 26, 'AA'); // Test for column name
|
MyWorksheet.WriteNumberFormat(0, 0, nfFixed, 2);
|
||||||
|
|
||||||
MyWorksheet.WriteColWidth(0, 20, suChars);
|
|
||||||
MyWorksheet.WriteRowHeight(0, 4, suLines);
|
|
||||||
|
|
||||||
// Write some formulas
|
|
||||||
Myworksheet.WriteFormula(0, 5, '=A1-B1');
|
|
||||||
Myworksheet.WriteFormula(0, 6, '=SUM(A1:D1)');
|
|
||||||
MyWorksheet.WriteFormula(0, 7, '=SIN(A1+B1)');
|
|
||||||
|
|
||||||
// Uncomment this to test large XLS files
|
|
||||||
for i := 2 to 2{20} do
|
|
||||||
begin
|
|
||||||
MyWorksheet.WriteText(i, 0, ParamStr(0));
|
|
||||||
MyWorksheet.WriteText(i, 1, ParamStr(0));
|
|
||||||
MyWorksheet.WriteText(i, 2, ParamStr(0));
|
|
||||||
MyWorksheet.WriteText(i, 3, ParamStr(0));
|
|
||||||
end;
|
|
||||||
|
|
||||||
// Test for Bold
|
|
||||||
MyCell := MyWorksheet.GetCell(2, 0);
|
|
||||||
MyCell^.FontIndex := BOLD_FONTINDEX;
|
|
||||||
MyCell := MyWorksheet.GetCell(2, 1);
|
|
||||||
MyCell^.FontIndex := BOLD_FONTINDEX;
|
|
||||||
MyCell := MyWorksheet.GetCell(2, 2);
|
|
||||||
MyCell^.FontIndex := BOLD_FONTINDEX;
|
|
||||||
MyCell := MyWorksheet.GetCell(2, 3);
|
|
||||||
MyCell^.FontIndex := BOLD_FONTINDEX;
|
|
||||||
|
|
||||||
// Background and text color
|
|
||||||
MyWorksheet.WriteText(4, 0, 'white on red');
|
|
||||||
Myworksheet.WriteBackgroundColor(4, 0, scRed);
|
|
||||||
MyWorksheet.WriteFontColor(4, 0, scWhite);
|
|
||||||
|
|
||||||
// Border
|
|
||||||
MyWorksheet.WriteText(4, 2, 'left/right');
|
|
||||||
Myworksheet.WriteBorders(4, 2, [cbWest, cbEast]);
|
|
||||||
MyWorksheet.WriteHorAlignment(4, 2, haCenter);
|
|
||||||
|
|
||||||
Myworksheet.WriteText(4, 4, 'top/bottom');
|
|
||||||
Myworksheet.WriteBorders(4, 4, [cbNorth, cbSouth]);
|
|
||||||
MyWorksheet.WriteBorderStyle(4, 4, cbSouth, lsThick, scBlue);
|
|
||||||
Myworksheet.WriteHorAlignment(4, 4, haRight);
|
|
||||||
|
|
||||||
// Wordwrap
|
|
||||||
MyWorksheet.WriteText(4, 6, 'This is a long, long, long, wrapped text.');
|
|
||||||
MyWorksheet.WriteWordwrap(4, 6, true);
|
|
||||||
|
|
||||||
// Creates a new worksheet
|
|
||||||
MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet 2');
|
|
||||||
|
|
||||||
// Write some string cells
|
|
||||||
MyWorksheet.WriteText(0, 0, 'First');
|
|
||||||
MyWorksheet.WriteText(0, 1, 'Second');
|
|
||||||
MyWorksheet.WriteText(0, 2, 'Third');
|
|
||||||
MyWorksheet.WriteText(0, 3, 'Fourth');
|
|
||||||
|
|
||||||
// Write current date/time
|
|
||||||
MyWorksheet.WriteDateTime(0, 5, now, nfShortDate);
|
|
||||||
MyWorksheet.WriteDateTime(1, 5, now, nfShortTime);
|
|
||||||
MyWorksheet.WriteDateTime(2, 5, now, 'nn:ss.zzz');
|
|
||||||
|
|
||||||
// Write some numbers in various formats
|
|
||||||
MyWorksheet.WriteNumber(0, 6, 12345.6789, nfFixed, 0);
|
|
||||||
MyWorksheet.WriteNumber(1, 6, 12345.6789, nfFixed, 3);
|
|
||||||
MyWorksheet.WriteNumber(2, 6, 12345.6789, nfFixedTh, 0);
|
|
||||||
MyWorksheet.Writenumber(3, 6, 12345.6789, nfFixedTh, 3);
|
|
||||||
MyWorksheet.WriteNumber(4, 6, 12345.6789, nfExp, 2);
|
|
||||||
Myworksheet.Writenumber(5, 6, 12345.6789, nfExp, 4);
|
|
||||||
MyWorksheet.WriteCurrency(6, 6,-12345.6789, nfCurrency, 2);
|
|
||||||
MyWorksheet.WriteCurrency(7, 6,-12345.6789, nfCurrencyRed, 2);
|
|
||||||
MyWorksheet.WriteNumber(8, 6, 1.66666667, nfFraction, '# ?/?');
|
|
||||||
|
|
||||||
// Save the spreadsheet to a file
|
// Save the spreadsheet to a file
|
||||||
MyWorkbook.WriteToFile(MyDir + 'test.xlsx', sfOOXML, true);
|
MyWorkbook.WriteToFile(MyDir + 'test.xlsx', sfOOXML, true);
|
||||||
|
@ -488,13 +488,22 @@ var
|
|||||||
p: Integer;
|
p: Integer;
|
||||||
s: String;
|
s: String;
|
||||||
f: TsRelFlags;
|
f: TsRelFlags;
|
||||||
|
singleCell: Boolean = false;
|
||||||
begin
|
begin
|
||||||
Result := True;
|
Result := True;
|
||||||
|
|
||||||
// First find the colon
|
// First find the colon
|
||||||
p := pos(':', AStr);
|
p := pos(':', AStr);
|
||||||
if p = 0 then exit(false);
|
if p = 0 then //exit(false);
|
||||||
|
begin
|
||||||
|
singleCell := true;
|
||||||
|
Result := ParseCellString(AStr, AFirstcellRow, AFirstCellCol, f);
|
||||||
|
if not Result then exit;
|
||||||
|
ALastCellRow := AFirstCellRow;
|
||||||
|
ALastCellCol := AFirstCellCol;
|
||||||
|
AFlags := f;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
// Analyze part after the colon
|
// Analyze part after the colon
|
||||||
s := copy(AStr, p+1, Length(AStr));
|
s := copy(AStr, p+1, Length(AStr));
|
||||||
Result := ParseCellString(s, ALastCellRow, ALastCellCol, f);
|
Result := ParseCellString(s, ALastCellRow, ALastCellCol, f);
|
||||||
@ -503,6 +512,7 @@ begin
|
|||||||
// Analyze part before the colon
|
// Analyze part before the colon
|
||||||
s := copy(AStr, 1, p-1);
|
s := copy(AStr, 1, p-1);
|
||||||
Result := ParseCellString(s, AFirstCellRow, AFirstCellCol, AFlags);
|
Result := ParseCellString(s, AFirstCellRow, AFirstCellCol, AFlags);
|
||||||
|
end;
|
||||||
|
|
||||||
// Add flags of 2nd part
|
// Add flags of 2nd part
|
||||||
if rfRelRow in f then Include(AFlags, rfRelRow2);
|
if rfRelRow in f then Include(AFlags, rfRelRow2);
|
||||||
|
@ -81,6 +81,8 @@ type
|
|||||||
ARange: TsCellRange);
|
ARange: TsCellRange);
|
||||||
procedure ReadCFDataBars(ANode: TDOMNode; AWorksheet: TsBasicWorksheet;
|
procedure ReadCFDataBars(ANode: TDOMNode; AWorksheet: TsBasicWorksheet;
|
||||||
ARange: TsCellRange);
|
ARange: TsCellRange);
|
||||||
|
procedure ReadCFExpression(ANode: TDOMNode; AWorksheet: TsBasicWorksheet;
|
||||||
|
ARange: TsCellRange; AFormatIndex: Integer);
|
||||||
procedure ReadCFMisc(ANode: TDOMNode; AWorksheet: TsBasicWorksheet;
|
procedure ReadCFMisc(ANode: TDOMNode; AWorksheet: TsBasicWorksheet;
|
||||||
ARange: TsCellRange; AFormatIndex: Integer);
|
ARange: TsCellRange; AFormatIndex: Integer);
|
||||||
procedure ReadCFTop10(ANode: TDOMNode; AWorksheet: TsBasicWorksheet;
|
procedure ReadCFTop10(ANode: TDOMNode; AWorksheet: TsBasicWorksheet;
|
||||||
@ -1509,6 +1511,29 @@ begin
|
|||||||
sheet.WriteDataBars(ARange, clr, vk[0], v[0], vk[1], v[1]);
|
sheet.WriteDataBars(ARange, clr, vk[0], v[0], vk[1], v[1]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TsSpreadOOXMLReader.ReadCFExpression(ANode: TDOMNode;
|
||||||
|
AWorksheet: TsBasicWorksheet; ARange: TsCellRange; AFormatIndex: Integer);
|
||||||
|
var
|
||||||
|
sheet: TsWorksheet;
|
||||||
|
nodeName: String;
|
||||||
|
s: String;
|
||||||
|
begin
|
||||||
|
sheet := TsWorksheet(AWorksheet);
|
||||||
|
|
||||||
|
ANode := ANode.FirstChild;
|
||||||
|
while ANode <> nil do
|
||||||
|
begin
|
||||||
|
nodeName := ANode.NodeName;
|
||||||
|
if nodeName = 'formula' then
|
||||||
|
begin
|
||||||
|
s := GetNodeValue(ANode);
|
||||||
|
sheet.WriteConditionalCellFormat(ARange, cfcExpression, s, AFormatIndex);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
ANode := ANode.NextSibling;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TsSpreadOOXMLReader.ReadCFMisc(ANode: TDOMNode;
|
procedure TsSpreadOOXMLReader.ReadCFMisc(ANode: TDOMNode;
|
||||||
AWorksheet: TsBasicWorksheet; ARange: TsCellRange; AFormatIndex: Integer);
|
AWorksheet: TsBasicWorksheet; ARange: TsCellRange; AFormatIndex: Integer);
|
||||||
var
|
var
|
||||||
@ -1857,6 +1882,8 @@ begin
|
|||||||
ReadCFMisc(childNode, AWorksheet, range, fmtIdx);
|
ReadCFMisc(childNode, AWorksheet, range, fmtIdx);
|
||||||
'containsText', 'notContainsText', 'beginsWith', 'endsWith':
|
'containsText', 'notContainsText', 'beginsWith', 'endsWith':
|
||||||
ReadCFMisc(childNode, AWorksheet, range, fmtIdx);
|
ReadCFMisc(childNode, AWorksheet, range, fmtIdx);
|
||||||
|
'expression':
|
||||||
|
ReadCFExpression(childNode, AWorksheet, range, fmtIdx);
|
||||||
'colorScale':
|
'colorScale':
|
||||||
ReadCFColorRange(childNode, AWorksheet, range);
|
ReadCFColorRange(childNode, AWorksheet, range);
|
||||||
'dataBar':
|
'dataBar':
|
||||||
|
@ -67,6 +67,7 @@ type
|
|||||||
procedure TestWriteRead_CF_CellFmt_XLSX_Duplicate;
|
procedure TestWriteRead_CF_CellFmt_XLSX_Duplicate;
|
||||||
procedure TestWriteRead_CF_CellFmt_XLSX_ContainsErrors;
|
procedure TestWriteRead_CF_CellFmt_XLSX_ContainsErrors;
|
||||||
procedure TestWriteRead_CF_CellFmt_XLSX_NotContainsErrors;
|
procedure TestWriteRead_CF_CellFmt_XLSX_NotContainsErrors;
|
||||||
|
procedure TestWriteRead_CF_CellFmt_XLSX_Expression;
|
||||||
procedure TestWriteRead_CF_CellFmt_XLSX_Background;
|
procedure TestWriteRead_CF_CellFmt_XLSX_Background;
|
||||||
procedure TestWriteRead_CF_CellFmt_XLSX_Border;
|
procedure TestWriteRead_CF_CellFmt_XLSX_Border;
|
||||||
|
|
||||||
@ -564,6 +565,15 @@ begin
|
|||||||
TestWriteRead_CF_CellFmt(sfOOXML, cfcNotContainsErrors, fmt);
|
TestWriteRead_CF_CellFmt(sfOOXML, cfcNotContainsErrors, fmt);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TSpreadWriteReadCFTests.TestWriteRead_CF_CellFmt_XLSX_Expression;
|
||||||
|
var
|
||||||
|
fmt: TsCellFormat;
|
||||||
|
begin
|
||||||
|
InitFormatRecord(fmt);
|
||||||
|
fmt.SetBackgroundColor(scRed);
|
||||||
|
TestWriteRead_CF_CellFmt(sfOOXML, cfcExpression, 'ISNUMBER(A1)', fmt);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TSpreadWriteReadCFTests.TestWriteRead_CF_CellFmt_XLSX_Background;
|
procedure TSpreadWriteReadCFTests.TestWriteRead_CF_CellFmt_XLSX_Background;
|
||||||
var
|
var
|
||||||
fmt: TsCellFormat;
|
fmt: TsCellFormat;
|
||||||
|
Reference in New Issue
Block a user