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); }
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()); }
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()); }