コード例 #1
0
        private Task <List <SheetCellInfo> > CreateSheetCellInfos <TModel>(ResGroupModel <TModel> group, CancellationToken cancellationToken)
            where TModel : IRowModel
        {
            return(Task.Run(() =>
            {
                int rowIndex = 0;
                List <SheetCellInfo> resCells = new List <SheetCellInfo>();

                foreach (var table in group.Tables)
                {
                    resCells.Add(new SheetCellInfo(rowIndex, 0, table.TableTitle));
                    rowIndex += 2;

                    resCells.AddRange(table.Header.Columns.Select((header, colIndex) => new SheetCellInfo(rowIndex, colIndex, header.Title)));
                    rowIndex++;

                    foreach (var row in table.Rows)
                    {
                        resCells.AddRange(row.DataList.Select((dataCell, colIndex) => new SheetCellInfo(rowIndex, colIndex, dataCell.DataString)));

                        rowIndex++;
                    }

                    rowIndex++;
                    cancellationToken.ThrowIfCancellationRequested();
                }

                return resCells;
            }, cancellationToken));
        }
コード例 #2
0
        private IReadOnlyList <ResGroupModel <TModel> > ImportFromDocument <TModel>(string path) where TModel : IRowModel, new()
        {
            using (ExcelPackage package = new ExcelPackage(new FileInfo(path)))
            {
                var workbook = package.Workbook;

                var dataList = new List <ResGroupModel <TModel> >();

                foreach (ExcelWorksheet worksheetPart in workbook.Worksheets)
                {
                    var tables   = new List <ResTableModel <TModel> >();
                    var newGroup = new ResGroupModel <TModel> {
                        GroupTitle = worksheetPart.Name, Tables = tables
                    };

                    var cells  = worksheetPart.Cells.Select(cell => new { cell.Start.Row, cell.Start.Column, Value = (string)cell.Value }).ToList();
                    int maxRow = cells.Max(c => c.Row);

                    string[][] cellsArray = new string[maxRow][];

                    foreach (var row in cells.GroupBy(c => c.Row))
                    {
                        cellsArray[row.Key - 1] = row.OrderBy(c => c.Column).Select(c => c.Value).ToArray();
                    }

                    for (int i = 0; i < cellsArray.Length; i++)
                    {
                        var table = new ResTableModel <TModel>();

                        table.TableTitle = cellsArray[i][0];

                        i           += 2;
                        table.Header = new HeaderModel {
                            Columns = cellsArray[i].Select(c => new ColumnModel {
                                Title = c
                            }).ToList()
                        };

                        var      rows = new List <RowModel <TModel> >();
                        string[] rowsArray;
                        while (++i < cellsArray.Length && (rowsArray = cellsArray[i]) != null)
                        {
                            rows.Add(new RowModel <TModel>
                            {
                                Model = new TModel
                                {
                                    DataList = rowsArray.Select(a => new CellModel {
                                        DataString = a
                                    }).ToList()
                                }
                            });
                        }

                        table.Rows = rows;
                    }

                    dataList.Add(newGroup);
                }

                return(dataList);
            }
        }
コード例 #3
0
        private async Task PushCellsAsync <TModel>(WorksheetEntry worksheet, ResGroupModel <TModel> group, SemaphoreSlim semaphore, IAggregateProgress progress, CancellationToken cancellationToken)
            where TModel : IRowModel
        {
            var progresses       = progress.CreateParallelProgresses(0.2, 0.8);
            var mappingProgress  = progresses[0];
            var updatingProgress = progresses[1];



            var cellFeed = await Service.GetFeedAsync(worksheet.GetCellsQuery(), cancellationToken : cancellationToken);

            string cellsFeedUrl = cellFeed.Self;
            string batchUrl     = cellFeed.Batch;

            var resCells = await CreateSheetCellInfos(group, cancellationToken);

            var cellGroups = Devide(resCells, MaxBatchSize);

            var mappingTasks = (await MapFeedBatchesAsync(cellGroups, cellsFeedUrl, batchUrl, mappingProgress, cancellationToken))
                               .Select(async kvp =>
            {
                var mappingFeed = kvp.Key;
                var p           = kvp.Value;

                await semaphore.WaitAsync(cancellationToken);

                try
                {
                    return(await Service.BatchFeedAsync(mappingFeed, TimeOutAttemptsCount, p, cancellationToken));
                }
                finally
                {
                    semaphore.Release();
                }
            });

            //Mapping cells.
            List <CellFeed> mappingFeeds = new List <CellFeed>(cellGroups.Count);

            foreach (var mappingTask in mappingTasks)
            {
                mappingFeeds.Add(await mappingTask);
            }

            //Updating cells.
            var updatingTasks = (await UpdateFeedBatchesAsync(cellGroups, mappingFeeds, cellsFeedUrl, batchUrl, updatingProgress, cancellationToken))
                                .Select(async kvp =>
            {
                var updateFeed = kvp.Key;
                var p          = kvp.Value;

                await semaphore.WaitAsync(cancellationToken);

                try
                {
                    return(await Service.BatchFeedAsync(updateFeed, TimeOutAttemptsCount, p, cancellationToken));
                }
                finally
                {
                    semaphore.Release();
                }
            });

            foreach (var updatingTask in updatingTasks)
            {
                await updatingTask;
            }
        }
コード例 #4
0
        private Task <ResGroupModel <TModel> > ProcessGroupAsync <TModel>(WorksheetEntry worksheet, IEnumerable <CellEntry> cells, CancellationToken cancellationToken) where TModel : IRowModel, new()
        {
            return(Task.Run(() =>
            {
                List <string>[] rows = new List <string> [(int)worksheet.Rows];

                foreach (CellEntry cellEntry in cells)
                {
                    var cellsList = rows[cellEntry.Row - 1];
                    if (cellsList == null)
                    {
                        cellsList = new List <string>();
                        rows[cellEntry.Row - 1] = cellsList;
                    }

                    InsertElementAt(cellsList, (int)cellEntry.Column - 1, SheetCellInfo.GetValue(cellEntry));
                }

                var rowsEnumerator = rows.AsEnumerable().GetEnumerator();

                ResGroupModel <TModel> group = new ResGroupModel <TModel>
                {
                    GroupTitle = worksheet.Title.Text,
                };

                List <ResTableModel <TModel> > tables = new List <ResTableModel <TModel> >();

                int colsCount = (int)worksheet.Cols;

                List <string> row;
                while (rowsEnumerator.MoveNext())
                {
                    //Title row.
                    row = rowsEnumerator.Current;
                    if (row == null)
                    {
                        break;
                    }

                    var newTable = new ResTableModel <TModel> {
                        TableTitle = row[0]
                    };

                    //Space row.
                    rowsEnumerator.MoveNext();

                    //Header
                    rowsEnumerator.MoveNext();
                    row = rowsEnumerator.Current;

                    newTable.Header = new HeaderModel {
                        Columns = row.Select(r => new ColumnModel {
                            Title = r
                        }).ToList()
                    };

                    var rowsList = new List <RowModel <TModel> >();

                    while (rowsEnumerator.MoveNext())
                    {
                        row = rowsEnumerator.Current;
                        if (row == null)
                        {
                            break;
                        }

                        if (row.Count != colsCount)
                        {
                            //Adding empty cells.
                            for (int i = colsCount - 1; i >= 0; i--)
                            {
                                var elem = row.ElementAtOrDefault(i);
                                if (elem == null)
                                {
                                    InsertElementAt(row, i, string.Empty);
                                    if (row.Count == colsCount)
                                    {
                                        break;
                                    }
                                }
                            }
                        }

                        rowsList.Add(new RowModel <TModel> {
                            Model = new TModel {
                                DataList = row.Select(c => new CellModel {
                                    Model = c
                                }).ToList()
                            }
                        });
                    }

                    newTable.Rows = rowsList;
                    tables.Add(newTable);
                }

                group.Tables = tables;

                return group;
            }, cancellationToken));
        }