Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить кол-во заполненных записей в Excel? При позднем связывании 
:(
    Опции темы
Landing
Дата 10.3.2010, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 1.7.2008

Репутация: нет
Всего: нет



Если использовать раннее связывание, то все понятно: 

Код

using Excel = Microsoft.Office.Interop.Excel; 
Sheet = (Excel._Worksheet)WorkBook.Worksheets.get_Item(1);
int usedRange = Sheet.UsedRange.Rows.Count


А как для позднего? Для кода:

Код

object Workbooks = Excel.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, Excel, null);
            object oWorkbook = Workbooks.GetType().InvokeMember("Open", BindingFlags.InvokeMethod, null, Workbooks, new object[] { xlsFile });
            object Workbook = Workbooks.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, Workbooks, new object[] { 1 });
            object Worksheets = oWorkbook.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, Workbook, null);
            object Worksheet = Worksheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, Worksheets, new object[] { 1 });

PM MAIL   Вверх
KelTron
Дата 10.3.2010, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 9
Всего: 38



И в чём сложность?...
Код

object range = Worksheet.GetType().InvokeMember("UsedRange", BindingFlags.GetProperty, null, Worksheet, null);
object rows = range.GetType().InvokeMember("Rows", BindingFlags.GetProperty, null, range, null);
int rowsCount = (int)rows.GetType().InvokeMember("Count", BindingFlags.GetProperty, null, rows, null);


Могу поделиться классом, который я использую для таких целей, с помощью него можно всё это сделать так:
Код

RObject excelApp = RObject.CreateObject("Excel.Application");
RObject book = excelApp.Get("Workbooks").Invoke("Open", filePath);
RObject sheet = book.Get("Worksheets")[1];

rowsCount = (int)sheet.Get("UsedRange").Get("Rows").Get("Count");



А вот и сам класс:
Код

public sealed class RObject
{
    private object instance;

    public static RObject CreateObject(string progID) 
    {
        Type appType = Type.GetTypeFromProgID(progID, true);
        return new RObject(Activator.CreateInstance(appType));
    }

    public static RObject GetActiveObject(string progID)
    {
        return new RObject(Marshal.GetActiveObject(progID));
    }

    private RObject(object instance) 
    {
        this.instance = instance;
    }

    public object Instance 
    {
        get 
        {
            return this.instance;
        }
    }

    public RObject Get(string propName, params object[] args)
    {
        CheckArgs(args);
        return new RObject(InvokeMember(this.instance, propName, BindingFlags.GetProperty, args));
    }

    public void Set(string propName, object value)
    {
        CheckArg(ref value);
        InvokeMember(this.instance, propName, BindingFlags.SetProperty, value);
    }

    public RObject this[params object[] args]
    {
        get 
        {
            return Get("Item", args); 
        }
    }

    public RObject Invoke(string methodName, params object[] args) 
    {
        CheckArgs(args);
        return new RObject(InvokeMember(this.instance, methodName, BindingFlags.InvokeMethod, args));
    }

    public void Release() 
    {
        Marshal.ReleaseComObject(this.instance);
        this.instance = null;
    }

    private object InvokeMember(object target, string name, BindingFlags flags,
        params object[] args) 
    {
        return target.GetType().InvokeMember(name, flags, null, target, args);
    }

    private void CheckArgs(object[] args) 
    {
        for (int i = 0; i < args.Length; ++i)
        {
            CheckArg(ref args[i]);
        }
    }

    private void CheckArg(ref object arg) 
    {
        RObject obj = arg as RObject;
        if (obj != null)
        {
            arg = obj.instance;
        }
    }

    public static explicit operator int(RObject obj)
    {
        return (int)obj.instance;
    }

    public static explicit operator bool(RObject obj)
    {
        return (bool)obj.instance;
    }

    public static explicit operator double(RObject obj)
    {
        return (double)obj.instance;
    }

    public static explicit operator string(RObject obj)
    {
        return obj.instance.ToString();
    }
}



Это сообщение отредактировал(а) KelTron - 10.3.2010, 11:27


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Landing
Дата 10.3.2010, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 1.7.2008

Репутация: нет
Всего: нет



KelTron, Доложил о вас модераторам. Такое поведение в форуме редко встретишь. Спасибо огромное! На все бы вопросы такие ответы! smile 

P.S. Доложил, потому, как нет возможности поставить +, может хоть они...

P.S.2. Вашу библиотеку обязательно скомпилю, а пока решил для себя проблему, переписыванием этого куска кода на VB smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.