예제 #1
0
        public Excel_Table CopyRows(string Filters = "*", int Colomn = 0, int Head = 0, string FileName = "")
        {
            string[] FilterList = Filters.Split(';'); // Разделяем фильтры
            FilterList = RemoveDouble(FilterList);    // Удалим повторы

            // Настройка прогрессбара
            Progress.Current.Position = 0;
            Progress.Current.Maximum  = Table_Height;
            Progress.Process          = "Поиск совпадений по файлу «" + Path.GetFileName(FileName) + "»";

            // Создаём список копируемых строк
            List <int> RowsCopy = new List <int>();

            // Копируем все заголовочные строки
            for (int i = 0; i < Head; i++)
            {
                RowsCopy.Add(i);
                Progress.Current.Position++;
                if (Progress.Abort)
                {
                    return(null);
                }
            }

            // Ищем совпадения по всем ячейкам
            foreach (string Filter in FilterList)
            {
                for (int i = 0; i < Table_Height; i++)
                {
                    Progress.Current.Position++;
                    for (int j = 0; j < Table_Width; j++)
                    {
                        // Если находим или если фильтр *, то помечаем строку как готовую к копированию и выходим.
                        if ((list[j, i] == Filter) || (Filter == "*"))
                        {
                            RowsCopy.Add(i);
                            break;
                        }
                    }
                }
            }

            //Создаём новую таблицу
            Excel_Table FilteredTable = new Excel_Table(Table_Width, RowsCopy.Count);

            // и скопируем все подходящие данные в новую таблицу
            for (int i = 0; i < RowsCopy.Count; i++)
            {
                for (int j = 0; j < Table_Width; j++)
                {
                    FilteredTable.list[j, i] = list[j, RowsCopy[i]];
                }
                if (Progress.Abort)
                {
                    return(null);
                }
            }

            return(FilteredTable);
        }
예제 #2
0
        public static Excel_Table LoadFromFile(string FileName)
        {
            //Открываем файл Экселя
            //Создаём приложение.
            Excel.Application ObjExcel = new Excel.Application();
            //Открываем книгу.
            Excel.Workbook ObjWorkBook = ObjExcel.Workbooks.Open(FileName, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
            //Выбираем таблицу(лист).
            Excel.Worksheet ObjWorkSheet;
            ObjWorkSheet = (Excel.Worksheet)ObjWorkBook.Sheets[1];

            var lastCell = ObjWorkSheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell);// Находим последнюю ячейку.

            // Создаём новый Excel_Table объект
            Excel_Table ET = new Excel_Table(lastCell.Column, lastCell.Row);

            // Настройка прогрессбара
            Progress.Current.Position = 0;
            Progress.Current.Maximum  = ET.Table_Width * ET.Table_Height + 2 * ET.Table_Height;
            Progress.Process          = "Считывание данных из файла «" + Path.GetFileName(FileName) + "»";

            for (int i = 0; i < ET.Table_Width; i++)                                  //по всем колонкам
            {
                for (int j = 0; j < ET.Table_Height; j++)                             // по всем строкам
                {
                    ET.list[i, j] = ObjWorkSheet.Cells[j + 1, i + 1].Text.ToString(); //считываем текст в строку
                    Progress.Current.Position++;
                    Application.DoEvents();

                    if (Progress.Abort)
                    {
                        ObjWorkBook.Close(false, Type.Missing, Type.Missing); //закрыть не сохраняя

                        //Удаляем приложение (выходим из экселя) - а то будет висеть в процессах!
                        ObjExcel.Quit();
                        return(ET);
                    }
                }
            }
            ObjWorkBook.Close(false, Type.Missing, Type.Missing); //закрыть не сохраняя

            //Удаляем приложение (выходим из экселя) - а то будет висеть в процессах!
            ObjExcel.Quit();

            Progress.Current.Done = ET.Table_Width * ET.Table_Height;

            return(ET);
        }
예제 #3
0
        private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            button4.Enabled = false;
            // Получаем данные о файлах
            string FileToOpen = Files_Directories.OpenFile("Открыть файл с исходными данными", "Файлы Excel (*.xlsx, *.xls)|*.xlsx;*.xls|Все файлы (*.*)|*.*");

            if (FileToOpen == null)
            {
                return;
            }
            string[] Filters = Files_Directories.OpenFiles("Открыть файлы с масками данных", "Файлы Excel (*.xlsx, *.xls)|*.xlsx;*.xls|Все файлы (*.*)|*.*");
            if (Filters == null)
            {
                return;
            }
            string OutDir = Files_Directories.OpenDirectory();

            if (OutDir == null)
            {
                return;
            }

            // Настройка ProgressBar
            Progress.Abort        = false;
            Progress.All.Position = 0;
            Progress.All.Maximum  = 1 + Filters.Count() + Filters.Count();
            Progress.Counting     = true;

            // Загружаем файлы в RAM
            Excel_Table Data = Excel_Table.LoadFromFile(FileToOpen);

            if (Progress.Abort)
            {
                return;
            }
            Progress.All.Position++;
            List <Excel_Table> FilterTables = new List <Excel_Table>();

            for (int i = 0; i < Filters.Count(); i++)
            {
                FilterTables.Add(Excel_Table.LoadFromFile(Filters[i]));
                if (Progress.Abort)
                {
                    return;
                }
                Progress.All.Position++;
            }



            // Обработка фильтров
            for (int i = 0; i < Filters.Count(); i++)
            {
                // Формируем список фильтров
                string FilterList = "";
                for (int j = 0; j < FilterTables[i].Table_Height; j++)
                {
                    FilterList += FilterTables[i].list[0, j] + ";";
                }
                if (Progress.Abort)
                {
                    return;
                }
                Excel_Table Res = Data.CopyRows(FilterList, config.Colomn, config.HeadRows);
                if (Progress.Abort)
                {
                    return;
                }
                Res.SaveToFile(OutDir + @"\" + Path.GetFileNameWithoutExtension(Filters[i]) + "_OUT.xlsx");
                Progress.All.Position++;
            }

            Progress.Counting = false;
            MessageBox.Show("Задание выполнено");
            button1.Enabled = true;
            button4.Enabled = true;
        }