Пример #1
0
        public static void SortDescending(ExcelTemplateView view, IBindingContextItem contextItem)
        {
            ITemplateDefinition templateDefinition = contextItem.ParentElement.ParentPart.TemplateDefinitionPart.Parent;
            ISorterDefinition   sortDefinition     = SortDefinitionFactory.CreateInstance(templateDefinition, contextItem.BindingDefinition, true, false);

            ExecuteSort(view, sortDefinition);
        }
        public AccessorParametersManager(ExcelTemplateView view, IEnumerable <object> parameters)
        {
            View       = view;
            Parameters = parameters;

            if (Parameters != null && Parameters.Any())
            {
                foreach (object param in Parameters)
                {
                    if (param is ExcelInterop.Range)
                    {
                        rangesToListen.Add(param as ExcelInterop.Range);
                    }
                    else if (param.GetType().GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable <>)))
                    {
                        Type       genericType                  = param.GetType().GetGenericArguments()[0];
                        MethodInfo convertCollection            = typeof(TypeConvertor).GetMethod("ConvertCollection").MakeGenericMethod(genericType);
                        IEnumerable <ExcelInterop.Range> ranges = convertCollection.Invoke(null, new object[] { genericType, param }) as IEnumerable <ExcelInterop.Range>;
                        rangesToListen.AddRange(ranges);
                    }
                }

                if (rangesToListen.Count > 0)
                {
                    ExcelInterop.Worksheet sheet = View.ViewSheet;
                    sheet.Change += OnParametersChanged;
                    ExcelApplication.ReleaseComObject(sheet);
                    sheet = null;
                }
            }
        }
 public ExcelNotityPropertyContext(IBindingContextItem contextItem, ExcelTemplateView view, KeyValuePair <int, int> param, bool changeColor = false)
 {
     ContextItem = contextItem;
     View        = view;
     Param       = param;
     ChangeColor = changeColor;
 }
Пример #4
0
        private ExcelTemplateView CreateView(ExcelInterop.Worksheet sheetContainer, string templateName, ExcelInterop.Worksheet sheetDestination, ExcelInterop.Range firstOutputCell, ExcelInterop.Range clearingCell)
        {
            if (sheetContainer == null)
            {
                throw new ArgumentNullException("Template container sheet is mandatory");
            }
            if (string.IsNullOrEmpty(templateName))
            {
                throw new ArgumentNullException("Template name is mandatory");
            }
            if (sheetDestination == null)
            {
                throw new ArgumentNullException("Template destination sheet is mandatory");
            }
            if (firstOutputCell == null)
            {
                throw new ArgumentNullException("Template first output cell is mandatory");
            }

            if (clearingCell == null)
            {
                try
                {
                    clearingCell = sheetContainer.Cells[1, 1];
                }
                catch
                {
                    throw new ArgumentException("The clearing cell value");
                }
            }

            ExcelInterop.Range range = sheetContainer.Cells.Find(string.Format(TEMPLATE_START_FORMAT, templateName), Type.Missing, ExcelInterop.XlFindLookIn.xlValues, ExcelInterop.XlLookAt.xlPart, ExcelInterop.XlSearchOrder.xlByRows, ExcelInterop.XlSearchDirection.xlNext, false);
            if (range == null)
            {
                throw new EtkException($"Cannot find the template '{templateName.EmptyIfNull()}' in sheet '{sheetContainer.Name.EmptyIfNull()}'");
            }

            string             templateDescriptionKey = $"{sheetContainer.Name}-{templateName}";
            TemplateDefinition templateDefinition     = bindingTemplateManager.GetTemplateDefinition(templateDescriptionKey);

            if (templateDefinition == null)
            {
                templateDefinition = ExcelTemplateDefinitionFactory.CreateInstance(templateName, range);
                bindingTemplateManager.RegisterTemplateDefinition(templateDefinition);
            }

            ExcelTemplateView view = new ExcelTemplateView(templateDefinition, sheetDestination, firstOutputCell, clearingCell);

            bindingTemplateManager.AddView(view);
            log.LogFormat(LogType.Debug, "Sheet '{0}', View '{1}'.'{2}' created.", sheetDestination.Name.EmptyIfNull(), sheetContainer.Name.EmptyIfNull(), templateName.EmptyIfNull());
            range = null;

            return(view);
        }
Пример #5
0
        /// <summary> Implements <see cref="IExcelTemplateManager.RemoveView"/> </summary>
        public void RemoveView(IExcelTemplateView view)
        {
            ExcelTemplateView excelView = view as ExcelTemplateView;

            if (excelView == null)
            {
                return;
            }

            RemoveViews(new IExcelTemplateView[] { view });
        }
Пример #6
0
        /// <summary> Implements <see cref="IExcelTemplateManager.ClearViews"/> </summary>
        public void ClearViews(IEnumerable <IExcelTemplateView> views)
        {
            if (views == null)
            {
                return;
            }

            views = views.Where(v => v != null);
            if (!views.Any())
            {
                return;
            }

            try
            {
                lock (syncRoot)
                {
                    if (ExcelApplication.IsInEditMode())
                    {
                        ExcelApplication.DisplayMessageBox(null, "'Clear views' is not allowed: Excel is in Edit mode", System.Windows.Forms.MessageBoxIcon.Warning);
                    }
                    else
                    {
                        using (new FreezeExcel(this.ExcelApplication.KeepStatusVisible))
                        {
                            foreach (IExcelTemplateView view in views)
                            {
                                ExcelTemplateView excelView = view as ExcelTemplateView;
                                if (excelView?.ViewSheet != null)
                                {
                                    try
                                    {
                                        excelView.ViewSheet.Unprotect(System.Type.Missing);
                                        excelView.Clear();
                                    }
                                    finally
                                    {
                                        excelView.ProtectSheet();
                                    }
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string message = "'Clear views' failed.";
                Logger.Instance.LogException(LogType.Error, ex, message);
                throw new EtkException(message, ex);
                //ExcelApplication.DisplayException(null, message, ex);
            }
        }
Пример #7
0
        private static void ExecuteSort(ExcelTemplateView view, ISorterDefinition sortDefinition)
        {
            view.SorterDefinition = sortDefinition;
            object currentDataSource = view.GetDataSource();

            ETKExcel.TemplateManager.ClearView(view);

            // We reinject the datasource to force the filtering
            view.CreateBindingContext(currentDataSource);
            //view.SetDataSource(currentDataSource);

            // RenderView the view to see the filering application
            ETKExcel.TemplateManager.Render(view);
        }
Пример #8
0
 /// <summary> Implements <see cref="IExcelTemplateManager.RenderDataOnly"/> </summary>
 public void RenderDataOnly(IEnumerable <IExcelTemplateView> views)
 {
     if (views == null)
     {
         return;
     }
     try
     {
         lock (syncRoot)
         {
             if (ExcelApplication.IsInEditMode())
             {
                 ExcelApplication.DisplayMessageBox(null, "'Render data only' is not allowed: Excel is in Edit mode", System.Windows.Forms.MessageBoxIcon.Warning);
             }
             else
             {
                 ExcelInterop.Range selectedRange = ExcelApplication.Application.Selection as ExcelInterop.Range;
                 using (new FreezeExcel(ExcelApplication.KeepStatusVisible))
                 {
                     foreach (IExcelTemplateView view in views)
                     {
                         ExcelTemplateView excelTemplateView = view as ExcelTemplateView;
                         if (excelTemplateView != null)
                         {
                             try
                             {
                                 excelTemplateView.ViewSheet.Unprotect(System.Type.Missing);
                                 excelTemplateView.RenderViewDataOnly();
                             }
                             finally
                             {
                                 excelTemplateView.ProtectSheet();
                             }
                         }
                     }
                 }
                 selectedRange?.Select();
             }
         }
     }
     catch (Exception ex)
     {
         string message = "'RenderDataOnly' failed.";
         Logger.Instance.LogException(LogType.Error, ex, message);
         throw new EtkException(message, ex);
         //ExcelApplication.DisplayException(null, message, ex);
     }
 }
Пример #9
0
 /// <summary> Implements <see cref="IExcelTemplateManager.AddView"/> </summary>
 public IExcelTemplateView AddView(ExcelInterop.Worksheet sheetContainer, string templateName, ExcelInterop.Worksheet sheetDestination, ExcelInterop.Range destinationRange, ExcelInterop.Range clearingCell)
 {
     try
     {
         lock (syncRoot)
         {
             ExcelTemplateView view = CreateView(sheetContainer, templateName, sheetDestination, destinationRange, clearingCell);
             RegisterView(view);
             return(view);
         }
     }
     catch (Exception ex)
     {
         string message = $"Sheet '{(sheetDestination != null ? sheetDestination.Name.EmptyIfNull() : string.Empty)}', cannot add the View from template '{(sheetContainer != null ? sheetContainer.Name.EmptyIfNull() : string.Empty)}.{templateName.EmptyIfNull()}'"; Logger.Instance.LogException(LogType.Error, ex, message);
         throw new EtkException(message, ex);
     }
 }
Пример #10
0
        /// <summary>
        /// Manage the contextual menus
        /// </summary>
        public IContextualMenu GetMenus(ExcelTemplateView view, Microsoft.Office.Interop.Excel.Range range, IBindingContextItem contextItem)
        {
            IBindingDefinition bindingDefinition = contextItem.BindingDefinition;

            if (bindingDefinition == null || !bindingDefinition.IsBoundWithData || bindingDefinition.BindingType == null)
            {
                return(null);
            }

            if (!((TemplateDefinition)contextItem.ParentElement.ParentPart.ParentContext.TemplateDefinition).CanSort)
            {
                return(null);
            }

            foreach (IContextualPart menuPart in sortSearchAndFilersMenu.Items)
            {
                ContextualMenuItem menuItem = menuPart as ContextualMenuItem;
                menuItem.SetAction(() => menuItem.MethodInfo.Invoke(null, new object[] { view, contextItem }));
            }
            return(sortSearchAndFilersMenu);
        }
Пример #11
0
        private void RegisterView(ExcelTemplateView view)
        {
            if (view == null)
            {
                return;
            }

            try
            {
                if (!viewsBySheet.ContainsKey(view.ViewSheet))
                {
                    viewsBySheet[view.ViewSheet] = new List <ExcelTemplateView>();

                    view.ViewSheet.Change            += OnSheetChange;
                    view.ViewSheet.SelectionChange   += OnSelectionChange;
                    view.ViewSheet.BeforeDoubleClick += OnBeforeBoubleClick;

                    ExcelInterop.Workbook book = view.ViewSheet.Parent as ExcelInterop.Workbook;
                    if (book != null)
                    {
                        book.SheetCalculate -= OnSheetCalculate;
                        book.SheetCalculate += OnSheetCalculate;

                        book.SheetActivate -= OnSheetActivation;
                        book.SheetActivate += OnSheetActivation;

                        book.SheetDeactivate -= OnSheetDeactivation;
                        book.SheetDeactivate += OnSheetDeactivation;

                        ExcelApplication.ReleaseComObject(book);
                        book = null;
                    }
                }
                viewsBySheet[view.ViewSheet].Add(view);
            }
            catch (Exception ex)
            {
                throw new EtkException("View registration failed", ex);
            }
        }
Пример #12
0
 public ExcelRootRenderer(ExcelTemplateView view) : base(null, view.TemplateDefinition, view.BindingContext, view.FirstOutputCell, null)
 {
     View          = view;
     RowDecorators = new List <ExcelElementDecorator>();
     //@@ sortAndFilterButton = new ExcelSortAndFilterButton(View);
 }
Пример #13
0
        override protected void RealExecute(IExcelTemplateView view)
        {
            ExcelTemplateView excelView = view as ExcelTemplateView;

            if (excelView.RenderedArea == null || excelView.Renderer == null)
            {
                StepsErrorMessages.Add("Rendered area must not be null");
                return;
            }

            // Header
            if (excelView.Renderer.HeaderPartRenderer == null || excelView.Renderer.HeaderPartRenderer.RenderedArea == null)
            {
                StepsErrorMessages.Add("Header rendered area must not be null");
            }
            else
            {
                if (excelView.Renderer.HeaderPartRenderer.Width != 4 || excelView.Renderer.HeaderPartRenderer.Height != 2)
                {
                    StepsErrorMessages.Add("Header rendered area must 2*1");
                }
                if (excelView.Renderer.HeaderPartRenderer.RenderedRange[1, 1].Value != "Shops")
                {
                    StepsErrorMessages.Add("Header Cell[1,1] must contains 'ID'");
                }
                if (excelView.Renderer.HeaderPartRenderer.RenderedRange[2, 1].Value != "ID")
                {
                    StepsErrorMessages.Add("Header Cell[2,1] must contains 'ID'");
                }
            }

            // Body
            if (excelView.Renderer.BodyPartRenderer == null || excelView.Renderer.BodyPartRenderer.RenderedArea == null)
            {
                StepsErrorMessages.Add("Body rendered area must not be null");
            }
            else
            {
                if (excelView.Renderer.BodyPartRenderer.Width != 4 || excelView.Renderer.BodyPartRenderer.Height != 4)
                {
                    StepsErrorMessages.Add("Body Rendered area must be 4*4");
                }
                if (excelView.Renderer.BodyPartRenderer.RenderedRange[1, 1].Value != 1)
                {
                    StepsErrorMessages.Add("Body First cell must contains '1'");
                }
                if (excelView.Renderer.BodyPartRenderer.RenderedRange[4, 4].Value != "Fourth Shop Reception Phone number")
                {
                    StepsErrorMessages.Add("Body Last cell must contains 'Fourth Shop Reception Phone number'");
                }
            }

            // Footer
            if (excelView.Renderer.FooterPartRenderer == null || excelView.Renderer.FooterPartRenderer.RenderedArea == null)
            {
                StepsErrorMessages.Add("Footer rendered area must not be null");
            }
            else
            {
                if (excelView.Renderer.FooterPartRenderer.Width != 4 || excelView.Renderer.HeaderPartRenderer.Height != 2)
                {
                    StepsErrorMessages.Add("Footer rendered area must 4*2");
                }
                if (excelView.Renderer.FooterPartRenderer.RenderedRange[1, 1].Value != "Footer")
                {
                    StepsErrorMessages.Add("Footer Cell[1,1] must contains 'Footer'");
                }
                if (excelView.Renderer.FooterPartRenderer.RenderedRange[2, 1].Value != "Shops")
                {
                    StepsErrorMessages.Add("Footer Cell[2,1] must contains 'Shops'");
                }
            }
        }
Пример #14
0
        public ExcelSortAndFilterButton(ExcelTemplateView templateView)
        {
            this.View = templateView;
            ExcelInterop.Worksheet worksheet = null;
            ExcelInterop.Shapes    shapes    = null;
            ExcelInterop.Shape     shape     = null;
            try
            {
                worksheet  = View.ViewSheet;
                OwnerRange = View.FirstOutputCell;
                Name       = $"ExcelBtn{Interlocked.Increment(ref cpt)}";
                shapes     = worksheet.Shapes;

                shape = (ExcelInterop.Shape)shapes.AddOLEObject("Forms.CommandButton.1",
                                                                Type.Missing,
                                                                false,
                                                                false,
                                                                Type.Missing,
                                                                Type.Missing,
                                                                Type.Missing,
                                                                OwnerRange.Left,
                                                                OwnerRange.Top,
                                                                20,
                                                                20);

                shape.Name = Name;
                object s = worksheet.GetType().InvokeMember(Name, BindingFlags.GetProperty, null, worksheet, null);
                commandButton = s as ExcelForms.CommandButton;


                commandButton.FontName  = "Arial";
                commandButton.Font.Size = 8;
                commandButton.Caption   = "S/F";
                commandButton.ForeColor = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red);

                commandButton.Click += () =>
                {
                    using (ExcelMainWindow excelWindow = new ExcelMainWindow(ETKExcel.ExcelApplication.Application.Hwnd))
                    {
                        //@@SortAndFilterManagement.DisplaySortAndFilterWindow(excelWindow, View);
                    }
                };
            }
            finally
            {
                if (shape != null)
                {
                    ExcelApplication.ReleaseComObject(shape);
                }
                if (shapes != null)
                {
                    ExcelApplication.ReleaseComObject(shapes);
                }
                if (worksheet != null)
                {
                    ExcelApplication.ReleaseComObject(worksheet);
                }

                shape     = null;
                shapes    = null;
                worksheet = null;
            }
        }
Пример #15
0
 public ExcelRequestDefinition(string name, string description, ExcelTemplateView view)
 {
     Name        = name;
     Description = description;
     View        = view;
 }
Пример #16
0
        /// <summary> Implements <see cref="IExcelTemplateManager.Render"/> </summary>
        public void Render(IEnumerable <IExcelTemplateView> views)
        {
            if (views == null)
            {
                return;
            }
            try
            {
                lock (syncRoot)
                {
                    if (ExcelApplication.IsInEditMode())
                    {
                        ExcelApplication.DisplayMessageBox(null, "'Render' is not allowed: Excel is in Edit mode", System.Windows.Forms.MessageBoxIcon.Warning);
                    }
                    else
                    {
                        ExcelInterop.Range selectedRange = ExcelApplication.Application.Selection as ExcelInterop.Range;
                        using (new FreezeExcel(ExcelApplication.KeepStatusVisible))
                        {
                            foreach (IExcelTemplateView view in views)
                            {
                                ExcelTemplateView excelTemplateView = view as ExcelTemplateView;
                                if (excelTemplateView != null)
                                {
                                    try
                                    {
                                        excelTemplateView.ViewSheet.Unprotect(Type.Missing);
                                        excelTemplateView.RenderView();

                                        if (!string.IsNullOrEmpty(view.SearchValue))
                                        {
                                            excelTemplateView.ExecuteSearch();
                                        }
                                        else
                                        {
                                            excelTemplateView.ManageExpander();
                                        }
                                    }
                                    finally
                                    {
                                        excelTemplateView.ProtectSheet();
                                    }
                                }
                            }
                        }
                        if (selectedRange != null)
                        {
                            selectedRange.Select();
                            //ExcelApplication.ReleaseComObject(selectedRange);
                            selectedRange = null;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string message = "'Render' failed.";
                Logger.Instance.LogException(LogType.Error, ex, message);
                throw new EtkException(message, ex);
                //ExcelApplication.DisplayException(null, message, ex);
            }
        }
Пример #17
0
        /// <summary> Implements <see cref="IExcelTemplateManager.RemoveViews"/> </summary>
        public void RemoveViews(IEnumerable <IExcelTemplateView> views)
        {
            if (views == null)
            {
                return;
            }

            try
            {
                lock (syncRoot)
                {
                    if (ExcelApplication.IsInEditMode())
                    {
                        ExcelApplication.DisplayMessageBox(null, "'Clear views' is not allowed: Excel is in Edit mode", System.Windows.Forms.MessageBoxIcon.Warning);
                    }
                    else
                    {
                        bool success = true;
                        foreach (IExcelTemplateView view in views)
                        {
                            ExcelTemplateView excelView = view as ExcelTemplateView;
                            if (view != null)
                            {
                                try
                                {
                                    ClearView(excelView);

                                    KeyValuePair <ExcelInterop.Worksheet, List <ExcelTemplateView> > kvp = viewsBySheet.FirstOrDefault(s => s.Value.FirstOrDefault(v => v.Equals(view)) != null);
                                    if (kvp.Key != null && kvp.Value != null && kvp.Value.Count > 0)
                                    {
                                        viewsBySheet[kvp.Key].Remove(excelView);
                                    }

                                    if (log.GetLogLevel() == LogType.Debug)
                                    {
                                        log.LogFormat(LogType.Debug, "View '{0}' from '{1}' removed.", excelView.Ident, excelView.TemplateDefinition.Name);
                                    }

                                    bindingTemplateManager.RemoveView(excelView);
                                }
                                catch (Exception ex)
                                {
                                    string message = "Remove View failed.";
                                    Logger.Instance.LogException(LogType.Error, ex, message);
                                    success = false;
                                }
                            }
                        }
                        if (!success)
                        {
                            throw new EtkException("No all views have been removed. Please check the logs.");
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                string message = "'Remove views' failed.";
                Logger.Instance.LogException(LogType.Error, ex, message);
                throw new EtkException(message, ex);
                //ExcelApplication.DisplayException(null, message, ex);
            }
        }
Пример #18
0
        private void BtnStartExcelWork_Click(object sender, RoutedEventArgs e)
        {
            // do stm
            if (MessageBox.Show("Excel 작업을 시작하시겠습니까?", "Question", MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.No)
            {
            }
            else
            {
                ExcelTemplateView.SelectAll();
                string templatePath = (string)ExcelTemplateView.SelectedItem;
                if (templatePath == null)
                {
                    MessageBox.Show("탬플릿 파일이 선택되지 않았습니다.", "Alert", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                if (ExcelWorkQueue.Count == 0)
                {
                    MessageBox.Show("회사 파일이 선택되지 않았습니다.", "Alert", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                foreach (ExcelWorkQueueDataStruct dataStruct in ExcelWorkQueue)
                {
                    if (dataStruct.jObjectList == null)
                    {
                        MessageBox.Show("회사가 선택되지 않았거나,\n중복된 파일을 선택했습니다.", "Alert", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                }

                int           c            = 1;
                List <string> workFailList = new List <string>();

                foreach (ExcelWorkQueueDataStruct dataStruct in ExcelWorkQueue)
                {
                    string extension = System.IO.Path.GetExtension(templatePath);
                    string savePath  = System.IO.Path.GetFullPath(dataStruct.PathInfo);
                    string filename  = System.IO.Path.GetFileNameWithoutExtension(dataStruct.PathInfo);

                    StringBuilder temp = new StringBuilder(savePath.Remove(savePath.LastIndexOf("\\"), savePath.Length - savePath.LastIndexOf("\\")));
                    temp.Append("\\작업");
                    DirectoryInfo di = new DirectoryInfo(temp.ToString());
                    if (di.Exists == false)
                    {
                        di.Create();
                    }
                    temp.Append("\\" + filename + "_수정" + extension);

                    savePath = temp.ToString();
                    Console.WriteLine(savePath);

                    WriteDebugLine("작업중입니다.. (" + c + "/" + ExcelWorkQueue.Count + ")");
                    UpdateWindow();

                    string ErrorCode = "";
                    ErrorCode = excelActivity.Work(dataStruct.PathInfo, templatePath, savePath, dataStruct.jObjectList);

                    if (ErrorCode != null)
                    {
                        //MessageBox.Show(ErrorCode, "Alert", MessageBoxButton.OK, MessageBoxImage.Warning);
                        WriteDebugLine(ErrorCode);
                        WriteDebugLine("작업이 비정상적으로 종료되었습니다.\n");
                        c++;
                        workFailList.Add(filename);
                        ExcelWorkFailView.Items.Add(savePath);
                        UpdateWindow();
                        continue;
                    }
                    else
                    {
                        ExcelWorkEndView.Items.Add(savePath);

                        WriteDebugLine("작업이 끝났습니다. (" + c + "/" + ExcelWorkQueue.Count + ")\n");
                        c++;
                    }
                }

                ClearAllCurrentQueueData(0);
                string temps = "";
                if (workFailList.Count == 0)
                {
                    temps = "없음";
                }
                foreach (string s in workFailList)
                {
                    temps += s;
                    temps += '\n';
                }
                MessageBox.Show("작업이 끝났습니다.\n" +
                                "작업 실패 리스트 : " +
                                temps, "Alert", MessageBoxButton.OK, MessageBoxImage.Warning);
                WriteDebugLine("================================\n");
            }
        }