Forum > FPSpreadsheet

Adding a chart to a spreadsheet in a console app

<< < (2/3) > >>

wp:
Try again now. But be prepared that there will be more bugs of this kind at the moment...

jollytall:
Significant improvement. It ran twice. :D
It failed for the third time :(

The code is, based on your demo:

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---program test; uses  Classes, Sysutils,  fpspreadsheet, fpsTypes, fpsopendocument, fpsChart; const  FILE_NAME = 'test.ods'; var  book: TsWorkbook;  dummy, sheet: TsWorksheet;  ch: TsChart;  ser: TsChartSeries;  fn: String;begin  fn := FILE_NAME;   book := TsWorkbook.Create;  try    if FileExists(fn) then      begin      book.ReadFromFile(fn);      dummy := book.GetWorksheetByName('dummy');      if not assigned(dummy) then        dummy := book.AddWorksheet('dummy');      sheet := book.GetWorksheetByName('bar_series');      if assigned(sheet) then        book.RemoveWorksheet(sheet);      end;    // worksheet    sheet := book.AddWorksheet('bar_series');      // Enter data    sheet.WriteText( 0, 0, 'School Grades');    sheet.WriteFont( 0, 0, '', 12, [fssBold], scBlack);    sheet.WriteText( 2, 0, '');          sheet.WriteText  ( 2, 1, 'Student 1'); sheet.WriteText  ( 2, 2, 'Student 2');    sheet.WriteText( 3, 0, 'Biology');   sheet.WriteNumber( 3, 1, 12);          sheet.WriteNumber( 3, 2, 15);    sheet.WriteText( 4, 0, 'History');   sheet.WriteNumber( 4, 1, 11);          sheet.WriteNumber( 4, 2, 13);    sheet.WriteText( 5, 0, 'French');    sheet.WriteNumber( 5, 1, 16);          sheet.WriteNumber( 5, 2, 11);    sheet.WriteText( 6, 0, 'English');   sheet.WriteNumber( 6, 1, 18);          sheet.WriteNumber( 6, 2, 11);    sheet.WriteText( 7, 0, 'Sports');    sheet.WriteNumber( 7, 1, 16);          sheet.WriteNumber( 7, 2,  7);    sheet.WriteText( 8, 0, 'Maths');     sheet.WriteNumber( 8, 1, 10);          sheet.WriteNumber( 8, 2, 17);    sheet.WriteText( 9, 0, 'Physics');   sheet.WriteNumber( 9, 1, 12);          sheet.WriteNumber( 9, 2, 19);    sheet.WriteText(10, 0, 'Computer');  sheet.WriteNumber(10, 1, 16);          sheet.WriteNumber(10, 2, 18);     // Create chart: left/top in cell D4, 160 mm x 100 mm    ch := book.AddChart(sheet, 2, 3, 160, 100);     // Chart properties    ch.Border.Style := clsNoLine;    ch.Title.Caption := 'School Grades';    ch.Title.Font.Style := [fssBold];    ch.Legend.Border.Style := clsNoLine;    ch.XAxis.Title.Caption := '';    ch.YAxis.Title.Caption := 'Grade points';    ch.YAxis.AxisLine.Color := scSilver;    ch.YAxis.MajorTicks := [];     // Add 1st bar series ("Student 1")    ser := TsBarSeries.Create(ch);    ser.SetTitleAddr(2, 1);              // series 1 title in cell B3    ser.SetLabelRange(3, 0, 10, 0);      // series 1 x labels in A4:A11    ser.SetYRange(3, 1, 10, 1);          // series 1 y values in B4:B11    ser.Line.Color := scDarkRed;    ser.Fill.Style := cfsSolidHatched;    ser.Fill.Hatch := ch.Hatches.AddLineHatch('Crossed', chsDouble, scDarkRed, 2, 0.1, 45);    ser.Fill.Color := scRed;     // Add 2nd bar series ("Student 2")    ser := TsBarSeries.Create(ch);    ser.SetTitleAddr(2, 2);              // series 2 title in cell C3    ser.SetLabelRange(3, 0, 10, 0);      // series 2 x labels in A4:A11    ser.SetYRange(3, 2, 10, 2);          // series 2 y values in C4:C11    ser.Line.Color := scDarkBlue;    ser.Fill.Style := cfsSolidHatched;    ser.Fill.Hatch := ch.Hatches.AddLineHatch('Forward', chsSingle, scWhite, 1.5, 0.1, 45);    ser.Fill.Color := scBlue;     book.WriteToFile(fn, true);    WriteLn('Data saved with chart in ', fn);  finally    book.Free;  end;end.
What I think happens is as follows:
First time, there is no file, so it creates the two sheets (dummy is only needed, so the real one can be deleted - the last one can never be deleted, what is an improvement request, if I may) and adds the data and the chart, and finally saves it. The file is perfect.
Second time it deletes the sheet but probably not the chart. Then it adds the sheet and the chart and saves it. The file is not perfect any more, it has actually two charts in it, but OpenOffice can open it. If you drag the chart away, under it there is another one.
Third time the program cannot open it, with an unmatched tag error.

Do I need to delete the Chart manually? I would think that as the chart is linked to the sheet, once the sheet is deleted the chart should go with it.

Thanks,

P.S. I am very well used to and prepared to accept more bugs, as long as you give this excellent and quick support. My programs are more buggy anyway...

wp:
Try again. Yes, a worksheet must destroy the charts linked to it. I had focused on the more difficult things. As I said: work in progress...

jollytall:
Now it works as intended. Thank you!

jollytall:
Sorry to say but it again worked only for a while. It worked as long as I deleted the sheet - and recreated the chart if I wanted - before saving it again.
Once I load and save a file with a chart, it corrupts somehow and next time it cannot be loaded.
In the following example I added the second try..finally block and simplified a bit above. The problem is with the second try. If the exit; is in it, it works perfectly. Once you comment/remove the exit; and thus you load and save the file without changing it, at the next run it crashes again.

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---program test; uses  Classes, Sysutils,  fpspreadsheet, fpsTypes, fpsopendocument, fpsChart; const  FILE_NAME = 'test.ods'; var  book: TsWorkbook;  dummy, sheet: TsWorksheet;  ch: TsChart;  ser: TsChartSeries;  fn: String;begin  fn := FILE_NAME;   book := TsWorkbook.Create;  try    if FileExists(fn) then      book.ReadFromFile(fn);     dummy := book.GetWorksheetByName('dummy');    if not assigned(dummy) then      dummy := book.AddWorksheet('dummy');    sheet := book.GetWorksheetByName('bar_series');    if assigned(sheet) then      book.RemoveWorksheet(sheet);    sheet := book.AddWorksheet('bar_series');     // Enter data    sheet.WriteText( 0, 0, 'School Grades');    sheet.WriteFont( 0, 0, '', 12, [fssBold], scBlack);    sheet.WriteText( 2, 0, '');          sheet.WriteText  ( 2, 1, 'Student 1'); sheet.WriteText  ( 2, 2, 'Student 2');    sheet.WriteText( 3, 0, 'Biology');   sheet.WriteNumber( 3, 1, 12);          sheet.WriteNumber( 3, 2, 15);    sheet.WriteText( 4, 0, 'History');   sheet.WriteNumber( 4, 1, 11);          sheet.WriteNumber( 4, 2, 13);    sheet.WriteText( 5, 0, 'French');    sheet.WriteNumber( 5, 1, 16);          sheet.WriteNumber( 5, 2, 11);    sheet.WriteText( 6, 0, 'English');   sheet.WriteNumber( 6, 1, 18);          sheet.WriteNumber( 6, 2, 11);    sheet.WriteText( 7, 0, 'Sports');    sheet.WriteNumber( 7, 1, 16);          sheet.WriteNumber( 7, 2,  7);    sheet.WriteText( 8, 0, 'Maths');     sheet.WriteNumber( 8, 1, 10);          sheet.WriteNumber( 8, 2, 17);    sheet.WriteText( 9, 0, 'Physics');   sheet.WriteNumber( 9, 1, 12);          sheet.WriteNumber( 9, 2, 19);    sheet.WriteText(10, 0, 'Computer');  sheet.WriteNumber(10, 1, 16);          sheet.WriteNumber(10, 2, 18);     // Create chart: left/top in cell D4, 160 mm x 100 mm    ch := book.AddChart(sheet, 2, 3, 160, 100);     // Chart properties    ch.Border.Style := clsNoLine;    ch.Title.Caption := 'School Grades';    ch.Title.Font.Style := [fssBold];    ch.Legend.Border.Style := clsNoLine;    ch.XAxis.Title.Caption := '';    ch.YAxis.Title.Caption := 'Grade points';    ch.YAxis.AxisLine.Color := scSilver;    ch.YAxis.MajorTicks := [];     // Add 1st bar series ("Student 1")    ser := TsBarSeries.Create(ch);    ser.SetTitleAddr(2, 1);              // series 1 title in cell B3    ser.SetLabelRange(3, 0, 10, 0);      // series 1 x labels in A4:A11    ser.SetYRange(3, 1, 10, 1);          // series 1 y values in B4:B11    ser.Line.Color := scDarkRed;    ser.Fill.Style := cfsSolidHatched;    ser.Fill.Hatch := ch.Hatches.AddLineHatch('Crossed', chsDouble, scDarkRed, 2, 0.1, 45);    ser.Fill.Color := scRed;     book.WriteToFile(fn, true);    WriteLn('Data saved with chart in ', fn);  finally    book.Free;    end;   exit; // <- TRY TO COMMENT IT   // This is the problem block  book := TsWorkbook.Create;  try    book.ReadFromFile(fn);    book.WriteToFile(fn, true);  finally    book.free;    end; end.

Navigation

[0] Message Index

[#] Next page

[*] Previous page

Go to full version