Example #1
0
        SheetDiffStatus DiffSheet(ISheet src, ISheet dst, SheetDiffStatus status = null)
        {
            status = status ?? new SheetDiffStatus();

            bool changed = false;

            var head1 = GetHeaderStrList(src);
            var head2 = GetHeaderStrList(dst);

            if (head1 == null || head2 == null)
            {
                return(null);
            }

            var diff = NetDiff.DiffUtil.Diff(head1, head2);
            //var optimized = diff.ToList();// NetDiff.DiffUtil.OptimizeCaseDeletedFirst(diff);
            var optimized = DiffUtil.OptimizeCaseDeletedFirst(diff);

            changed = changed || optimized.Any(a => a.Status != DiffStatus.Equal);

            status.diffHead = new SheetRowDiff()
            {
                diffcells = optimized.ToList()
            };
            status.column2diff1    = new Dictionary <int, int[]>();
            status.column2diff2    = new Dictionary <int, int[]>();
            status.column2diff1[0] = getColumn2Diff(status.diffHead.diffcells, true);
            status.column2diff2[0] = getColumn2Diff(status.diffHead.diffcells, false);

            books["src"].SheetValideColumn[src.SheetName] = head1.Count;
            books["dst"].SheetValideColumn[dst.SheetName] = head2.Count;

            status.diffFistColumn = GetIDDiffList(src, dst, 1);

            changed = changed || status.diffFistColumn.Any(a => a.Status != DiffStatus.Equal);

            status.diffSheet      = new List <SheetRowDiff>();
            status.rowID2DiffMap1 = new Dictionary <int, int>();
            status.rowID2DiffMap2 = new Dictionary <int, int>();
            status.Diff2RowID1    = new Dictionary <int, int>();
            status.Diff2RowID2    = new Dictionary <int, int>();
            status.RowEdited1     = status.RowEdited1 ?? new Dictionary <int, Dictionary <int, CellEditMode> >();
            status.RowEdited2     = status.RowEdited2 ?? new Dictionary <int, Dictionary <int, CellEditMode> >();

            foreach (var diffkv in status.diffFistColumn)
            {
                var rowid1 = diffkv.Obj1.Value;
                var rowid2 = diffkv.Obj2.Value;
                if (diffkv.Obj1.Key == null)
                {
                    // 创建新行,方便比较
                    rowid1 = -1;
                }
                if (diffkv.Obj2.Key == null)
                {
                    rowid2 = -1;
                }
                var diffrow = DiffSheetRow(src, rowid1, dst, rowid2, status);

                if (diffkv.Obj1.Key == null)
                {
                    // 创建新行,方便比较,放在后面是为了保证diff的时候是new,delete的形式,而不是modify
                    rowid1 = books["src"].SheetValideRow[src.SheetName];
                    //src.CreateRow(rowid1);
                }
                if (diffkv.Obj2.Key == null)
                {
                    rowid2 = books["dst"].SheetValideRow[dst.SheetName];
                    //dst.CreateRow(rowid2);
                }
                status.column2diff1[rowid1] = getColumn2Diff(diffrow, true);
                status.column2diff2[rowid2] = getColumn2Diff(diffrow, false);

                int diffIdx = status.diffSheet.Count;

                status.rowID2DiffMap1[rowid1] = diffIdx;
                status.rowID2DiffMap2[rowid2] = diffIdx;

                status.Diff2RowID1[diffIdx] = rowid1;
                status.Diff2RowID2[diffIdx] = rowid2;

                if (!status.RowEdited1.ContainsKey(rowid1))
                {
                    status.RowEdited1[rowid1] = new Dictionary <int, CellEditMode>();
                }
                if (!status.RowEdited2.ContainsKey(rowid2))
                {
                    status.RowEdited2[rowid2] = new Dictionary <int, CellEditMode>();
                }

                var rowdiff = new SheetRowDiff();
                rowdiff.diffcells = diffrow;

                rowdiff.changed = diffrow.Any(a => a.Status != DiffStatus.Equal);
                if (rowdiff.changed)
                {
                    rowdiff.diffcell_details = new List <List <DiffResult <char> > >();
                    foreach (var cell in diffrow)
                    {
                        if (cell.Status == DiffStatus.Modified)
                        {
                            var cell_diff = NetDiff.DiffUtil.Diff(cell.Obj1, cell.Obj2);
                            //var optimized = diff.ToList();// NetDiff.DiffUtil.OptimizeCaseDeletedFirst(diff);
                            var opt_cell_diff = DiffUtil.OptimizeCaseDeletedFirst(cell_diff);

                            rowdiff.diffcell_details.Add(opt_cell_diff.ToList());
                        }
                        else
                        {
                            rowdiff.diffcell_details.Add(null);
                        }
                    }
                }
                status.diffSheet.Add(rowdiff);

                changed = changed || rowdiff.changed;

                if (changed)
                {
                    changed = true;
                }
            }

            status.changed = changed;

            return(status);
        }
Example #2
0
        List <DiffResult <string> > DiffSheetRow(ISheet sheet1, int row1, ISheet sheet2, int row2, SheetDiffStatus status)
        {
            var list1 = new List <string>();
            var list2 = new List <string>();

            if (sheet1.GetRow(row1) != null)
            {
                var row         = sheet1.GetRow(row1);
                var columnCount = books["src"].SheetValideColumn[sheet1.SheetName];
                for (int i = 0; i < columnCount; ++i)
                {
                    list1.Add(Util.GetCellValue(row.GetCell(i)));
                }
            }

            if (sheet2.GetRow(row2) != null)
            {
                var row         = sheet2.GetRow(row2);
                var columnCount = books["dst"].SheetValideColumn[sheet2.SheetName];
                for (int i = 0; i < columnCount; ++i)
                {
                    list2.Add(Util.GetCellValue(row.GetCell(i)));
                }
            }
            var diff = DiffUtil.Diff(list1, list2);
            //var optimized = diff.ToList();// DiffUtil.OptimizeCaseDeletedFirst(diff);
            var optimized = DiffUtil.OptimizeCaseDeletedFirst(diff);

            optimized = DiffUtil.OptimizeCaseInsertedFirst(optimized);

            return(optimized.ToList());
        }
Example #3
0
        List <DiffResult <string> > DiffSheetRow(ISheet sheet1, int row1, ISheet sheet2, int row2, SheetDiffStatus status, out int maxLineCount)
        {
            var list1 = new List <string>();
            var list2 = new List <string>();

            maxLineCount = 0;
            if (sheet1.GetRow(row1) != null)
            {
                var row         = sheet1.GetRow(row1);
                var columnCount = books["src"].SheetValideColumn[sheet1.SheetName];
                for (int i = 0; i < columnCount; ++i)
                {
                    var value = Util.GetCellValue(row.GetCell(i));
                    maxLineCount = Math.Max(maxLineCount, value.Count((c) => { return(c == '\n'); }) + 1);

                    list1.Add(value);
                }
            }

            if (sheet2.GetRow(row2) != null)
            {
                var row         = sheet2.GetRow(row2);
                var columnCount = books["dst"].SheetValideColumn[sheet2.SheetName];
                for (int i = 0; i < columnCount; ++i)
                {
                    var value = Util.GetCellValue(row.GetCell(i));
                    maxLineCount = Math.Max(maxLineCount, value.Count((c) => { return(c == '\n'); }) + 1);
                    list2.Add(value);
                }
            }
            var diff = DiffUtil.Diff(list1, list2);
            //var optimized = diff.ToList();// DiffUtil.OptimizeCaseDeletedFirst(diff);
            var optimized = DiffUtil.OptimizeCaseDeletedFirst(diff);

            optimized = DiffUtil.OptimizeCaseInsertedFirst(optimized);
            var tlist = optimized.ToList();

            optimized = DiffUtil.OptimizeShift(tlist, false);
            optimized = DiffUtil.OptimizeShift(optimized, true);

            return(optimized.ToList());
        }