Пример #1
0
        public void RefreshData()
        {
            var tag   = Tag as string;
            var wrap  = MainWindow.instance.books[tag];
            var wb    = wrap.book;
            var sheet = wb.GetSheetAt(wrap.sheet);

            var issrc = isSrc;

            ExcelGrid.Columns.Clear();

            //var datas = new ObservableCollection<ExcelData>();
            var datas     = new List <ExcelData>();
            var data_maps = new Dictionary <int, ExcelData>();

            MainWindow.instance.excelGridData[tag] = data_maps;

            if (MainWindow.instance.diffSheetName != null)
            {
                var columns = ExcelGrid.Columns;

                // 不把diff结果转换为原来的顺序。因为隐藏相同行后,转换没有意义

                var sheetname = wrap.sheetname;

                if (!MainWindow.instance.sheetsDiff.ContainsKey(sheetname))
                {
                    ExcelGrid.DataContext = datas;
                    return;
                }
                var status = MainWindow.instance.sheetsDiff[sheetname];

                // 没有比较数据的sheet
                if (status == null)
                {
                    return;
                }

                // header不会空
                var columnCount = wrap.SheetValideColumn[sheet.SheetName];
                var headerStr   = new string[columnCount];

                var needChangeHead = MainWindow.instance.ProcessHeader.IsChecked == true;
                if (needChangeHead)
                {
                    var headershow = sheet.GetRow(MainWindow.instance.config.ShowLineID - 1);
                    var headerkey  = sheet.GetRow(MainWindow.instance.config.KeyLineID - 1);

                    if (headershow == null || headerkey == null)
                    {
                        return;
                    }

                    int linecount = 0;
                    for (int i = 0; i < columnCount; ++i)
                    {
                        var cellshow = headershow.GetCell(i);
                        var cellkey  = headerkey.GetCell(i);

                        var strshow = Util.GetCellValue(cellshow);
                        var strkey  = Util.GetCellValue(cellkey);
                        if (string.IsNullOrWhiteSpace(strshow))
                        {
                            strshow = strkey;
                        }

                        if (string.IsNullOrWhiteSpace(strkey))
                        {
                            columnCount = i;
                            break;
                        }
                        // 第二行+第三行,合起来作为key
                        var encodestr = System.Uri.EscapeDataString(strkey) + "_" + i;// + System.Uri.EscapeDataString(str);
                        linecount = Math.Max(linecount, strshow.Count((c) => { return(c == '\n'); }) + 1);

                        var tc = new DataGridTemplateColumn();
                        tc.Header = strshow;
                        tc.CellTemplateSelector        = new CellTemplateSelector(encodestr, i, false, tag);
                        tc.CellEditingTemplateSelector = new CellTemplateSelector(encodestr, i, true, tag);

                        columns.Add(tc);

                        headerStr[i] = encodestr;
                    }
                    ExcelGrid.ColumnHeaderHeight = linecount * 25;
                }
                else
                {
                    //AddPrefixRowID();

                    for (int i = 0; i < columnCount; ++i)
                    {
                        var str = (i + 1).ToString();

                        var tc = new DataGridTemplateColumn();
                        tc.Header = str;
                        tc.CellTemplateSelector        = new CellTemplateSelector(str, i, false, tag);
                        tc.CellEditingTemplateSelector = new CellTemplateSelector(str, i, true, tag);

                        columns.Add(tc);

                        headerStr[i] = str;
                    }
                    ExcelGrid.ColumnHeaderHeight = 25;
                }

                if (needChangeHead)
                {
                    // 头
                    for (int j = 0; j < MainWindow.instance.DiffStartIdx(); j++)
                    {
                        var row = sheet.GetRow(j);
                        if (row == null || !Util.CheckValideRow(row))
                        {
                            break;
                        }

                        var data = new ExcelData();
                        data.rowId   = row.RowNum;
                        data.tag     = Tag as string;
                        data.diffIdx = j;

                        data.column2diff = issrc ? status.column2diff1[0] : status.column2diff2[0];
                        data.diffstatus  = status.diffHead;

                        for (int i = 0; i < columnCount; ++i)
                        {
                            var cell  = row.GetCell(i);
                            var value = Util.GetCellValue(cell);
                            data.data[headerStr[i]] = new CellData()
                            {
                                value = value, cell = cell
                            };
                        }
                        if (!status.DiffMaxLineCount.TryGetValue(j, out data.maxLineCount))
                        {
                            data.maxLineCount = 1;
                        }

                        datas.Add(data);
                        data_maps[data.rowId] = data;
                    }
                }

                Dictionary <int, Dictionary <int, CellEditMode> > edited = issrc ? status.RowEdited1 : status.RowEdited2;

                for (int j = 0; j < status.diffSheet.Count; j++)
                {
                    int rowid = issrc ? status.Diff2RowID1[j] : status.Diff2RowID2[j];

                    // 修改过,或者是
                    if (edited[rowid].Count > 0 || status.diffSheet[j].changed)
                    {
                        var row = sheet.GetRow(rowid);

                        var data = new ExcelData();
                        data.rowId       = rowid;
                        data.tag         = Tag as string;
                        data.diffstatus  = status.diffSheet[j];
                        data.diffIdx     = j;
                        data.CellEdited  = edited[rowid];
                        data.column2diff = issrc ? status.column2diff1[rowid] : status.column2diff2[rowid];

                        data.data["rowid"] = new CellData()
                        {
                            value = (rowid + 1).ToString()
                        };
                        for (int i = 0; i < columnCount; ++i)
                        {
                            var cell = row != null?row.GetCell(i) : null;

                            var value = Util.GetCellValue(cell);
                            data.data[headerStr[i]] = new CellData()
                            {
                                value = value, cell = cell
                            };
                        }
                        if (!status.DiffMaxLineCount.TryGetValue(j, out data.maxLineCount))
                        {
                            data.maxLineCount = 1;
                        }

                        datas.Add(data);
                        data_maps[data.rowId] = data;
                    }
                }
            }
            ExcelGrid.ItemsSource = datas;

            CtxMenu.Items.Clear();
            var item = new MenuItem();

            item.Header = "行复制到" + (issrc ? "右侧" : "左侧");
            item.Click += Menu_CopyToSide;
            CtxMenu.Items.Add(item);
        }
Пример #2
0
        public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
        {
            ExcelData rowdata = item as ExcelData;

            if (rowdata != null)
            {
                var rowid = rowdata.rowId;

                Brush bg = Brushes.White;
                if (!isEditing)
                {
                    var rowdiff = rowdata.diffstatus;
                    if (rowdiff != null && rowdiff.diffcells.Count > ColumnID && ColumnID >= 0)
                    {
                        var        diffid     = rowdata.column2diff[ColumnID];
                        var        diffresult = rowdiff.diffcells[diffid];
                        DiffStatus status     = rowdiff.diffcells[diffid].Status;
                        //var src_rowdata = MainWindow.instance.excelGridData["src"];
                        //if (rowdata.tag == "dst" && status == DiffStatus.Equal && src_rowdata != null && src_rowdata.ContainsKey(rowid)) {
                        //    var cur_value = rowdata.data[Binder].value;
                        //
                        //    var src_value = src_rowdata[rowid].data[Binder].value;
                        //    if (cur_value != src_value) {
                        //        status = DiffStatus.Modified;
                        //    }
                        //}
                        var diff_detail = rowdiff.diffcell_details != null ? rowdiff.diffcell_details[diffid]:null;

                        switch (status)
                        {
                        case DiffStatus.Modified:
                            bg = Brushes.Yellow;
                            break;

                        case DiffStatus.Deleted:
                            // 列增删的时候不好处理,不显示影响的格子
                            if (rowdata.tag == "src")
                            {
                                bg = Brushes.Gray;
                            }
                            break;

                        case DiffStatus.Inserted:
                            // 列增删的时候不好处理,不显示影响的格子
                            if (rowdata.tag == "dst")
                            {
                                bg = Brushes.LightGreen;
                            }
                            break;

                        default:
                            if (rowdata.CellEdited != null && rowdata.CellEdited.ContainsKey(diffid) && rowdata.CellEdited[diffid] == CellEditMode.Self)
                            {
                                // 单元格修改
                                bg = new SolidColorBrush(Color.FromRgb(160, 238, 225));
                            }
                            break;
                        }
                        if (diff_detail != null && diff_detail.Count > 1)
                        {
                            FrameworkElementFactory stackPanel = new FrameworkElementFactory(typeof(StackPanel));
                            stackPanel.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal);
                            stackPanel.SetValue(StackPanel.BackgroundProperty, bg);
                            for (int i = 0; i < diff_detail.Count; ++i)
                            {
                                if (diff_detail[i] != null)
                                {
                                    var diff_cell = diff_detail[i];
                                    if (diff_cell.Status == DiffStatus.Deleted && tag == "dst")
                                    {
                                        continue;
                                    }
                                    if (diff_cell.Status == DiffStatus.Inserted && tag == "src")
                                    {
                                        continue;
                                    }
                                    FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBlock));
                                    var text = tag == "dst" ? diff_cell.Obj2.ToString() : diff_cell.Obj1.ToString();
                                    textBlock.SetValue(TextBlock.TextProperty, text);

                                    stackPanel.AppendChild(textBlock);
                                    if (diff_cell.Status == DiffStatus.Deleted)
                                    {
                                        textBlock.SetValue(TextBlock.TextDecorationsProperty, TextDecorations.Strikethrough);
                                    }
                                    else if (diff_cell.Status == DiffStatus.Inserted)
                                    {
                                        textBlock.SetValue(TextBlock.TextDecorationsProperty, TextDecorations.Underline);
                                    }
                                    if (diff_cell.Status != DiffStatus.Equal)
                                    {
                                        textBlock.SetValue(TextBlock.ForegroundProperty, System.Windows.Media.Brushes.Red);
                                    }
                                }
                            }

                            return(new DataTemplate()
                            {
                                VisualTree = stackPanel
                            });
                        }
                        else
                        {
                            FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBlock));
                            textBlock.SetValue(TextBlock.BackgroundProperty, bg);
                            textBlock.SetValue(TextBlock.TextProperty, rowdata.data[Binder].value);
                            return(new DataTemplate()
                            {
                                VisualTree = textBlock
                            });
                        }
                    }
                }
                else
                {
                    FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBox));
                    if (rowdata.data.ContainsKey(Binder))
                    {
                        textBlock.SetValue(TextBox.TextProperty, rowdata.data[Binder].value);
                    }
                    return(new DataTemplate()
                    {
                        VisualTree = textBlock
                    });
                }
            }

            return(new DataTemplate()
            {
                VisualTree = new FrameworkElementFactory(typeof(TextBlock))
            });
        }
Пример #3
0
        internal void refreshData()
        {
            var tag = Tag as string;

            var issrc = isSrc;

            FileGrid.Columns.Clear();

            var datas = new ObservableCollection <ExcelData>();

            if (DirectoryDifferWindow.instance.results != null)
            {
                var columns = FileGrid.Columns;

                var headstr = "filename";
                var column  = new DataGridTextColumn();
                column.Binding = new Binding(headstr);
                column.Header  = headstr;

                Style aStyle = new Style(typeof(TextBlock));
                // 传下去的参数,当渲染格子的时候,只知道行id,需要通过这里传参数知道列id
                var abinding = new Binding()
                {
                    Converter = new FileConvertToBackground(), ConverterParameter = new ConverterParamter()
                    {
                        columnID = 1, coloumnName = headstr
                    }
                };

                aStyle.Setters.Add(new Setter(TextBlock.BackgroundProperty, abinding));

                column.ElementStyle = aStyle;

                columns.Add(column);



                var results = DirectoryDifferWindow.instance.results;

                for (int j = 0; j < results.Count; j++)
                {
                    var res = results[j];
                    if (res.Status != DiffStatus.Equal)
                    {
                        var data = new ExcelData();
                        data.tag     = Tag as string;
                        data.diffIdx = j;
                        // data.diffstatus = results;
                        data.rowId = j;

                        var path     = res.Obj1 == null ? res.Obj2 : res.Obj1;
                        var filename = Path.GetFileName(path);

                        data.data["filename"] = new CellData()
                        {
                            value = filename
                        };

                        datas.Add(data);
                    }
                }
            }

            FileGrid.DataContext = datas;
        }