private void click_Extract(object sender, EventArgs e)
        {
            int CardColumn        = 2;
            int TagColumn         = 4;
            int DescriptionColumn = 5;
            int SlotRowWidth      = 34;

            List <IO_Block> Selected_Cards = new List <IO_Block>();

            ListView.CheckedIndexCollection holder = lv_IOCards.CheckedIndices;

            foreach (int index in holder)
            {
                Selected_Cards.Add(IO_Blocks[index]);
            }

            Excel.Application ExcelApp = new Excel.Application();
            ExcelApp.Visible        = false;
            ExcelApp.ScreenUpdating = false;
            ExcelApp.EnableEvents   = false;

            Excel.Workbook ExcelWB = ExcelApp.Workbooks.Open(tb_Path.Text);
            ExcelApp.Calculation = Excel.XlCalculation.xlCalculationManual;
            Excel.Sheets ExcelSheets = ExcelWB.Sheets;

            foreach (IO_Block card in Selected_Cards)
            {
                int test = SlotRowWidth * Int32.Parse(card.slot) + 3;
                ExcelSheets[1].Cells[SlotRowWidth * Int32.Parse(card.slot) + 3, CardColumn].Value = card.partNumber;

                int portCount = 0;
                for (int i = 0; i < card.portDescriptions.Length; i++)
                {
                    if (!String.IsNullOrEmpty(card.portDescriptions[i]))
                    {
                        ExcelSheets[1].Cells[SlotRowWidth * Int32.Parse(card.slot) + 4 + portCount, DescriptionColumn].Value = card.portDescriptions[i];
                        portCount++;
                    }
                }
                ExcelApp.DisplayAlerts = false;

                Excel.Range rng = ExcelSheets[1].Range[ExcelSheets[1].Cells[SlotRowWidth * Int32.Parse(card.slot) + 4, DescriptionColumn], ExcelSheets[1].Cells[SlotRowWidth * Int32.Parse(card.slot) + 35, DescriptionColumn]];
                rng.Replace(@"\P", " ", Excel.XlLookAt.xlPart);
                rng.Replace(@" \P", " ", Excel.XlLookAt.xlPart);
                rng.Copy();

                ExcelSheets[1].Cells[SlotRowWidth * Int32.Parse(card.slot) + 4, TagColumn].PasteSpecial(Excel.XlPasteType.xlPasteValues, Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);

                rng = ExcelSheets[1].Range[ExcelSheets[1].Cells[SlotRowWidth * Int32.Parse(card.slot) + 4, TagColumn], ExcelSheets[1].Cells[SlotRowWidth * Int32.Parse(card.slot) + 35, TagColumn]];
                rng.Replace("  ", "_", Excel.XlLookAt.xlPart);
                rng.Replace(" ", "_", Excel.XlLookAt.xlPart);
                rng.Replace("-", "_", Excel.XlLookAt.xlPart);
                rng.Replace("SPARE", "", Excel.XlLookAt.xlPart);

                ExcelApp.DisplayAlerts = true;
            }
            ExcelWB.Worksheets[1].Cells[3, 2].Select();

            Autodesk.AutoCAD.Windows.SaveFileDialog sfd = new Autodesk.AutoCAD.Windows.SaveFileDialog("Save IO Export Excel file as:", "IOExport", "xlsm", "ExcelFiles", Autodesk.AutoCAD.Windows.SaveFileDialog.SaveFileDialogFlags.DoNotWarnIfFileExist);
            System.Windows.Forms.DialogResult       dr  = sfd.ShowDialog();

            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                ExcelWB.SaveAs(sfd.Filename, Type.Missing, Type.Missing, Type.Missing, true, false, Excel.XlSaveAsAccessMode.xlNoChange, Excel.XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);

                ExcelApp.EnableEvents   = true;
                ExcelApp.Visible        = true;
                ExcelApp.ScreenUpdating = true;
                ExcelApp.Calculation    = Excel.XlCalculation.xlCalculationAutomatic;

                ExcelWB.Unprotect();
                ExcelApp.Run("ExternalUpdate");
                ExcelWB.Protect();
                this.Close();
            }
            else
            {
                ExcelWB.Close(false, Type.Missing, Type.Missing);
                this.Close();
            }
        }
Пример #2
0
        /// <summary>
        /// Метод, который создает таблицу Excel, в которой содержится информация о текущих пользователях.
        /// </summary>
        /// <param name="path">Абсолютный путь к создаваемому файлу.</param>
        /// <param name="excelSheetName">Название создаваемого файла.</param>
        /// <param name="openFileAfterCreate">Необязательный параметр. Отвечает за открытие файла после его создания.</param>
        public async static void CreateExcelUserList(String path, String excelSheetName, Bool openFileAfterCreate = false)
        {
            String fullPath;

            if (!excelSheetName.EndsWith(".xlsx"))
            {
                excelSheetName += ".xlsx";
            }

            //Проверка на окончание пути.
            _ = path.EndsWith("\\") ? fullPath = path + excelSheetName :
                                                 fullPath = path + "\\" + excelSheetName;

            //Так как создание документа затрачивает много времени, этот алгоритм вынесен в отдельный поток.
            await Task.Run(() =>
            {
                //Создается "Процесс" Excel. Далее указывается количество страниц в будущем файле.
                Excel.Application appToWork   = new Excel.Application();
                appToWork.SheetsInNewWorkbook = ActualProfiles.Count;

                //Создается "Книга" (файл), в него сразу добавляется страница.
                //Далее эта страница записывается в отдельную переменную.
                //При работе с Excel индексация страниц начинается с 1.
                Excel.Workbook mainWorkbook      = appToWork.Workbooks.Add(1);
                Excel.Worksheet currentWorksheet = mainWorkbook.Worksheets.Item[1];

                for (int i = 0; i < ActualProfiles.Count; i++)
                {
                    //Так как страницы добавляются Справа -> Налево, то используем нестандартный индекс.
                    currentWorksheet.Name = ActualProfiles[ActualProfiles.Count - (i + 1)].Name;

                    //Заполняем ячейки будущей книги по их индексам.
                    currentWorksheet.Cells[1, 1] = "Имя Пользователя:";
                    currentWorksheet.Cells[2, 1] = "Количество Побед:";
                    currentWorksheet.Cells[3, 1] = "Количество Игр:";
                    currentWorksheet.Cells[4, 1] = "Количество Побегов:";
                    currentWorksheet.Cells[5, 1] = "Пол:";
                    currentWorksheet.Cells[6, 1] = "Дата Рождения:";

                    //Добавляем в следующий столбец значения этих Свойств.
                    currentWorksheet.Cells[1, 2] = ActualProfiles[ActualProfiles.Count - (i + 1)].Name + '.';
                    currentWorksheet.Cells[2, 2] = ActualProfiles[ActualProfiles.Count - (i + 1)].Wins + '.';
                    currentWorksheet.Cells[3, 2] = ActualProfiles[ActualProfiles.Count - (i + 1)].AllGames + '.';
                    currentWorksheet.Cells[4, 2] = ActualProfiles[ActualProfiles.Count - (i + 1)].Leaves + '.';
                    currentWorksheet.Cells[5, 2] = ActualProfiles[ActualProfiles.Count - (i + 1)].GetStringGender() + '.';

                    //Последней ячейкой является Дата Рождения. Сюда также записывается значение, но перед этим оно форматируется.
                    currentWorksheet.Cells[6, 2] = ActualProfiles[ActualProfiles.Count - (i + 1)].BirthTime.ToString("dd.MM.yyyy!");

                    //Настраиваем выравнивание текста в ячейках:
                    currentWorksheet.Range["B1", "B6"].HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;

                    //Выполняем выравнивание столбцов по размеру.
                    Excel.Range columnsToFit = currentWorksheet.UsedRange;
                    columnsToFit.Columns.AutoFit();

                    //Задаем стиль для границ между ячейками:
                    currentWorksheet.Range["A1", "B6"].Borders.LineStyle = Excel.XlLineStyle.xlDouble;
                    currentWorksheet.Range["A1", "B6"].Borders.Color     = Excel.XlRgbColor.rgbBlack;

                    //Здесь выполняется проверка на существование следующей итерации.
                    //Это нужно для избегания создания лишних страниц в файле.
                    if (i + 1 < ActualProfiles.Count)
                    {
                        currentWorksheet = mainWorkbook.Worksheets.Add();
                    }
                }

                //Защищаем документ от изменений:
                mainWorkbook.Protect("Checkers!");

                //Сохраняем созданный файл по указанному адресу.
                mainWorkbook.SaveAs(fullPath);

                //Описание завершения работы:
                if (!openFileAfterCreate)
                {
                    /*
                     * <——————————————————————————————————————————————————————————————————————————————————————————————————>
                     * |                                     !ОЧЕНЬ ВАЖНЫЙ МОМЕНТ!                                        |
                     * |——————————————————————————————————————————————————————————————————————————————————————————————————|
                     * | Здесь происходит завершение процесса "EXCEL.exe":                                                |
                     * | 1. Сначала мы закрываем саму "Рабочую Книгу" (файл);                                             |
                     * | 2. Затем мы закрываем ВСЕ Рабочие Книги (файлы), с которыми работал созданный процесс;           |
                     * | 3. И после этого, через метод Quit() мы завершаем работу процесса.                               |
                     * |——————————————————————————————————————————————————————————————————————————————————————————————————|
                     * | Если работу процесса не завершить, он останется работать на фоне, даже после закрытия программы. |
                     * <——————————————————————————————————————————————————————————————————————————————————————————————————>
                     */

                    mainWorkbook.Close(false);
                    appToWork.Workbooks.Close();
                    appToWork.Quit();
                }

                //Однако если пользователь решит сразу открыть окно с Excel-файлом, то принудительно завершать процесс не придется.
                else
                {
                    //Достаточно сделать его видимым, изменив свойство "Visible".
                    appToWork.Visible = true;
                }
            });
        }