Excel 12.0 Взаимодействие, действующее случайным образом в Excel 2016 с использованием C # - PullRequest
0 голосов
/ 07 февраля 2019

Я написал приложение на C # с использованием Excel Interop 12.0, которое отлично работало в Excel 2007 и Excel 2010. Но оно работает случайным образом в Excel 2016. Иногда оно дает метод Activate класса Range error error.Когда я снова запускаю программу, все в порядке.Снова запускаю, выдает ошибку.Программа открывает около 30 рабочих книг и заполняет рабочую книгу из C #.Я использую Range.get_ReSize () и Range.Activate () во многих местах.Почему поведение случайное?Любая помощь приветствуется

xlWb.Activate(); 
xlWsSummary.Activate(); 
Excel.Range ra = xlWsSummary.UsedRange;//append to the last cell in the used range ra.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, System.Type.Missing).Activate(); 

Excel.Range Range; 
string cellToPaste = "A" + (xlApp.ActiveCell.Row + 1).ToString();//go to the next row 
Range = xlWsSummary.get_Range(cellToPaste, System.Type.Missing); 
Range = Range.get_Resize(1, index); 
Range.Value2 = data; 
Range.Font.Size = 8;//set the fontsize ```

1 Ответ

0 голосов
/ 08 февраля 2019

Я не уверен, что это именно то, что вам нужно, но вот пример кода, который работает через 2 книги Excel, каждая с одной таблицей, содержащей 6 чисел:

         A  B  C
       ----------
    1 |  3  4  5
    2 |  6  7  8

Эти данные копируются из каждой рабочей книги и добавляются к данным в сводной рабочей книге, создавая:

         A  B  C
       ----------
    1 |  3  4  5
    2 |  6  7  8
    3 |  3  4  5
    4 |  6  7  8

Наконец, следующая ячейка столбца «A» после выбора данных перед сохранением сводной рабочей книги:

string file = @"C:\Users\me\Desktop\Summary.xlsx";
List<string> fileData = new List<string>{@"C:\Users\me\Desktop\Book1.xlsx", 
                                         @"C:\Users\me\Desktop\Book2.xlsx"};      
Excel.Application xlApp = new Excel.Application();

// Open summary workbook and init data workbook and worksheet
Excel.Workbook xlWb = xlApp.Workbooks.Open(file);
Excel.Worksheet xlWsSummary = xlWb.Sheets[1];
Excel.Workbook xlWbData = null;
Excel.Worksheet xlWsData = null;

// Work through your data workbooks
for ( int i = 0; i < fileData.Count; i++ )
{
    // Open data workbook
    xlWbData = xlApp.Workbooks.Open(fileData[i]);
    xlWsData = xlWbData.Sheets[1];

    // Get specific range of data. I didn't use UsedRange in case only a subset of data is required
    string dataStart = "A1";
    string dataEnd = "C2";
    Excel.Range rangeSource = xlWsData.get_Range(dataStart, dataEnd);

    // Determine next available 'A' cell after used range in summary worksheet
    Excel.Range ra = xlWsSummary.UsedRange;
    Excel.Range rangeDest = ra.get_Range("A" + (ra.Rows.Count + 1));

    // Copy data from data workbook to summary workbook
    rangeSource.Copy(rangeDest);

    // Select the range just copied to the summary workbook and format as required
    Excel.Range rangeFormat = rangeDest.Resize[rangeSource.Rows.Count, rangeSource.Columns.Count];
    rangeFormat.Font.Size = 8;//set the fontsize ```
}

// Release data workbook objects and close before doing anything else
Marshal.ReleaseComObject(xlWsData);
xlWbData.Close();
Marshal.ReleaseComObject(xlWbData);

// Select next available cell in A column
xlWsSummary.Activate();
Excel.Range used = xlWsSummary.UsedRange;
Excel.Range next = xlWsSummary.get_Range("A" + (used.Rows.Count + 1));
next.Select();

// Save the file
xlWb.SaveAs(file);

// And, release!
Marshal.ReleaseComObject(xlWsSummary);
xlWb.Close();
Marshal.ReleaseComObject(xlWb);

Возможно, я не обработал освобождение объекта Excel должным образом, так что вам лучше разобраться в этом, и вызов Activate () выдает предупреждение о неоднозначности, но в противном случае, надеюсь, это поможет.

...