Forum > FPSpreadsheet
Adding a chart to a spreadsheet in a console app
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