|
| 1 | +import 'package:flutter/material.dart'; |
| 2 | +// ignore: depend_on_referenced_packages |
| 3 | +import 'package:syncfusion_flutter_xlsio/xlsio.dart' hide Column; |
| 4 | +import 'package:syncfusion_officechart/officechart.dart'; |
| 5 | + |
| 6 | +//Local imports |
| 7 | +import 'helper/save_file_mobile.dart' |
| 8 | + if (dart.library.html) 'helper/save_file_web.dart'; |
| 9 | + |
| 10 | +void main() { |
| 11 | + runApp(CreateOfficeChartWidget()); |
| 12 | +} |
| 13 | + |
| 14 | +/// Represents the office chart widget class. |
| 15 | +class CreateOfficeChartWidget extends StatelessWidget { |
| 16 | + @override |
| 17 | + Widget build(BuildContext context) { |
| 18 | + return const MaterialApp( |
| 19 | + home: CreateOfficeChartStatefulWidget(title: 'Create Excel document'), |
| 20 | + ); |
| 21 | + } |
| 22 | +} |
| 23 | + |
| 24 | +/// Represents the office chart stateful widget class. |
| 25 | +class CreateOfficeChartStatefulWidget extends StatefulWidget { |
| 26 | + /// Initalize the instance of the [CreateOfficeChartStatefulWidget] class. |
| 27 | + const CreateOfficeChartStatefulWidget({Key? key, required this.title}) |
| 28 | + : super(key: key); |
| 29 | + |
| 30 | + /// title. |
| 31 | + final String title; |
| 32 | + @override |
| 33 | + // ignore: library_private_types_in_public_api |
| 34 | + _CreateOfficeChartState createState() => _CreateOfficeChartState(); |
| 35 | +} |
| 36 | + |
| 37 | +class _CreateOfficeChartState extends State<CreateOfficeChartStatefulWidget> { |
| 38 | + @override |
| 39 | + Widget build(BuildContext context) { |
| 40 | + return Scaffold( |
| 41 | + appBar: AppBar( |
| 42 | + title: Text(widget.title), |
| 43 | + ), |
| 44 | + body: Center( |
| 45 | + child: Column( |
| 46 | + mainAxisAlignment: MainAxisAlignment.center, |
| 47 | + children: <Widget>[ |
| 48 | + TextButton( |
| 49 | + style: TextButton.styleFrom( |
| 50 | + foregroundColor: Colors.white, |
| 51 | + backgroundColor: Colors.lightBlue, |
| 52 | + disabledForegroundColor: Colors.grey, |
| 53 | + ), |
| 54 | + onPressed: generateOfficeChart, |
| 55 | + child: const Text('Generate Excel Chart'), |
| 56 | + ) |
| 57 | + ], |
| 58 | + ), |
| 59 | + ), |
| 60 | + ); |
| 61 | + } |
| 62 | + |
| 63 | + Future<void> generateOfficeChart() async { |
| 64 | + //Create a Excel document. |
| 65 | + |
| 66 | + //Creating a workbook. |
| 67 | + final Workbook workbook = Workbook(0); |
| 68 | + //Adding a Sheet with name to workbook. |
| 69 | + final Worksheet sheet1 = workbook.worksheets.addWithName('Budget'); |
| 70 | + sheet1.showGridlines = false; |
| 71 | + |
| 72 | + sheet1.enableSheetCalculations(); |
| 73 | + sheet1.getRangeByIndex(1, 1).columnWidth = 19.86; |
| 74 | + sheet1.getRangeByIndex(1, 2).columnWidth = 14.38; |
| 75 | + sheet1.getRangeByIndex(1, 3).columnWidth = 12.98; |
| 76 | + sheet1.getRangeByIndex(1, 4).columnWidth = 12.08; |
| 77 | + sheet1.getRangeByIndex(1, 5).columnWidth = 8.82; |
| 78 | + sheet1.getRangeByName('A1:A18').rowHeight = 20.2; |
| 79 | + |
| 80 | + //Adding cell style. |
| 81 | + final Style style1 = workbook.styles.add('Style1'); |
| 82 | + style1.backColor = '#D9E1F2'; |
| 83 | + style1.hAlign = HAlignType.left; |
| 84 | + style1.vAlign = VAlignType.center; |
| 85 | + style1.bold = true; |
| 86 | + |
| 87 | + final Style style2 = workbook.styles.add('Style2'); |
| 88 | + style2.backColor = '#8EA9DB'; |
| 89 | + style2.vAlign = VAlignType.center; |
| 90 | + style2.numberFormat = r'[Red](\$#,###)'; |
| 91 | + style2.bold = true; |
| 92 | + |
| 93 | + sheet1.getRangeByName('A10').cellStyle = style1; |
| 94 | + sheet1.getRangeByName('B10:D10').cellStyle.backColor = '#D9E1F2'; |
| 95 | + sheet1.getRangeByName('B10:D10').cellStyle.hAlign = HAlignType.right; |
| 96 | + sheet1.getRangeByName('B10:D10').cellStyle.vAlign = VAlignType.center; |
| 97 | + sheet1.getRangeByName('B10:D10').cellStyle.bold = true; |
| 98 | + |
| 99 | + sheet1.getRangeByName('A11:A17').cellStyle.vAlign = VAlignType.center; |
| 100 | + sheet1.getRangeByName('A11:D17').cellStyle.borders.bottom.lineStyle = |
| 101 | + LineStyle.thin; |
| 102 | + sheet1.getRangeByName('A11:D17').cellStyle.borders.bottom.color = '#BFBFBF'; |
| 103 | + |
| 104 | + sheet1.getRangeByName('D18').cellStyle = style2; |
| 105 | + sheet1.getRangeByName('D18').cellStyle.vAlign = VAlignType.center; |
| 106 | + sheet1.getRangeByName('A18:C18').cellStyle.backColor = '#8EA9DB'; |
| 107 | + sheet1.getRangeByName('A18:C18').cellStyle.vAlign = VAlignType.center; |
| 108 | + sheet1.getRangeByName('A18:C18').cellStyle.bold = true; |
| 109 | + sheet1.getRangeByName('A18:C18').numberFormat = r'\$#,###'; |
| 110 | + |
| 111 | + sheet1.getRangeByIndex(10, 1).setText('Category'); |
| 112 | + sheet1.getRangeByIndex(10, 2).setText('Expected cost'); |
| 113 | + sheet1.getRangeByIndex(10, 3).setText('Actual Cost'); |
| 114 | + sheet1.getRangeByIndex(10, 4).setText('Difference'); |
| 115 | + sheet1.getRangeByIndex(11, 1).setText('Venue'); |
| 116 | + sheet1.getRangeByIndex(12, 1).setText('Seating & Decor'); |
| 117 | + sheet1.getRangeByIndex(13, 1).setText('Technical team'); |
| 118 | + sheet1.getRangeByIndex(14, 1).setText('Performers'); |
| 119 | + sheet1.getRangeByIndex(15, 1).setText("Performer's transport"); |
| 120 | + sheet1.getRangeByIndex(16, 1).setText("Performer's stay"); |
| 121 | + sheet1.getRangeByIndex(17, 1).setText('Marketing'); |
| 122 | + sheet1.getRangeByIndex(18, 1).setText('Total'); |
| 123 | + |
| 124 | + sheet1.getRangeByName('B11:D17').numberFormat = r'\$#,###'; |
| 125 | + sheet1.getRangeByName('D11').numberFormat = r'[Red](\$#,###)'; |
| 126 | + sheet1.getRangeByName('D12').numberFormat = r'[Red](\$#,###)'; |
| 127 | + sheet1.getRangeByName('D14').numberFormat = r'[Red](\$#,###)'; |
| 128 | + |
| 129 | + sheet1.getRangeByName('B11').setNumber(16250); |
| 130 | + sheet1.getRangeByName('B12').setNumber(1600); |
| 131 | + sheet1.getRangeByName('B13').setNumber(1000); |
| 132 | + sheet1.getRangeByName('B14').setNumber(12400); |
| 133 | + sheet1.getRangeByName('B15').setNumber(3000); |
| 134 | + sheet1.getRangeByName('B16').setNumber(4500); |
| 135 | + sheet1.getRangeByName('B17').setNumber(3000); |
| 136 | + sheet1.getRangeByName('B18').setFormula('=SUM(B11:B17)'); |
| 137 | + |
| 138 | + sheet1.getRangeByName('C11').setNumber(17500); |
| 139 | + sheet1.getRangeByName('C12').setNumber(1828); |
| 140 | + sheet1.getRangeByName('C13').setNumber(800); |
| 141 | + sheet1.getRangeByName('C14').setNumber(14000); |
| 142 | + sheet1.getRangeByName('C15').setNumber(2600); |
| 143 | + sheet1.getRangeByName('C16').setNumber(4464); |
| 144 | + sheet1.getRangeByName('C17').setNumber(2700); |
| 145 | + sheet1.getRangeByName('C18').setFormula('=SUM(C11:C17)'); |
| 146 | + |
| 147 | + sheet1.getRangeByName('D11').setFormula('=IF(C11>B11,C11-B11,B11-C11)'); |
| 148 | + sheet1.getRangeByName('D12').setFormula('=IF(C12>B12,C12-B12,B12-C12)'); |
| 149 | + sheet1.getRangeByName('D13').setFormula('=IF(C13>B13,C13-B13,B13-C13)'); |
| 150 | + sheet1.getRangeByName('D14').setFormula('=IF(C14>B14,C14-B14,B14-C14)'); |
| 151 | + sheet1.getRangeByName('D15').setFormula('=IF(C15>B15,C15-B15,B15-C15)'); |
| 152 | + sheet1.getRangeByName('D16').setFormula('=IF(C16>B16,C16-B16,B16-C16)'); |
| 153 | + sheet1.getRangeByName('D17').setFormula('=IF(C17>B17,C17-B17,B17-C17)'); |
| 154 | + sheet1.getRangeByName('D18').setFormula('=IF(C18>B18,C18-B18,B18-C18)'); |
| 155 | + |
| 156 | + // Create chart collection for worksheet. |
| 157 | + final ChartCollection charts = ChartCollection(sheet1); |
| 158 | + |
| 159 | + // Add a chart to the chart collection. |
| 160 | + final Chart chart = charts.add(); |
| 161 | + chart.chartType = ExcelChartType.pie; |
| 162 | + chart.dataRange = sheet1.getRangeByName('A11:B17'); |
| 163 | + chart.isSeriesInRows = false; |
| 164 | + chart.chartTitle = 'Event Expenses'; |
| 165 | + chart.chartTitleArea.bold = true; |
| 166 | + chart.chartTitleArea.size = 16; |
| 167 | + chart.topRow = 1; |
| 168 | + chart.bottomRow = 10; |
| 169 | + chart.leftColumn = 1; |
| 170 | + chart.rightColumn = 5; |
| 171 | + sheet1.charts = charts; |
| 172 | + |
| 173 | + //Save and launch Excel. |
| 174 | + final List<int> bytes = workbook.saveAsStream(); |
| 175 | + workbook.dispose(); |
| 176 | + |
| 177 | + await saveAndLaunchFile(bytes, 'ExpenseReport.xlsx'); |
| 178 | + } |
| 179 | +} |
0 commit comments