protected virtual void DoCopyRangeToBook(CellRange range, Document book, SpreadsheetWithCopyToBookOptions options)
        {
            string htmlTable;

            var sheet    = range.Worksheet;
            var workbook = sheet.Workbook;

            var htmlOptions = new DevExpress.XtraSpreadsheet.Export.HtmlDocumentExporterOptions()
            {
                SheetIndex = workbook.Sheets.IndexOf(sheet),
                Range      = range.Worksheet.GetDataRange().GetReferenceA1(),
                Encoding   = Encoding.Unicode
            };

            using (var stream = new MemoryStream())
            {
                workbook.ExportToHtml(stream, htmlOptions);
                stream.Seek(0, SeekOrigin.Begin);

                using var reader = new StreamReader(stream, Encoding.UTF8);
                htmlTable        = reader.ReadToEnd();
            }

            using (new UsingProcessor(() => book.BeginUpdate(), () => book.EndUpdate()))
            {
                var documentRange = book.AppendHtmlText(htmlTable, DevExpress.XtraRichEdit.API.Native.InsertOptions.KeepSourceFormatting);
                book.Paragraphs.Append();

                if (options.RepeatAsHeaderRow || options.BreakRowsAcrossPages)
                {
                    options.RepeatAsHeaderRowCount = Utils.ValueInRange(options.RepeatAsHeaderRowCount, 1, 100);

                    var tables = book.Tables.Get(documentRange);
                    foreach (var table in tables)
                    {
                        using (new UsingProcessor(() => table.BeginUpdate(), () => table.EndUpdate()))
                        {
                            if (options.RepeatAsHeaderRow)
                            {
                                for (int i = 0; i < Math.Max(options.RepeatAsHeaderRowCount, table.Rows.Count); i++)
                                {
                                    table.Rows[i].RepeatAsHeaderRow = true;
                                }
                            }

                            if (options.BreakRowsAcrossPages)
                            {
                                for (int i = 0; i < table.Rows.Count; i++)
                                {
                                    table.Rows[i].BreakAcrossPages = true;
                                }
                            }
                        }
                    }
                }


                AddBookComments(book, documentRange, options);

                book.CaretPosition = documentRange.End;
                ScrollToCaret();
            }
        }
        protected virtual string GenerateTableHtml(SpreadTableOptions options)
        {
            string    htmlTable;
            IWorkbook workbook        = null;
            bool      disposeWorkbook = false;

            try
            {
                if (options._Spreadsheet != null)
                {
                    workbook = options._Spreadsheet.Workbook;
                }
                else if (!string.IsNullOrWhiteSpace(options._FileName))
                {
                    disposeWorkbook = true;

                    string fileName = Project.Current.MapPath(options._FileName);
                    if (!File.Exists(fileName))
                    {
                        throw new Exception($"File '{fileName}' does not exist.");
                    }

                    workbook = SpreadsheetUtils.CreateWorkbook();
                    workbook.LoadDocument(fileName);
                }
                else
                {
                    workbook = Host?.Spreadsheet?.Workbook;
                }

                if (workbook == null)
                {
                    throw new Exception("Spreadsheet is not specified");
                }

                var range = SpreadsheetUtils.GetWorkbookRange(workbook, options._TableName);

                var optionsHtml = new DevExpress.XtraSpreadsheet.Export.HtmlDocumentExporterOptions()
                {
                    SheetIndex = workbook.Sheets.IndexOf(range.Worksheet),
                    Range      = range.GetReferenceA1(),
                    Encoding   = Encoding.Unicode
                };

                using var stream = new MemoryStream();
                workbook.ExportToHtml(stream, optionsHtml);
                stream.Seek(0, SeekOrigin.Begin);

                using var reader = new StreamReader(stream, Encoding.UTF8);
                htmlTable        = reader.ReadToEnd();
            }
            finally
            {
                if (disposeWorkbook)
                {
                    workbook?.Dispose();
                }
            }

            return(htmlTable);
        }