Пример #1
0
        public async Task OutputResultsAsync(IQueryRunner runner, IQueryTextProvider textProvider)
        {
            var dlg = new Microsoft.Win32.SaveFileDialog
            {
                DefaultExt = ".xlsx",
                Filter     = "Excel file (*.xlsx)|*.xlsx"
            };

            string fileName   = "";
            long   durationMs = 0;
            // Show save file dialog box
            var result = dlg.ShowDialog();

            // Process save file dialog box results
            if (result == true)
            {
                // Save document
                fileName = dlg.FileName;
                await Task.Run(() =>
                {
                    try
                    {
                        runner.OutputMessage("Query Started");

                        var sw = Stopwatch.StartNew();

                        var daxQuery = textProvider.QueryText;
                        var reader   = runner.ExecuteDataReaderQuery(daxQuery);

                        using (var statusProgress = runner.NewStatusBarMessage("Starting Export"))
                        {
                            try
                            {
                                if (reader != null)
                                {
                                    int iFileCnt = 1;


                                    runner.OutputMessage("Command Complete, writing output file");

                                    bool moreResults = true;

                                    using (var stream = new FileStream(fileName, FileMode.Create, FileAccess.Write))
                                        using (var xlsxWriter = new XlsxWriter(stream))
                                        {
                                            while (moreResults)
                                            {
                                                // create a worksheet for the current resultset
                                                xlsxWriter.BeginWorksheet($"Query{iFileCnt}", 1);

                                                // write out the current resultset
                                                var iRowCnt = WriteToWorksheet(reader, xlsxWriter, statusProgress, runner);

                                                // setup Excel Autofilters
                                                xlsxWriter.SetAutoFilter(1, 1, xlsxWriter.CurrentRowNumber, reader.FieldCount);

                                                runner.OutputMessage(
                                                    string.Format("Query {2} Completed ({0:N0} row{1} returned)"
                                                                  , iRowCnt
                                                                  , iRowCnt == 1 ? "" : "s", iFileCnt)
                                                    );

                                                runner.RowCount = iRowCnt;

                                                moreResults = reader.NextResult();

                                                iFileCnt++;
                                            }
                                        }

                                    sw.Stop();
                                    durationMs = sw.ElapsedMilliseconds;

                                    runner.SetResultsMessage("Query results written to file", OutputTarget.File);
                                    runner.ActivateOutput();
                                }
                                else
                                {
                                    runner.OutputError("Query Batch Completed with errors listed above (you may need to scroll up)", durationMs);
                                }
                            }
                            finally
                            {
                                reader?.Dispose();
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        runner.ActivateOutput();
                        runner.OutputError(ex.Message);
#if DEBUG
                        runner.OutputError(ex.StackTrace);
#endif
                    }
                    finally
                    {
                        runner.OutputMessage("Query Batch Completed", durationMs);
                        runner.QueryCompleted();
                    }
                });
            }
            // else dialog was cancelled so return an empty task.
            await Task.Run(() => { });
        }