2012-05-30 3 views
2

Я искал страницу поддержки microsoft Binding for Office automation servers with Visual C# .NET, чтобы попытаться создать рабочий лист Excel, заполнить его значениями в datatable и сохранить его на машине.Создание и заполнение листа excel с поздним связыванием

У меня есть реализация, которая использует раннюю привязку и просто петли через элементы, но я не знаю, как вы достигнете этого с поздним связыванием, и мне нужно иметь возможность встраивать типы Interop, чтобы сделать версия приложения независима в отношении MS Office.

Как бы добавить строки из данных в новый лист Excel с использованием позднего связывания?

ответ

1

Я бы рекомендовал написать интерфейс и абстрагировать шаг популяции данных и шаг excel. Таким образом, у вас может быть система, которая реализует раннее связывание с excel, чтобы делать что-то, а затем движок, который использует этот интерфейс для заполнения листа excel. Шаг 2 должен был бы написать вторую реализацию интерфейса, используя Late Binding, а не раннее связывание. Затем вы просто подставляете вторую реализацию для первого в свой код при создании интерфейса.

В коде вы должны создать только один объект, сам интерфейс. При его создании, хотя, вы можете назначить его как любой другой класс/реализации, который реализует этот интерфейс ... вот пример из моего кода:

ISpreadsheetControl SSInterface; 
if (conditionCheck()) 
    SSInterface = new ExcelImplementer(); 
else 
    SSInterface = new OpenOfficeImplementer(); 

я только когда-либо использовать 1 объект, SSInterface, при размещении данных или изменение настроек страницы и т. д. и т. д. ... независимо от того, что я реализовал ... но он может сделать это двумя разными способами, основанными на том, какой класс I назначен интерфейсу во время загрузки.

Что касается особенностей и подробностей о «как» ... Я нашел второй пример в ссылке, которую вы предоставили, чтобы быть очень полезной. Его все о Type и Invoke. Трудность будет отслеживать то, с чем вы работаете в любой момент времени. Это одна из вещей, из-за которой ей будет труднее работать, и хорошая причина сначала извлечь раннюю привязку. Таким образом, вы можете увидеть все имена методов, которые вам понадобятся, и их списки параметров при записи второго.

Я также хочу добавить следующее: очень простой и короткий ответ на ваш вопрос: «Сделайте это точно так же, как и вы». Вы просто меняете «как» вы вызываете метод, который заполняет данные. и вся остальная реализация перехвата excel вместе с ним.

UPDATE

Я думаю, что это может делать то, что вы ищете, хотя его достаточно грязный, что я бы рекомендовал положить его (обе операции на самом деле, можно назвать другой) в свой собственный отдельный метод, где-то ,

//Get a range object that contains the cell. 
Parameters = new Object[2]; 
Parameters[0] = iRow + 1; 
Parameters[1] = iCol; 
objRange_Late = objSheet_Late.GetType().InvokeMember("Cells", 
    BindingFlags.GetProperty, null, objSheet_Late, Parameters); 

//Write value in cell 
Parameters = new Object[1]; 
Parameters[0] = row[col.ColumnName]; 
objRange_Late.GetType().InvokeMember("Value", BindingFlags.SetProperty, 
    null, objRange_Late, Parameters); 

Я должен признать, что я не есть реализация, что я могу проверить это прямо сейчас, но в соответствии с того, что я знаю об этом, что должно работать. Если «Ячейки» не работают, я бы тоже тот же код с «Диапазон» ... Я действительно не знаю, принимает ли он числовой ввод или нет.

link to Cells property description (msdn)

Вы также можете исследовать, что вся система немного, он может помочь вам найти некоторые из вещей, которые вы могли бы искать.

Проведено тестирование Удаленное создание и тестирование вышеуказанного кода, оно отлично работает.

+0

Это шаг популяции данных, с которым я борюсь. С ранним связыванием это был простой случай: 'foreach (строка DataRow в dataTable.Rows) { iCol = 1; foreach (DataColumn col in dataTable.Columns) { wSheet.Cells [iRow + 1, iCol] = строка [col.ColumnName]; iCol ++; } iRow ++; } '}' } С поздним связыванием я пока не понимаю, как передать значения в конкретный столбец, используя что-то вроде 'wSheet.GetType(). InvokeMember (...)' Я сохраню возиться с ним и попробовать что-то. – mechaman64

+0

Ой, ты избил меня. Я просто написал одну и ту же функцию в значительной степени слово в слово: P Спасибо! – mechaman64