Adds a initial implementation of border support in FPSpreadsheet
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1641 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
1d5b1799c9
commit
038d224034
@ -0,0 +1,178 @@
|
||||
<?xml version="1.0"?>
|
||||
<CONFIG>
|
||||
<ProjectOptions>
|
||||
<Version Value="9"/>
|
||||
<PathDelim Value="\"/>
|
||||
<General>
|
||||
<Flags>
|
||||
<MainUnitHasCreateFormStatements Value="False"/>
|
||||
<MainUnitHasTitleStatement Value="False"/>
|
||||
<UseDefaultCompilerOptions Value="True"/>
|
||||
</Flags>
|
||||
<MainUnit Value="0"/>
|
||||
<ResourceType Value="res"/>
|
||||
<UseXPManifest Value="True"/>
|
||||
<Icon Value="0"/>
|
||||
<ActiveWindowIndexAtStart Value="0"/>
|
||||
</General>
|
||||
<i18n>
|
||||
<EnableI18N LFM="False"/>
|
||||
</i18n>
|
||||
<VersionInfo>
|
||||
<StringTable ProductVersion=""/>
|
||||
</VersionInfo>
|
||||
<BuildModes Count="1" Active="Default">
|
||||
<Item1 Name="Default" Default="True"/>
|
||||
</BuildModes>
|
||||
<PublishOptions>
|
||||
<Version Value="2"/>
|
||||
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
|
||||
<ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
|
||||
</PublishOptions>
|
||||
<RunParams>
|
||||
<local>
|
||||
<FormatVersion Value="1"/>
|
||||
</local>
|
||||
</RunParams>
|
||||
<RequiredPackages Count="1">
|
||||
<Item1>
|
||||
<PackageName Value="laz_fpspreadsheet"/>
|
||||
</Item1>
|
||||
</RequiredPackages>
|
||||
<Units Count="4">
|
||||
<Unit0>
|
||||
<Filename Value="excel8write_format.pas"/>
|
||||
<IsPartOfProject Value="True"/>
|
||||
<UnitName Value="excel8write_format"/>
|
||||
<EditorIndex Value="0"/>
|
||||
<WindowIndex Value="0"/>
|
||||
<TopLine Value="31"/>
|
||||
<CursorPos X="12" Y="44"/>
|
||||
<UsageCount Value="20"/>
|
||||
<Loaded Value="True"/>
|
||||
</Unit0>
|
||||
<Unit1>
|
||||
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||
<UnitName Value="fpspreadsheet"/>
|
||||
<EditorIndex Value="2"/>
|
||||
<WindowIndex Value="0"/>
|
||||
<TopLine Value="93"/>
|
||||
<CursorPos X="1" Y="105"/>
|
||||
<UsageCount Value="10"/>
|
||||
<Loaded Value="True"/>
|
||||
</Unit1>
|
||||
<Unit2>
|
||||
<Filename Value="..\..\..\..\..\lazarus29\fpc\2.4.3\source\packages\fcl-image\src\fpimage.pp"/>
|
||||
<UnitName Value="FPimage"/>
|
||||
<EditorIndex Value="3"/>
|
||||
<WindowIndex Value="0"/>
|
||||
<TopLine Value="10"/>
|
||||
<CursorPos X="3" Y="30"/>
|
||||
<UsageCount Value="10"/>
|
||||
<Loaded Value="True"/>
|
||||
</Unit2>
|
||||
<Unit3>
|
||||
<Filename Value="..\..\xlsbiff8.pas"/>
|
||||
<UnitName Value="xlsbiff8"/>
|
||||
<IsVisibleTab Value="True"/>
|
||||
<EditorIndex Value="1"/>
|
||||
<WindowIndex Value="0"/>
|
||||
<TopLine Value="758"/>
|
||||
<CursorPos X="61" Y="766"/>
|
||||
<UsageCount Value="10"/>
|
||||
<Loaded Value="True"/>
|
||||
</Unit3>
|
||||
</Units>
|
||||
<JumpHistory Count="18" HistoryIndex="17">
|
||||
<Position1>
|
||||
<Filename Value="excel8write_format.pas"/>
|
||||
<Caret Line="29" Column="1" TopLine="9"/>
|
||||
</Position1>
|
||||
<Position2>
|
||||
<Filename Value="excel8write_format.pas"/>
|
||||
<Caret Line="35" Column="23" TopLine="20"/>
|
||||
</Position2>
|
||||
<Position3>
|
||||
<Filename Value="excel8write_format.pas"/>
|
||||
<Caret Line="15" Column="25" TopLine="2"/>
|
||||
</Position3>
|
||||
<Position4>
|
||||
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||
<Caret Line="160" Column="78" TopLine="146"/>
|
||||
</Position4>
|
||||
<Position5>
|
||||
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||
<Caret Line="122" Column="25" TopLine="116"/>
|
||||
</Position5>
|
||||
<Position6>
|
||||
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||
<Caret Line="132" Column="25" TopLine="114"/>
|
||||
</Position6>
|
||||
<Position7>
|
||||
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||
<Caret Line="131" Column="10" TopLine="106"/>
|
||||
</Position7>
|
||||
<Position8>
|
||||
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||
<Caret Line="132" Column="24" TopLine="112"/>
|
||||
</Position8>
|
||||
<Position9>
|
||||
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||
<Caret Line="17" Column="35" TopLine="3"/>
|
||||
</Position9>
|
||||
<Position10>
|
||||
<Filename Value="..\..\fpspreadsheet.pas"/>
|
||||
<Caret Line="132" Column="25" TopLine="111"/>
|
||||
</Position10>
|
||||
<Position11>
|
||||
<Filename Value="excel8write_format.pas"/>
|
||||
<Caret Line="15" Column="25" TopLine="5"/>
|
||||
</Position11>
|
||||
<Position12>
|
||||
<Filename Value="excel8write_format.pas"/>
|
||||
<Caret Line="47" Column="25" TopLine="33"/>
|
||||
</Position12>
|
||||
<Position13>
|
||||
<Filename Value="..\..\xlsbiff8.pas"/>
|
||||
<Caret Line="941" Column="11" TopLine="926"/>
|
||||
</Position13>
|
||||
<Position14>
|
||||
<Filename Value="..\..\xlsbiff8.pas"/>
|
||||
<Caret Line="125" Column="17" TopLine="116"/>
|
||||
</Position14>
|
||||
<Position15>
|
||||
<Filename Value="..\..\xlsbiff8.pas"/>
|
||||
<Caret Line="933" Column="61" TopLine="924"/>
|
||||
</Position15>
|
||||
<Position16>
|
||||
<Filename Value="excel8write_format.pas"/>
|
||||
<Caret Line="57" Column="29" TopLine="36"/>
|
||||
</Position16>
|
||||
<Position17>
|
||||
<Filename Value="excel8write_format.pas"/>
|
||||
<Caret Line="28" Column="54" TopLine="14"/>
|
||||
</Position17>
|
||||
<Position18>
|
||||
<Filename Value="excel8write_format.pas"/>
|
||||
<Caret Line="41" Column="14" TopLine="28"/>
|
||||
</Position18>
|
||||
</JumpHistory>
|
||||
</ProjectOptions>
|
||||
<CompilerOptions>
|
||||
<Version Value="10"/>
|
||||
<PathDelim Value="\"/>
|
||||
<Target>
|
||||
<Filename Value="excel8write_format"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
|
||||
</SearchPaths>
|
||||
<Other>
|
||||
<CompilerMessages>
|
||||
<UseMsgFile Value="True"/>
|
||||
</CompilerMessages>
|
||||
<CompilerPath Value="$(CompPath)"/>
|
||||
</Other>
|
||||
</CompilerOptions>
|
||||
</CONFIG>
|
@ -0,0 +1,64 @@
|
||||
{
|
||||
excel8write.dpr
|
||||
|
||||
Demonstrates how to write an Excel 8+ file using the fpspreadsheet library
|
||||
|
||||
Adds formatting to the file
|
||||
|
||||
AUTHORS: Felipe Monteiro de Carvalho
|
||||
}
|
||||
program excel8write_format;
|
||||
|
||||
{$mode delphi}{$H+}
|
||||
|
||||
uses
|
||||
Classes, SysUtils, fpspreadsheet, xlsbiff8,
|
||||
laz_fpspreadsheet, fpsconvencoding;
|
||||
|
||||
var
|
||||
MyWorkbook: TsWorkbook;
|
||||
MyWorksheet: TsWorksheet;
|
||||
MyDir: string;
|
||||
MyCell: PCell;
|
||||
begin
|
||||
MyDir := ExtractFilePath(ParamStr(0));
|
||||
|
||||
// Create the spreadsheet
|
||||
MyWorkbook := TsWorkbook.Create;
|
||||
MyWorksheet := MyWorkbook.AddWorksheet('Worksheet1');
|
||||
|
||||
// Write some cells
|
||||
MyWorksheet.WriteUTF8Text(1, 0, 'Border');// A2
|
||||
MyWorksheet.WriteUTF8Text(1, 1, '[]'); // B2
|
||||
MyWorksheet.WriteUTF8Text(1, 2, '[North]');// C2
|
||||
MyWorksheet.WriteUTF8Text(1, 3, '[West]');// D2
|
||||
MyWorksheet.WriteUTF8Text(1, 4, '[East]');// E2
|
||||
MyWorksheet.WriteUTF8Text(1, 5, '[South]');// F2
|
||||
|
||||
// Format them
|
||||
|
||||
MyCell := MyWorksheet.GetCell(1, 1);
|
||||
MyCell^.Border := [];
|
||||
MyCell^.UsedFormattingFields := [uffBorder];
|
||||
|
||||
MyCell := MyWorksheet.GetCell(1, 2);
|
||||
MyCell^.Border := [cbNorth];
|
||||
MyCell^.UsedFormattingFields := [uffBorder];
|
||||
|
||||
MyCell := MyWorksheet.GetCell(1, 3);
|
||||
MyCell^.Border := [cbWest];
|
||||
MyCell^.UsedFormattingFields := [uffBorder];
|
||||
|
||||
MyCell := MyWorksheet.GetCell(1, 4);
|
||||
MyCell^.Border := [cbEast];
|
||||
MyCell^.UsedFormattingFields := [uffBorder];
|
||||
|
||||
MyCell := MyWorksheet.GetCell(1, 5);
|
||||
MyCell^.Border := [cbSouth];
|
||||
MyCell^.UsedFormattingFields := [uffBorder];
|
||||
|
||||
// Save the spreadsheet to a file
|
||||
MyWorkbook.WriteToFile(MyDir + 'test3.xls', sfExcel8, False);
|
||||
MyWorkbook.Free;
|
||||
end.
|
||||
|
@ -88,17 +88,29 @@ type
|
||||
|
||||
{@@ List of possible formatting fields }
|
||||
|
||||
TsUsedFormattingField = (uffTextRotation, uffBold);
|
||||
TsUsedFormattingField = (uffTextRotation, uffBold, uffBorder{, uffBackgroundColor});
|
||||
|
||||
{@@ Describes which formatting fields are active }
|
||||
|
||||
TsUsedFormattingFields = set of TsUsedFormattingField;
|
||||
|
||||
{@@ Text rotation formatting}
|
||||
{@@ Text rotation formatting }
|
||||
|
||||
TsTextRotation = (trHorizontal, rt90DegreeClockwiseRotation,
|
||||
rt90DegreeCounterClockwiseRotation);
|
||||
|
||||
{@@ Indicates the border for a cell }
|
||||
|
||||
TsCellBorder = (cbNorth, cbWest, cbEast, cbSouth);
|
||||
|
||||
{@@ Indicates the border for a cell }
|
||||
|
||||
TsCellBorders = set of TsCellBorder;
|
||||
|
||||
{.@@ Colors in FPSpreadsheet as given by a list of possible default values }
|
||||
|
||||
//TsColor = ();
|
||||
|
||||
{@@ Cell structure for TsWorksheet
|
||||
|
||||
Never suppose that all *Value fields are valid,
|
||||
@ -120,6 +132,8 @@ type
|
||||
{ Formatting fields }
|
||||
UsedFormattingFields: TsUsedFormattingFields;
|
||||
TextRotation: TsTextRotation;
|
||||
Border: TsCellBorders;
|
||||
//BackgroundColor: TsColor;
|
||||
end;
|
||||
|
||||
PCell = ^TCell;
|
||||
|
@ -123,7 +123,7 @@ type
|
||||
procedure WriteWindow1(AStream: TStream);
|
||||
procedure WriteWindow2(AStream: TStream; ASheetSelected: Boolean);
|
||||
procedure WriteXF(AStream: TStream; AFontIndex: Word;
|
||||
AXF_TYPE_PROT, ATextRotation: Byte);
|
||||
AXF_TYPE_PROT, ATextRotation: Byte; ABorders: TsCellBorders);
|
||||
end;
|
||||
|
||||
implementation
|
||||
@ -324,43 +324,51 @@ begin
|
||||
end;
|
||||
|
||||
// XF0
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF1
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF2
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF3
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF4
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF5
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF6
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF7
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF8
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF9
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF10
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF11
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF12
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF13
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF14
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL);
|
||||
// XF15
|
||||
WriteXF(AStream, 0, 0, XF_ROTATION_HORIZONTAL);
|
||||
// XF16
|
||||
WriteXF(AStream, 0, 0, XF_ROTATION_90_DEGREE_COUNTERCLOCKWISE);
|
||||
// XF17
|
||||
WriteXF(AStream, 0, 0, XF_ROTATION_90_DEGREE_CLOCKWISE);
|
||||
// XF18
|
||||
WriteXF(AStream, 1, 0, XF_ROTATION_HORIZONTAL);
|
||||
WriteXF(AStream, 0, MASK_XF_TYPE_PROT_STYLE_XF, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF15 - Default, no formatting
|
||||
WriteXF(AStream, 0, 0, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF16 - Rotated
|
||||
WriteXF(AStream, 0, 0, XF_ROTATION_90_DEGREE_COUNTERCLOCKWISE, []);
|
||||
// XF17 - Rotated
|
||||
WriteXF(AStream, 0, 0, XF_ROTATION_90_DEGREE_CLOCKWISE, []);
|
||||
// XF18 - Bold
|
||||
WriteXF(AStream, 1, 0, XF_ROTATION_HORIZONTAL, []);
|
||||
// XF19 - Border
|
||||
WriteXF(AStream, 0, 0, XF_ROTATION_HORIZONTAL, [cbNorth]);
|
||||
// XF20 - Border
|
||||
WriteXF(AStream, 0, 0, XF_ROTATION_HORIZONTAL, [cbWest]);
|
||||
// XF21 - Border
|
||||
WriteXF(AStream, 0, 0, XF_ROTATION_HORIZONTAL, [cbEast]);
|
||||
// XF22 - Border
|
||||
WriteXF(AStream, 0, 0, XF_ROTATION_HORIZONTAL, [cbSouth]);
|
||||
|
||||
WriteStyle(AStream);
|
||||
|
||||
@ -753,6 +761,14 @@ begin
|
||||
begin
|
||||
AStream.WriteWord(WordToLE(18));
|
||||
end
|
||||
else if ACell^.UsedFormattingFields = [uffBorder] then
|
||||
begin
|
||||
if ACell^.Border = [] then AStream.WriteWord(WordToLE(15))
|
||||
else if ACell^.Border = [cbNorth] then AStream.WriteWord(WordToLE(19))
|
||||
else if ACell^.Border = [cbWest] then AStream.WriteWord(WordToLE(20))
|
||||
else if ACell^.Border = [cbEast] then AStream.WriteWord(WordToLE(21))
|
||||
else if ACell^.Border = [cbSouth] then AStream.WriteWord(WordToLE(22));
|
||||
end
|
||||
else
|
||||
AStream.WriteWord(WordToLE(15));
|
||||
|
||||
@ -930,10 +946,11 @@ end;
|
||||
*
|
||||
*******************************************************************}
|
||||
procedure TsSpreadBIFF8Writer.WriteXF(AStream: TStream; AFontIndex: Word;
|
||||
AXF_TYPE_PROT, ATextRotation: Byte);
|
||||
AXF_TYPE_PROT, ATextRotation: Byte; ABorders: TsCellBorders);
|
||||
var
|
||||
XFOptions: Word;
|
||||
XFAlignment, XFOrientationAttrib: Byte;
|
||||
XFBorderDWord1, XFBorderDWord2: DWord;
|
||||
begin
|
||||
{ BIFF Record header }
|
||||
AStream.WriteWord(WordToLE(INT_EXCEL_ID_XF));
|
||||
@ -976,10 +993,22 @@ begin
|
||||
AStream.WriteByte(XFOrientationAttrib);
|
||||
|
||||
{ Cell border lines and background area }
|
||||
AStream.WriteDWord(DWordToLE($00000000));
|
||||
AStream.WriteDWord(DWordToLE($00000000));
|
||||
AStream.WriteByte(0);
|
||||
AStream.WriteByte(0);
|
||||
|
||||
// Left and Right line colors, use black
|
||||
XFBorderDWord1 := 8 * $10000 {left line - black} + 8 * $800000 {right line - black};
|
||||
|
||||
if cbNorth in ABorders then XFBorderDWord1 := XFBorderDWord1 or $100;
|
||||
if cbWest in ABorders then XFBorderDWord1 := XFBorderDWord1 or $1;
|
||||
if cbEast in ABorders then XFBorderDWord1 := XFBorderDWord1 or $10;
|
||||
if cbSouth in ABorders then XFBorderDWord1 := XFBorderDWord1 or $1000;
|
||||
|
||||
AStream.WriteDWord(DWordToLE(XFBorderDWord1));
|
||||
|
||||
// Top and Bottom line colors, use black
|
||||
XFBorderDWord2 := 8 {top line - black} + 8 * $80 {bottom line - black};
|
||||
AStream.WriteDWord(DWordToLE(XFBorderDWord2));
|
||||
// Background Pattern Color, always zeroed
|
||||
AStream.WriteWord(0);
|
||||
end;
|
||||
|
||||
{ TsSpreadBIFF8Reader }
|
||||
|
Loading…
Reference in New Issue
Block a user