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