Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
1

Сделать такой индексатор, чтобы можно было обращаться к ячейкам Excel

27.05.2014, 17:17. Показов 1161. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не могу сообразить как сделать такой индексатор, чтобы можно было обращаться к ячейкам экселя

C#
1
A1=5; D5=66; т.д.
вместо этой длинной требухи
C#
1
Book.Sheets[page].Range[FirstCell,EndCell].Value = "test";
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.05.2014, 17:17
Ответы с готовыми решениями:

Можно ли сделать так чтобы к классу можно было бы одновременно обращаться как к массиву
подскажите можно ли сделать так чтобы к классу можно было бы одновременно обращаться как к массиву?...

Где прописать открытие книги Excel, чтобы к ней можно было обращаться с разных форм
Где можно прописать открытие книги excel чтобы к ней можно было обращаться с разных форм. У меня в...

Как сделать правильно прогу в Excel-e, чтобы ее можно было продать?
знаю как написать процедурку, а вот как ее зацепить так, что бы можно было сделать продаваемый...

Установить права, чтобы можно было обращаться только к функциям
Здравствуйте, помогите пожалуйста, есть БД в Microsoft SQL Server, и есть приложение в Delphi 7....

11
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
27.05.2014, 18:23 2
C#
1
2
var A1 = Book.Sheets[page].Range[FirstCell,EndCell];
A1.Value = "test"
1
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
27.05.2014, 18:35  [ТС] 3
kolorotur, не пойдет , нужен индексатор

ибо

C#
1
2
var A1 = Book.Sheets[page].Range["A1"];
A1.Value = "test"

Для B1 снова писать?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
27.05.2014, 18:45 4
Цитата Сообщение от EVG-1980 Посмотреть сообщение
не пойдет
C#
1
2
var r = Book.Sheets[page].Range;
r["A1"].Value = "test";
2
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
27.05.2014, 18:54  [ТС] 5
kolorotur, уточню вопрос возможно ли сделать индексатор имени поля?

хочу объявить экземпляр класса и обращаться к ячейкам
C#
1
2
3
 myEcxel _Ecxel = new  myEcxel();
 _Ecxel.D555=5; //записали в эксель
   Console.Write(_Ecxel.A5);// вывели из экселя
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
27.05.2014, 19:02 6
EVG-1980, если вы хотите писать код подобным образом, то это говорит о том, что адреса ячеек у вас статические и известны на стадии компиляции. Потому не вижу причин, по которым не подходит первый предложенный мной вариант.
0
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
27.05.2014, 19:12  [ТС] 7
kolorotur, адреса ячеек не статические и зарание неизвестны конечно можно сделать

C#
1
 public object this[string index]    { } // через словарь
меня интересует как сделать динамическое (анонимное) имя поля возможно ли такое?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
27.05.2014, 19:30 8
Лучший ответ Сообщение было отмечено EVG-1980 как решение

Решение

Цитата Сообщение от EVG-1980 Посмотреть сообщение
меня интересует как сделать динамическое (анонимное) имя поля возможно ли такое?
Возможно, конечно, если вы пишете под .NET 4+ — надо лишь создать динамическую класс-обертку под интероп.
Что-то вроде этого:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System.Dynamic;
class DynamicRange: DynamicObject
{
    private readonly Worksheet sheet;
 
    public DynamicRange(Worksheet range)
    {
        this.sheet = range;
    }
 
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        try { result = sheet.Range[binder.Name].Value; return true; }
        catch { result = null; return false; }            
    }
 
    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        try { sheet.Range[binder.Name].Value = value; return true; }
        catch { return false; }            
    }
}
Использование:
C#
1
2
3
4
var sheet = new DynamicRange(Book.Sheets[page]);
sheet.A1 = "test";
 
string value = sheet.A1;
Не знаю, может в офисном интеропе это уже как-то из коробки есть — после четверки с офисным интеропом не работал.
1
192 / 199 / 82
Регистрация: 11.04.2013
Сообщений: 1,086
27.05.2014, 19:38  [ТС] 9
Под 3.5 никак ибо существует ряд серьезных причин в миллионы рублей не ставить win старше XP?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
27.05.2014, 19:42 10
Цитата Сообщение от EVG-1980 Посмотреть сообщение
Под 3.5 никак ибо существует ряд серьезных причин в миллионы рублей не ставить win старше XP?
.NET 4.0 прекрасно работает на XP со второго или третьего сервис пака.
0
307 / 284 / 102
Регистрация: 06.05.2014
Сообщений: 861
28.05.2014, 12:53 11
kolorotur,
Цитата Сообщение от kolorotur Посмотреть сообщение
надо лишь создать динамическую класс-обертку под интероп
Дико извиняюсь, но разве простой стринговый индексатор в данном случае не поможет:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public string this[string cellName]
{
    get
    {
        return Book.Sheets[page].Range[cellName].Value;
    }
    set
    {
        Book.Sheets[page].Range[cellName].Value = value;
    }
}
//...
objecName["A1"] = "new value";
Или же я не понял сабж?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
28.05.2014, 13:10 12
Цитата Сообщение от BozKurt Посмотреть сообщение
разве простой стринговый индексатор в данном случае не поможет
Цитата Сообщение от EVG-1980 Посмотреть сообщение
адреса ячеек не статические и зарание неизвестны конечно можно сделать
C#
1
public object this[string index] { } // через словарь
меня интересует как сделать динамическое (анонимное) имя поля возможно ли такое?
Сделать такой индексатор, чтобы можно было обращаться к ячейкам Excel

Я чо, я ничо. Спросили — ответил
0
28.05.2014, 13:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.05.2014, 13:10
Помогаю со студенческими работами здесь

Как оформить поля, чтобы к ним можно было обращаться из других классов?
Подскажите Вот у меня имеется код: Код C# public static double matrix; public static...

Как обращаться к ячейкам в DBGrid, чтобы записать их значения в формулу?
как обращаться к ячейкам в BDGrid? чтобы записать их значения в формулу

Как можно обращаться к ячейкам памяти, выделенными функцией malloc?
Сейчас прохожу курс CS50, там есть такой код: #include <cs50.h> #include <ctype.h> #include...

Как сделать такой TextBox, куда можно было бы вводить только определенные символы?
Как сделать такой TextBox, куда можно было бы вводитьтолько определенные символы? Например, только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru