private static Table ExtractModelData(this ISpreadsheetModel model, IProgressMonitor monitor)
        {
            var usedArea    = model.GetCellRange();
            var cellList    = new List <CellXml>((usedArea.RowsCount + 1) * (usedArea.ColumnsCount + 1));
            var formatsList = new List <CellFormatXml>();
            var formatsUsed = new HashSet <int>();

            monitor.AddStepsCount(usedArea.EndRow - usedArea.StartRow);

            //Console.Out.WriteLine("Rows: {0}, Columns: {1}", usedArea.RowsCount, usedArea.ColumnsCount);
            var cellFormatsProvider = model.GetFormatsProvider();

            for (var row = usedArea.StartRow; row <= usedArea.EndRow; row++)
            {
                for (var column = usedArea.StartColumn; column <= usedArea.EndColumn; column++)
                {
                    var cell = model.GetCell(row, column);
                    if (cell.ContentType != CellContentType.Empty)
                    {
                        var formatId = cell.FormatId;
                        if (!formatsUsed.Contains(formatId))
                        {
                            var format = cellFormatsProvider.GetFormat(cell.FormatId);
                            formatsUsed.Add(formatId);
                            var formatInfo = new CellFormatXml
                            {
                                id           = format.FormatId,
                                type         = (int)format.FormatTypeFlags,
                                formatString = format.FormatString,
                            };

                            formatsList.Add(formatInfo);
                        }
                        var resultCell = new CellXml
                        {
                            row         = row,
                            col         = column,
                            rawValue    = cell.Value,
                            Value       = cell.Text,
                            formatId    = cell.FormatId,
                            contentType = cell.ContentType.ToXmlCellType(),
                            xMin        = 0,
                            xMax        = 0,
                            yMin        = 0,
                            yMax        = 0,
                        };
                        cellList.Add(resultCell);
                    }
                }
                monitor.StepFinished();
            }

            return(new TableXml
            {
                startRow = usedArea.StartRow,
                endRow = usedArea.EndRow,
                startCol = usedArea.StartColumn,
                endCol = usedArea.EndColumn,
                NumberFormats = new NumberFormatsXml
                {
                    CellFormat = formatsList.ToArray(),
                    defaultDecimals = cellFormatsProvider.StandardMaxDecimals,
                    nullDate = cellFormatsProvider.NullDate,
                },
                Cell = cellList.ToArray(),
            });
        }