Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Сравнение листов Excel


Автор: Georgich 7.2.2012, 12:24
Приветствую.
Необходимо реализовать сравнение ячеек из листов из 2-х книг Excel (одна книга генерируется программой, другая - эталонная, лежит на диске). В каждой книге по 18 листов. Сейчас у меня такой код:
Код

        void ExportWorksheets()
        {
            Excel.Application XL = null;
            Excel.Workbook WB = null;
            Excel.Worksheet WS = null;

            try
            {
                XL = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") as Excel.Application;
                WB = XL.ActiveWorkbook;
                //WS = WB.Worksheets;
                WS = (Excel.Worksheet)WB.Worksheets[1];
            }
            catch { }
        }

Здесь я подключаюсь к запущенному Excel и получаю из него активную книгу и пока только один лист (последняя строка). Вопрос: как получить массив всех 18-ти листов, чтобы потом передать его на обработку для сравнения? И второй вопрос: как сравнивать ячейки листов между собой?
Спасибо.

Автор: LOPUH 8.2.2012, 13:08
Что именно вы хотите сравнить в ячейках?  Можно сравнивать параметры форматирования, значения. Чтобы обратиться к значению ячейки надо написать примерно так:
Код

// предположим, что в ячейках  у вас хранятся числовые значения и дополнительных преобразований не требуется
If Range("A1").Value >Range("b1").Value
// чего то там


Так как  Worksheets  есть ничто иное, как коллекция? входящая в состав объекта Workbook, то здесь для перебора всех листов отлично должен работать оператор foreach
Если вам удобнее обращаться по именам , то это выглядит примерно так:
Код

 WS = (Excel.Worksheet)WB.Worksheets("Лист1");

Автор: Georgich 8.2.2012, 15:14
В общем сделал так:
Код

            public Excel.Worksheet[] ExportWorksheets()
            {
                Excel.Application XL = null;
                Excel.Workbook WB = null;
                Excel.Worksheet[] WS = new Excel.Worksheet[19];
                Excel.Sheets WSS = null;
     
                try
                {
                    XL = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application") as Excel.Application;
                    WB = XL.ActiveWorkbook;
                    WSS = WB.Worksheets;
                    for (int i = 1; i <= WB.Worksheets.Count; i++)
                        WS[i] = WSS.get_Item(i) as Excel.Worksheet;
                }
                catch { }
     
                return WS;
            }
     
            public Excel.Worksheet[] SampleWorksheets()
            {
                Excel.Application XLsample = null;
                Excel.Workbook WBsample = null;
                Excel.Worksheet[] WSsample = new Excel.Worksheet[19];
                Excel.Sheets WSSsample = null;
     
                try
                {
                    XLsample = new Excel.ApplicationClass();
                    WBsample = XLsample.Workbooks.Open(TestConst.Sample, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing);
                    WSSsample = WBsample.Worksheets;
                    for (int i = 1; i <= WBsample.Worksheets.Count; i++)
                        WSsample[i] = WSSsample.get_Item(i) as Excel.Worksheet;
                }
                catch { }
     
                return WSsample;
            }
     
            void CompareExcelCells()
            {
                bool a;
                Excel.Worksheet[] wk = new Excel.Worksheet[19];
                Excel.Worksheet[] wk2 = new Excel.Worksheet[19];
                for (int i = 2; i < 19; i++)
                {
                    wk[i] = ExportWorksheets()[i];
                    wk2[i] = SampleWorksheets()[i];
     
                    for (int j = 1; j <= wk[i].UsedRange.Rows.Count; j++)
                        for (int k = 1; k <= wk[i].UsedRange.Columns.Count; k++)
                            if (System.Convert.ToString((wk[i].Cells[j, k] as Excel.Range).Value2) == System.Convert.ToString((wk2[i].Cells[j, k] as Excel.Range).Value2))
                                a = true;
                            else
                                a = false;
                }
            }


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)