From 7e67d5e83e4dc0ada74ef62028610cde8107cdcf Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Thu, 29 Jan 2009 13:24:37 +0000 Subject: [PATCH] fpspreadsheet: Improves OpenDocument support and moved back to 0-based grid git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@688 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../examples/excel2demo/excel2write.lpi | 4 +- .../examples/excel2demo/excel2write.lpr | 16 +- .../examples/excel5demo/excel5write.lpi | 2 +- .../examples/excel5demo/excel5write.lpr | 26 +- .../examples/opendocdemo/oocreated.ods | Bin 6946 -> 7055 bytes .../examples/opendocdemo/opendocwrite.lpi | 234 +++++++++--------- .../examples/opendocdemo/opendocwrite.lpr | 18 +- .../examples/opendocdemo/ziptest.sh | 2 +- components/fpspreadsheet/fpsopendocument.pas | 21 +- components/fpspreadsheet/fpspreadsheet.pas | 3 - components/fpspreadsheet/xlsbiff2.pas | 31 +-- components/fpspreadsheet/xlsbiff5.pas | 27 +- 12 files changed, 188 insertions(+), 196 deletions(-) diff --git a/components/fpspreadsheet/examples/excel2demo/excel2write.lpi b/components/fpspreadsheet/examples/excel2demo/excel2write.lpi index 51672116a..0cf19942b 100644 --- a/components/fpspreadsheet/examples/excel2demo/excel2write.lpi +++ b/components/fpspreadsheet/examples/excel2demo/excel2write.lpi @@ -38,8 +38,8 @@ - - + + diff --git a/components/fpspreadsheet/examples/excel2demo/excel2write.lpr b/components/fpspreadsheet/examples/excel2demo/excel2write.lpr index 6b377501d..931e786b3 100644 --- a/components/fpspreadsheet/examples/excel2demo/excel2write.lpr +++ b/components/fpspreadsheet/examples/excel2demo/excel2write.lpr @@ -25,16 +25,16 @@ begin MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet'); // Write some number cells - MyWorksheet.WriteNumber(1, 1, 1.0); - MyWorksheet.WriteNumber(1, 2, 2.0); - MyWorksheet.WriteNumber(1, 3, 3.0); - MyWorksheet.WriteNumber(1, 4, 4.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); // Write some string cells - MyWorksheet.WriteUTF8Text(2, 1, 'First'); - MyWorksheet.WriteUTF8Text(2, 2, 'Second'); - MyWorksheet.WriteUTF8Text(2, 3, 'Third'); - MyWorksheet.WriteUTF8Text(2, 4, 'Fourth'); + MyWorksheet.WriteUTF8Text(1, 0, 'First'); + MyWorksheet.WriteUTF8Text(1, 1, 'Second'); + MyWorksheet.WriteUTF8Text(1, 2, 'Third'); + MyWorksheet.WriteUTF8Text(1, 3, 'Fourth'); // Save the spreadsheet to a file MyWorkbook.WriteToFile(MyDir + 'test' + STR_EXCEL_EXTENSION, sfExcel2); diff --git a/components/fpspreadsheet/examples/excel5demo/excel5write.lpi b/components/fpspreadsheet/examples/excel5demo/excel5write.lpi index c4ef7f100..96adb0ca9 100644 --- a/components/fpspreadsheet/examples/excel5demo/excel5write.lpi +++ b/components/fpspreadsheet/examples/excel5demo/excel5write.lpi @@ -38,7 +38,7 @@ - + diff --git a/components/fpspreadsheet/examples/excel5demo/excel5write.lpr b/components/fpspreadsheet/examples/excel5demo/excel5write.lpr index 1b676b6ea..accb4d33f 100644 --- a/components/fpspreadsheet/examples/excel5demo/excel5write.lpr +++ b/components/fpspreadsheet/examples/excel5demo/excel5write.lpr @@ -28,10 +28,10 @@ begin MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet'); // Write some number cells - MyWorksheet.WriteNumber(1, 1, 1.0); - MyWorksheet.WriteNumber(1, 2, 2.0); - MyWorksheet.WriteNumber(1, 3, 3.0); - MyWorksheet.WriteNumber(1, 4, 4.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); { Uncommend this to test large XLS files for i := 2 to 20 do @@ -47,22 +47,22 @@ begin // or, in RPN: A1, B1, + SetLength(MyFormula, 3); MyFormula[0].TokenID := INT_EXCEL_TOKEN_TREFV; {A1} - MyFormula[0].Col := 1; - MyFormula[0].Row := 1; + MyFormula[0].Col := 0; + MyFormula[0].Row := 0; MyFormula[1].TokenID := INT_EXCEL_TOKEN_TREFV; {B1} - MyFormula[1].Col := 2; - MyFormula[1].Row := 1; + MyFormula[1].Col := 1; + MyFormula[1].Row := 0; MyFormula[2].TokenID := INT_EXCEL_TOKEN_TADD; {+} - MyWorksheet.WriteRPNFormula(1, 5, MyFormula); + MyWorksheet.WriteRPNFormula(0, 4, MyFormula); // Creates a new worksheet MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet 2'); // Write some string cells - MyWorksheet.WriteUTF8Text(1, 1, 'First'); - MyWorksheet.WriteUTF8Text(1, 2, 'Second'); - MyWorksheet.WriteUTF8Text(1, 3, 'Third'); - MyWorksheet.WriteUTF8Text(1, 4, 'Fourth'); + MyWorksheet.WriteUTF8Text(0, 0, 'First'); + MyWorksheet.WriteUTF8Text(0, 1, 'Second'); + MyWorksheet.WriteUTF8Text(0, 2, 'Third'); + MyWorksheet.WriteUTF8Text(0, 3, 'Fourth'); // Save the spreadsheet to a file MyWorkbook.WriteToFile(MyDir + 'test' + STR_EXCEL_EXTENSION, sfExcel5); diff --git a/components/fpspreadsheet/examples/opendocdemo/oocreated.ods b/components/fpspreadsheet/examples/opendocdemo/oocreated.ods index 60d3cf5d4297d7e137a690c7488856dfbbab4357..bfe2e21bdf579a7004c4673aa7c6b4d059d8e24d 100644 GIT binary patch delta 4421 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 delta 4352 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 diff --git a/components/fpspreadsheet/examples/opendocdemo/opendocwrite.lpi b/components/fpspreadsheet/examples/opendocdemo/opendocwrite.lpi index cbc91f793..29f5c81c9 100644 --- a/components/fpspreadsheet/examples/opendocdemo/opendocwrite.lpi +++ b/components/fpspreadsheet/examples/opendocdemo/opendocwrite.lpi @@ -11,7 +11,7 @@ <UseAppBundle Value="False"/> - <ActiveEditorIndexAtStart Value="1"/> + <ActiveEditorIndexAtStart Value="6"/> </General> <VersionInfo> <ProjectVersion Value=""/> @@ -38,8 +38,8 @@ <Filename Value="opendocwrite.lpr"/> <IsPartOfProject Value="True"/> <UnitName Value="opendocwrite"/> - <CursorPos X="9" Y="30"/> - <TopLine Value="8"/> + <CursorPos X="26" Y="35"/> + <TopLine Value="21"/> <EditorIndex Value="0"/> <UsageCount Value="309"/> <Loaded Value="True"/> @@ -68,8 +68,8 @@ <Unit4> <Filename Value="..\..\xlsbiff5.pas"/> <UnitName Value="xlsbiff5"/> - <CursorPos X="26" Y="95"/> - <TopLine Value="92"/> + <CursorPos X="38" Y="1059"/> + <TopLine Value="1045"/> <EditorIndex Value="6"/> <UsageCount Value="140"/> <Loaded Value="True"/> @@ -86,8 +86,8 @@ <Unit6> <Filename Value="..\..\xlsbiff2.pas"/> <UnitName Value="xlsbiff2"/> - <CursorPos X="1" Y="16"/> - <TopLine Value="1"/> + <CursorPos X="25" Y="216"/> + <TopLine Value="203"/> <EditorIndex Value="7"/> <UsageCount Value="139"/> <Loaded Value="True"/> @@ -116,10 +116,10 @@ <Unit10> <Filename Value="..\..\fpspreadsheet.pas"/> <UnitName Value="fpspreadsheet"/> - <CursorPos X="1" Y="759"/> - <TopLine Value="746"/> + <CursorPos X="17" Y="138"/> + <TopLine Value="125"/> <EditorIndex Value="4"/> - <UsageCount Value="95"/> + <UsageCount Value="97"/> <Loaded Value="True"/> </Unit10> <Unit11> @@ -131,10 +131,10 @@ <Unit12> <Filename Value="..\..\fpsopendocument.pas"/> <UnitName Value="fpsopendocument"/> - <CursorPos X="7" Y="296"/> - <TopLine Value="275"/> + <CursorPos X="88" Y="294"/> + <TopLine Value="284"/> <EditorIndex Value="1"/> - <UsageCount Value="13"/> + <UsageCount Value="15"/> <Loaded Value="True"/> </Unit12> <Unit13> @@ -143,7 +143,7 @@ <CursorPos X="1" Y="268"/> <TopLine Value="253"/> <EditorIndex Value="3"/> - <UsageCount Value="13"/> + <UsageCount Value="15"/> <Loaded Value="True"/> </Unit13> <Unit14> @@ -151,130 +151,130 @@ <CursorPos X="10" Y="154"/> <TopLine Value="141"/> <EditorIndex Value="2"/> - <UsageCount Value="10"/> + <UsageCount Value="12"/> <Loaded Value="True"/> </Unit14> </Units> <JumpHistory Count="30" HistoryIndex="29"> <Position1> <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="265" Column="28" TopLine="253"/> + <Caret Line="295" Column="1" TopLine="282"/> </Position1> <Position2> <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="313" Column="1" TopLine="301"/> + <Caret Line="297" Column="1" TopLine="284"/> </Position2> <Position3> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="41" Column="45" TopLine="37"/> - </Position3> - <Position4> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="355" Column="5" TopLine="331"/> - </Position4> - <Position5> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="311" Column="1" TopLine="299"/> - </Position5> - <Position6> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="260" Column="28" TopLine="249"/> - </Position6> - <Position7> - <Filename Value="..\..\fpspreadsheet.pas"/> - <Caret Line="365" Column="5" TopLine="340"/> - </Position7> - <Position8> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="290" Column="5" TopLine="265"/> - </Position8> - <Position9> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="380" Column="74" TopLine="363"/> - </Position9> - <Position10> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="278" Column="1" TopLine="265"/> - </Position10> - <Position11> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="279" Column="1" TopLine="266"/> - </Position11> - <Position12> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="283" Column="1" TopLine="270"/> - </Position12> - <Position13> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="284" Column="1" TopLine="271"/> - </Position13> - <Position14> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="287" Column="1" TopLine="274"/> - </Position14> - <Position15> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="289" Column="1" TopLine="276"/> - </Position15> - <Position16> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="290" Column="18" TopLine="277"/> - </Position16> - <Position17> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="289" Column="1" TopLine="276"/> - </Position17> - <Position18> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="290" Column="1" TopLine="277"/> - </Position18> - <Position19> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="289" Column="1" TopLine="276"/> - </Position19> - <Position20> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="290" Column="1" TopLine="277"/> - </Position20> - <Position21> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="289" Column="1" TopLine="276"/> - </Position21> - <Position22> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="290" Column="1" TopLine="277"/> - </Position22> - <Position23> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="293" Column="1" TopLine="280"/> - </Position23> - <Position24> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="295" Column="1" TopLine="282"/> - </Position24> - <Position25> - <Filename Value="..\..\fpsopendocument.pas"/> - <Caret Line="297" Column="1" TopLine="284"/> - </Position25> - <Position26> <Filename Value="..\..\fpspreadsheet.pas"/> <Caret Line="754" Column="1" TopLine="741"/> - </Position26> - <Position27> + </Position3> + <Position4> <Filename Value="..\..\fpspreadsheet.pas"/> <Caret Line="755" Column="1" TopLine="742"/> - </Position27> - <Position28> + </Position4> + <Position5> <Filename Value="..\..\fpspreadsheet.pas"/> <Caret Line="757" Column="1" TopLine="744"/> - </Position28> - <Position29> + </Position5> + <Position6> <Filename Value="..\..\fpspreadsheet.pas"/> <Caret Line="759" Column="1" TopLine="746"/> - </Position29> - <Position30> + </Position6> + <Position7> <Filename Value="..\..\fpsopendocument.pas"/> <Caret Line="392" Column="1" TopLine="379"/> + </Position7> + <Position8> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="87" Column="1" TopLine="79"/> + </Position8> + <Position9> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="211" Column="34" TopLine="196"/> + </Position9> + <Position10> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="22" Column="40" TopLine="8"/> + </Position10> + <Position11> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="48" Column="22" TopLine="35"/> + </Position11> + <Position12> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="194" Column="7" TopLine="181"/> + </Position12> + <Position13> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="329" Column="51" TopLine="316"/> + </Position13> + <Position14> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="257" Column="34" TopLine="242"/> + </Position14> + <Position15> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="286" Column="34" TopLine="271"/> + </Position15> + <Position16> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="350" Column="38" TopLine="336"/> + </Position16> + <Position17> + <Filename Value="..\..\xlsbiff5.pas"/> + <Caret Line="207" Column="1" TopLine="196"/> + </Position17> + <Position18> + <Filename Value="..\..\xlsbiff5.pas"/> + <Caret Line="556" Column="34" TopLine="542"/> + </Position18> + <Position19> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="50" Column="19" TopLine="37"/> + </Position19> + <Position20> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="150" Column="34" TopLine="137"/> + </Position20> + <Position21> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="153" Column="72" TopLine="137"/> + </Position21> + <Position22> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="159" Column="13" TopLine="137"/> + </Position22> + <Position23> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="187" Column="32" TopLine="174"/> + </Position23> + <Position24> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="190" Column="13" TopLine="174"/> + </Position24> + <Position25> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="193" Column="34" TopLine="174"/> + </Position25> + <Position26> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="226" Column="33" TopLine="213"/> + </Position26> + <Position27> + <Filename Value="..\..\xlsbiff2.pas"/> + <Caret Line="97" Column="16" TopLine="85"/> + </Position27> + <Position28> + <Filename Value="..\..\xlsbiff5.pas"/> + <Caret Line="601" Column="25" TopLine="588"/> + </Position28> + <Position29> + <Filename Value="..\..\xlsbiff5.pas"/> + <Caret Line="673" Column="34" TopLine="659"/> + </Position29> + <Position30> + <Filename Value="..\..\xlsbiff5.pas"/> + <Caret Line="700" Column="34" TopLine="686"/> </Position30> </JumpHistory> </ProjectOptions> diff --git a/components/fpspreadsheet/examples/opendocdemo/opendocwrite.lpr b/components/fpspreadsheet/examples/opendocdemo/opendocwrite.lpr index 75ab0d688..8440a17c8 100644 --- a/components/fpspreadsheet/examples/opendocdemo/opendocwrite.lpr +++ b/components/fpspreadsheet/examples/opendocdemo/opendocwrite.lpr @@ -28,10 +28,10 @@ begin MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet'); // Write some number cells - MyWorksheet.WriteNumber(1, 1, 1.0); - MyWorksheet.WriteNumber(1, 2, 2.0); - MyWorksheet.WriteNumber(1, 3, 3.0); - MyWorksheet.WriteNumber(1, 4, 4.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); { Uncommend this to test large XLS files for i := 2 to 20 do @@ -57,13 +57,13 @@ begin // Creates a new worksheet MyWorksheet := MyWorkbook.AddWorksheet('My Worksheet 2'); + *) // Write some string cells - MyWorksheet.WriteUTF8Text(1, 1, 'First'); - MyWorksheet.WriteUTF8Text(1, 2, 'Second'); - MyWorksheet.WriteUTF8Text(1, 3, 'Third'); - MyWorksheet.WriteUTF8Text(1, 4, 'Fourth'); - *) + MyWorksheet.WriteUTF8Text(1, 0, 'First'); + MyWorksheet.WriteUTF8Text(1, 1, 'Second'); + MyWorksheet.WriteUTF8Text(1, 2, 'Third'); + MyWorksheet.WriteUTF8Text(1, 3, 'Fourth'); // Save the spreadsheet to a file MyWorkbook.WriteToFile(MyDir + 'test', sfOpenDocument); diff --git a/components/fpspreadsheet/examples/opendocdemo/ziptest.sh b/components/fpspreadsheet/examples/opendocdemo/ziptest.sh index 9fa2d4d14..0ad64057d 100755 --- a/components/fpspreadsheet/examples/opendocdemo/ziptest.sh +++ b/components/fpspreadsheet/examples/opendocdemo/ziptest.sh @@ -1,4 +1,4 @@ cd test -zip test.ods * +zip -r test.ods * mv test.ods ../ cd .. \ No newline at end of file diff --git a/components/fpspreadsheet/fpsopendocument.pas b/components/fpspreadsheet/fpsopendocument.pas index 2b2ee492c..0a9eea3f2 100755 --- a/components/fpspreadsheet/fpsopendocument.pas +++ b/components/fpspreadsheet/fpsopendocument.pas @@ -71,7 +71,7 @@ const OOXML_PATH_META = 'meta.xml'; OOXML_PATH_SETTINGS = 'settings.xml'; OOXML_PATH_STYLES = 'styles.xml'; - OOXML_PATH_MIMETYPE = 'mimetype.xml'; + OOXML_PATH_MIMETYPE = 'mimetype'; OPENDOC_PATH_METAINF = 'META-INF' + PathDelim; OPENDOC_PATH_METAINF_MANIFEST = 'META-INF' + PathDelim + 'manifest.xml'; @@ -270,27 +270,28 @@ begin FContent := FContent + ' <table:table table:name="' + CurSheet.Name + '" table:style-name="ta1">' + LineEnding + ' <table:table-column table:style-name="co1" table:number-columns-repeated="' + - IntToStr(LastColNum) + '" table:default-cell-style-name="Default"/>' + LineEnding; + IntToStr(LastColNum + 1) + '" table:default-cell-style-name="Default"/>' + LineEnding; // The cells need to be written in order, row by row, cell by cell - for j := 1 to CurSheet.GetLastRowNumber do + for j := 0 to CurSheet.GetLastRowNumber do begin FContent := FContent + ' <table:table-row table:style-name="ro1">' + LineEnding; // First make an array with the cells of this row in their respective order // nil pointers indicate empty cells, so it's necessary to initialize the array - SetLength(CurRow, LastColNum); - for k := 0 to LastColNum - 1 do CurRow[k] := nil; + SetLength(CurRow, LastColNum + 1); + for k := 0 to LastColNum do CurRow[k] := nil; // Now fill the array with the cells in their proper place for k := 0 to CurSheet.FCells.Count - 1 do begin CurCell := CurSheet.FCells.Items[k]; - if CurCell^.Row = j then CurRow[CurCell^.Col - 1] := CurCell; + if CurCell^.Row = j then CurRow[CurCell^.Col] := CurCell; end; - for k := 0 to LastColNum - 1 do + // And now write all cells from this row + for k := 0 to LastColNum do begin CurCell := CurRow[k]; @@ -384,7 +385,11 @@ end; procedure TsSpreadOpenDocWriter.WriteLabel(AStream: TStream; const ARow, ACol: Word; const AValue: string); begin - + // The row should already be the correct one + FContent := FContent + + ' <table:table-cell office:value-type="string">' + LineEnding + + ' <text:p>' + AValue + '</text:p>' + LineEnding + + ' </table:table-cell>' + LineEnding; end; procedure TsSpreadOpenDocWriter.WriteNumber(AStream: TStream; const ARow, diff --git a/components/fpspreadsheet/fpspreadsheet.pas b/components/fpspreadsheet/fpspreadsheet.pas index 79bc24832..2bdb5400c 100755 --- a/components/fpspreadsheet/fpspreadsheet.pas +++ b/components/fpspreadsheet/fpspreadsheet.pas @@ -304,9 +304,6 @@ end; } function TsWorksheet.GetCell(ARow, ACol: Cardinal): PCell; begin - // First make sure the row and col values are valid - if (ARow = 0) or (ACol = 0) then raise Exception.Create('FPSpreadsheet: Row and Col numbers cannot be zero'); - Result := FindCell(ARow, ACol); if (Result = nil) then diff --git a/components/fpspreadsheet/xlsbiff2.pas b/components/fpspreadsheet/xlsbiff2.pas index cbb1ab89b..8287bca86 100755 --- a/components/fpspreadsheet/xlsbiff2.pas +++ b/components/fpspreadsheet/xlsbiff2.pas @@ -13,8 +13,7 @@ To ensure a properly formed file, the following order must be respected: 2nd to Nth record: Any record Last record: EOF -The row and column numbering in BIFF files is zero-based, -while in FPSpreadsheet it is 1-based, so this needs to be considered. +The row and column numbering in BIFF files is zero-based. Excel file format specification obtained from: @@ -85,10 +84,6 @@ const INT_EXCEL_CHART = $0020; INT_EXCEL_MACRO_SHEET = $0040; - { Marks differences between the BIFF format and FPSpreadsheet } - INT_FPS_BIFF_ROW_DELTA = 1; - INT_FPS_BIFF_COL_DELTA = 1; - { TsSpreadBIFF2Writer } {******************************************************************* @@ -172,8 +167,8 @@ begin AStream.WriteWord(WordToLE(17 + RPNLength)); { BIFF Record data } - AStream.WriteWord(WordToLE(ARow - INT_FPS_BIFF_ROW_DELTA)); - AStream.WriteWord(WordToLE(ACol - INT_FPS_BIFF_COL_DELTA)); + AStream.WriteWord(WordToLE(ARow)); + AStream.WriteWord(WordToLE(ACol)); { BIFF2 Attributes } AStream.WriteByte($0); @@ -218,8 +213,8 @@ begin INT_EXCEL_TOKEN_TREFR, INT_EXCEL_TOKEN_TREFV, INT_EXCEL_TOKEN_TREFA: begin - AStream.WriteWord( (AFormula[i].Row - INT_FPS_BIFF_ROW_DELTA) and MASK_EXCEL_ROW); - AStream.WriteByte(AFormula[i].Col - INT_FPS_BIFF_COL_DELTA); + AStream.WriteWord(AFormula[i].Row and MASK_EXCEL_ROW); + AStream.WriteByte(AFormula[i].Col); Inc(RPNLength, 3); end; @@ -257,8 +252,8 @@ begin AStream.WriteWord(WordToLE(8 + L)); { BIFF Record data } - AStream.WriteWord(WordToLE(ARow - INT_FPS_BIFF_ROW_DELTA)); - AStream.WriteWord(WordToLE(ACol - INT_FPS_BIFF_COL_DELTA)); + AStream.WriteWord(WordToLE(ARow)); + AStream.WriteWord(WordToLE(ACol)); { BIFF2 Attributes } AStream.WriteByte($0); @@ -286,8 +281,8 @@ begin AStream.WriteWord(WordToLE(15)); { BIFF Record data } - AStream.WriteWord(WordToLE(ARow - INT_FPS_BIFF_ROW_DELTA)); - AStream.WriteWord(WordToLE(ACol - INT_FPS_BIFF_COL_DELTA)); + AStream.WriteWord(WordToLE(ARow)); + AStream.WriteWord(WordToLE(ACol)); { BIFF2 Attributes } AStream.WriteByte($0); @@ -351,8 +346,8 @@ var AStrValue: ansistring; begin { BIFF Record data } - ARow := WordLEToN(AStream.ReadWord) + INT_FPS_BIFF_ROW_DELTA; - ACol := WordLEToN(AStream.ReadWord) + INT_FPS_BIFF_COL_DELTA; + ARow := WordLEToN(AStream.ReadWord); + ACol := WordLEToN(AStream.ReadWord); { BIFF2 Attributes } AStream.ReadByte(); @@ -375,8 +370,8 @@ var AValue: Double; begin { BIFF Record data } - ARow := WordLEToN(AStream.ReadWord) + INT_FPS_BIFF_ROW_DELTA; - ACol := WordLEToN(AStream.ReadWord) + INT_FPS_BIFF_COL_DELTA; + ARow := WordLEToN(AStream.ReadWord); + ACol := WordLEToN(AStream.ReadWord); { BIFF2 Attributes } AStream.ReadByte(); diff --git a/components/fpspreadsheet/xlsbiff5.pas b/components/fpspreadsheet/xlsbiff5.pas index 564aadb20..070e8f7f8 100755 --- a/components/fpspreadsheet/xlsbiff5.pas +++ b/components/fpspreadsheet/xlsbiff5.pas @@ -31,8 +31,7 @@ DIMENSIONS WINDOW2 EOF -The row and column numbering in BIFF files is zero-based, -while in FPSpreadsheet it is 1-based, so this needs to be considered. +The row and column numbering in BIFF files is zero-based. Excel file format specification obtained from: @@ -206,10 +205,6 @@ const MASK_XF_VERT_ALIGN = $70; - { Marks differences between the BIFF format and FPSpreadsheet } - INT_FPS_BIFF_ROW_DELTA = 1; - INT_FPS_BIFF_COL_DELTA = 1; - { Exported functions } @@ -557,8 +552,8 @@ begin AStream.WriteWord(WordToLE(22 + RPNLength)); { BIFF Record data } - AStream.WriteWord(WordToLE(ARow - INT_FPS_BIFF_ROW_DELTA)); - AStream.WriteWord(WordToLE(ACol - INT_FPS_BIFF_COL_DELTA)); + AStream.WriteWord(WordToLE(ARow)); + AStream.WriteWord(WordToLE(ACol)); { Index to XF Record } AStream.WriteWord($0000); @@ -603,8 +598,8 @@ begin INT_EXCEL_TOKEN_TREFR, INT_EXCEL_TOKEN_TREFV, INT_EXCEL_TOKEN_TREFA: begin - AStream.WriteWord( (AFormula[i].Row - INT_FPS_BIFF_ROW_DELTA) and MASK_EXCEL_ROW); - AStream.WriteByte(AFormula[i].Col - INT_FPS_BIFF_COL_DELTA); + AStream.WriteWord(AFormula[i].Row and MASK_EXCEL_ROW); + AStream.WriteByte(AFormula[i].Col); Inc(RPNLength, 3); end; @@ -674,8 +669,8 @@ begin AStream.WriteWord(WordToLE(8 + L)); { BIFF Record data } - AStream.WriteWord(WordToLE(ARow - INT_FPS_BIFF_ROW_DELTA)); - AStream.WriteWord(WordToLE(ACol - INT_FPS_BIFF_COL_DELTA)); + AStream.WriteWord(WordToLE(ARow)); + AStream.WriteWord(WordToLE(ACol)); { Index to XF record } AStream.WriteWord(15); @@ -701,8 +696,8 @@ begin AStream.WriteWord(WordToLE(14)); { BIFF Record data } - AStream.WriteWord(WordToLE(ARow - INT_FPS_BIFF_ROW_DELTA)); - AStream.WriteWord(WordToLE(ACol - INT_FPS_BIFF_COL_DELTA)); + AStream.WriteWord(WordToLE(ARow)); + AStream.WriteWord(WordToLE(ACol)); { Index to XF record } AStream.WriteWord($0); @@ -1060,8 +1055,8 @@ var AValue: Double; begin { BIFF Record data } - ARow := WordLEToN(AStream.ReadWord) + INT_FPS_BIFF_ROW_DELTA; - ACol := WordLEToN(AStream.ReadWord) + INT_FPS_BIFF_COL_DELTA; + ARow := WordLEToN(AStream.ReadWord); + ACol := WordLEToN(AStream.ReadWord); { Index to XF record } AStream.ReadWord();