Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Функции для работы с Excel из C# / 25 сообщений из 509, страница 1 из 21
04.12.2008, 18:23
    #35694602
.AleXo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
Предлагаю в этой теме выкладывать функции для работы с Excel (написанные собственноручно)...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
        public const string UID = "Excel.Application";
        object oExcel = null;
        object WorkBooks, WorkBook, WorkSheets, WorkSheet, Range, Interior;

        //КОНСТРУКТОР КЛАССА
        public Excel()
        {
            oExcel = Activator.CreateInstance(Type.GetTypeFromProgID(UID));
        }

        //ВИДИМОСТЬ EXCEL - СВОЙСТВО КЛАССА
        public bool Visible
        {
            set
            {
                if (false == value)
                    oExcel.GetType().InvokeMember("Visible", BindingFlags.SetProperty,
                        null, oExcel, new object[] { false });

                else
                    oExcel.GetType().InvokeMember("Visible", BindingFlags.SetProperty,
                        null, oExcel, new object[] { true });
            }
        }
        

        //ОТКРЫТЬ ДОКУМЕНТ
        public void OpenDocument(string name)
        {
            WorkBooks = oExcel.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, oExcel, null);
            WorkBook = WorkBooks.GetType().InvokeMember("Open", BindingFlags.InvokeMethod, null, WorkBooks, new object[] { name, true });
            WorkSheets = WorkBook.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, WorkBook, null);
            WorkSheet = WorkSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, WorkSheets, new object[] { 1 });
            // Range = WorkSheet.GetType().InvokeMember("Range",BindingFlags.GetProperty,null,WorkSheet,new object[1] { "A1" });
        }
        
        // НОВЫЙ ДОКУМЕНТ
        public void NewDocument()
        {
            WorkBooks = oExcel.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, oExcel, null);
            WorkBook = WorkBooks.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, WorkBooks, null);
            WorkSheets = WorkBook.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, null, WorkBook, null);
            WorkSheet = WorkSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, WorkSheets, new object[] { 1 });
            Range = WorkSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, WorkSheet, new object[1] { "A1" });
        }
        //ЗАКРЫТЬ ДОКУМЕНТ
        public void CloseDocument()
        {
            WorkBook.GetType().InvokeMember("Close", BindingFlags.InvokeMethod, null, WorkBook, new object[] { true });
        }
        //СОХРАНИТЬ ДОКУМЕНТ
        public void SaveDocument(string name)
        {
            if (File.Exists(name))
                WorkBook.GetType().InvokeMember("Save", BindingFlags.InvokeMethod, null,
                    WorkBook, null);
            else
                WorkBook.GetType().InvokeMember("SaveAs", BindingFlags.InvokeMethod, null,
                    WorkBook, new object[] { name });
        }

        // ЗАПИСАТЬ ЗНАЧЕНИЕ В ЯЧЕЙКУ
        public void SetValue(string range, string value)
        {
            Range = WorkSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty,
                null, WorkSheet, new object[] { range });
            Range.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, Range, new object[] { value });
        }

        //ОБЪЕДЕНИТЬ ЯЧЕЙКИ 
        // Alignment - ВЫРАВНИВАНИЕ В ОБЪЕДИНЕННЫХ ЯЧЕЙКАХ
        public void SetMerge(string range, int Alignment)
        {
            Range = WorkSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty,
                null, WorkSheet, new object[] { range });
            object[] args = new object[] { Alignment };
            Range.GetType().InvokeMember("MergeCells", BindingFlags.SetProperty, null, Range, new object[] { true });
            Range.GetType().InvokeMember("HorizontalAlignment", BindingFlags.SetProperty, null, Range, args);
        }

        //УСТАНОВИТЬ ОРИЕНТАЦИЮ СТРАНИЦЫ 
        //1 - КНИЖНЫЙ
        //2 - АЛЬБОМНЫЙ
        public void SetOrientation(int Orientation)
        {
            //Range.Interior.ColorIndex
            object PageSetup = WorkSheet.GetType().InvokeMember("PageSetup", BindingFlags.GetProperty,
                null, WorkSheet, null);

            PageSetup.GetType().InvokeMember("Orientation", BindingFlags.SetProperty,
                null, PageSetup, new object[] { Orientation });
        }

        //УСТАНОВИТЬ ШИРИНУ СТОЛБЦОВ
        public void SetColumnWidth(string range, double Width)
        {
            Range = WorkSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty,
                null, WorkSheet, new object[] { range });
            object[] args = new object[] { Width };
            Range.GetType().InvokeMember("ColumnWidth", BindingFlags.SetProperty, null, Range, args);
        }
        
        //УСТАНОВИТЬ ВЫСОТУ СТРОК
        public void SetRowHeight(string range, double Height)
        {
            Range = WorkSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty,
                null, WorkSheet, new object[] { range });
            object[] args = new object[] { Height };
            Range.GetType().InvokeMember("RowHeight", BindingFlags.SetProperty, null, Range, args);
        }

        //УСТАНОВИТЬ ВИД РАМКИ ВОКРУГ ЯЧЕЙКИ
        public void SetBorderStyle(string range, int Style)
        {
            Range = WorkSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty,
                null, WorkSheet, new object[] { range });
            object[] args = new object[] { 1 };
            object[] args1 = new object[] { 1 };
            object Borders = Range.GetType().InvokeMember("Borders", BindingFlags.GetProperty, null, Range, null);
            Borders = Range.GetType().InvokeMember("LineStyle", BindingFlags.SetProperty, null, Borders, args);
        } 

        //ЧТЕНИЕ ДАННЫХ ИЗ ВЫБРАННОЙ ЯЧЕЙКИ
        public string GetValue(string range)
        {
            Range = WorkSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty,
                null, WorkSheet, new object[] { range });
            return Range.GetType().InvokeMember("Value", BindingFlags.GetProperty,
                null, Range, null).ToString();
        }

        //УСТАНОВИТЬ ВЫРАВНИВАНИЕ В ЯЧЕЙКЕ ПО ВЕРТИКАЛИ
        public void SetVerticalAlignment(string range, int Alignment)
        {
            Range = WorkSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty,
                null, WorkSheet, new object[] { range });
            object[] args = new object[] { Alignment };
            Range.GetType().InvokeMember("VerticalAlignment", BindingFlags.SetProperty, null, Range, args);
        }

        //УСТАНОВИТЬ ВЫРАВНИВАНИЕ В ЯЧЕЙКЕ ПО ГОРИЗОНТАЛИ
        public void SetHorisontalAlignment(string range, int Alignment)
        {
            Range = WorkSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty,
                null, WorkSheet, new object[] { range });
            object[] args = new object[] { Alignment };
            Range.GetType().InvokeMember("HorizontalAlignment", BindingFlags.SetProperty, null, Range, args);
        }
...
Рейтинг: 0 / 0
04.12.2008, 18:41
    #35694645
vagner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
...
Рейтинг: 0 / 0
05.12.2008, 08:16
    #35695171
Ъй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
Классу не помешало бы заимплементить IDisposable соответствующим образом...

Первым делом мы испортим самолёты.
...
Рейтинг: 0 / 0
05.12.2008, 15:33
    #35696499
cho
cho
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
Как по мне, так лучше курить XML->XSLT...
Формирование происходит на порядок быстрее... Да и гемороиться только с файлом XSL...
...
Рейтинг: 0 / 0
07.12.2008, 21:28
    #35698767
Анатолий Иванов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
choКак по мне, так лучше курить XML->XSLT...
Формирование происходит на порядок быстрее... Да и гемороиться только с файлом XSL...
Тогда приведи примеры, как это делать также просто, как и с помощью кода, приведенного выше.
...
Рейтинг: 0 / 0
08.12.2008, 13:17
    #35699888
ZeusTheTrueGod
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
А ещё есть порт APACHE POI на микрософтовскую джаву под дотнетом
Там идёт редактирование файлов вообще без каких либо ОЛЕ
...
Рейтинг: 0 / 0
08.12.2008, 13:25
    #35699915
Ъй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
ZeusTheTrueGodна микрософтовскую джаву под дотнетом
Это речь про J#? Штука из разряда "родила царица в ночь не то сына, не то дочь". Как никто из мох знакомых джавовцев ее не использует (используют родную, sun'овскую), так никто из знакомых дотнентчиков ее не использует. Зачем нужно такое чудо природы - загадка.
...
Рейтинг: 0 / 0
08.12.2008, 14:50
    #35700196
ZeusTheTrueGod
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
на Apache.org есть проект POI, написанный на джаве, который позволяет напрямую работать с документами ворда и экселя(в их оригинальном формате, на в xml) без самого этого экселя или ворда, и проект написан на джаве
Если хочется вызывать его из дот нета, то можно найти порт этого проекта на джаву от микрософта
...
Рейтинг: 0 / 0
08.12.2008, 15:03
    #35700238
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
Ъй,

чудо природы было задумано для "облегчения перехода" с Java на c#
...
Рейтинг: 0 / 0
08.12.2008, 15:09
    #35700258
Ъй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
ИзопропилЪй,

чудо природы было задумано для "облегчения перехода" с Java на c#
вот именно, что "облегчения перехода" в кавычках
я перешел без особенных проблем и концептуальных вопросов за 2 недели: неделя чтения документации+неделя тестовых проектиков - потом пошел боевой код
...
Рейтинг: 0 / 0
08.12.2008, 18:07
    #35700840
.AleXo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
Насколько мне известно в этой теме выкладываем функции а не обсуждаем...
...
Рейтинг: 0 / 0
08.12.2008, 21:59
    #35701171
МСУ фбане
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
.AleXoНасколько мне известно в этой теме выкладываем функции а не обсуждаем...
Т.е., всем заткнуться и курить Ваш зловещий код?
...
Рейтинг: 0 / 0
09.12.2008, 11:08
    #35701941
new_black
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
Опробовал код! Всё супер пупер кроме одного, процесс exс`ля не выходит(не закрывается!!!!!!!!!).
Код: plaintext
1.
2.
3.
4.
5.
6.
Excel ex = new Excel();
ex.NewDocument();
ex.SetValue("A1", "Hi!");
ex.SetValue("B1", "Document");
ex.SaveDocument(Application.StartupPath + "\\Doc.xls");
ex.CloseDocument();
...
Рейтинг: 0 / 0
09.12.2008, 12:47
    #35702344
new_black
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
есть ещё баг!
Код: plaintext
1.
2.
3.
4.
5.
Excel doc = new Excel();
doc.OpenDocument(Application.StartupPath + "\\Doc.xls");
textBox1.Text = doc.GetValue("A1");
textBox2.Text = doc.GetValue("B2");
doc.CloseDocument();
при использовании этого кода, прога вылетает в этом месте!???!!!!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
public string GetValue(string range)
{
    Range = WorkSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty,
                null, WorkSheet, new object[] { range });
    return Range.GetType().InvokeMember("Value", BindingFlags.GetProperty,
                null, Range, null).ToString();
}

"В экземпляре объекта не задана ссылка на объект."
...
Рейтинг: 0 / 0
09.12.2008, 13:08
    #35702429
new_black
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
упс! сорри! мой касяк!
Код: plaintext
1.
textBox2.Text = doc.GetValue("B1");
...
Рейтинг: 0 / 0
11.12.2008, 17:26
    #35708922
.AleXo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
Первый релиз класса. Все дружно тестируем... :)
...
Рейтинг: 0 / 0
11.12.2008, 17:49
    #35709005
Andrey1306
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
а можно как то вместо указание ячейки типа


ex.SetValue("A1", "Hi!");


указывать строку колонку

перегрузить ex.SetValue("row:col", "Hi!");

и GetValue() точно так же
...
Рейтинг: 0 / 0
11.12.2008, 18:03
    #35709061
vagner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
Что выложил коллега .AleXo не читал, но, если в за основу был взят класс по приведенной мною ссылке, то я его дорабатывал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
		public Range this [ string sRange ]
		{
			get { return new Range ( Get ( "Range", new object [ ] { sRange } ) ); }
		}

		public Range Cell ( int Left, int Top ) { return this [ string.Format ( "{0}{1}", ParseColNum ( Left ), ( Top + 1 ).ToString ( ) ) ]; }
		public Range Column ( int Left ) { return this [ string.Format ( "{0}:{0}", ParseColNum ( Left ) ) ]; }
		public Range Row ( int Top ) { return this [ string.Format ( "{0}:{0}", ( Top + 1 ).ToString ( ) ) ]; }
		public Range Region ( int Left, int Top, int Right, int Bottom )
		{
			return this [ string.Format ( "{0}{1}:{2}{3}",
				ParseColNum ( Left ), ( Top + 1 ).ToString ( ),
				ParseColNum ( Right ), ( Bottom + 1 ).ToString ( ) ) ];
		}

		/// <summary>
		/// Переводит порядковый номер столбца в его буквенный эквивалент.
		/// </summary>
		public static string ParseColNum ( int ColNum )
		{
			StringBuilder sb = new StringBuilder ( );
			
			if ( ColNum <= 0 )  return "A";

			while ( ColNum != 0 )
			{
				sb.Append ( ( char ) ( 'A' + ( ColNum % 26 ) ) );
				ColNum /= 26;
			}

			return sb.ToString ( );
		}
...
Рейтинг: 0 / 0
11.12.2008, 21:01
    #35709339
немой
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
.AleXo
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
          //ВИДИМОСТЬ EXCEL - СВОЙСТВО КЛАССА
        public bool Visible
        {
            set
            {
                if (false == value)
                    oExcel.GetType().InvokeMember("Visible", BindingFlags.SetProperty,
                        null, oExcel, new object[] { false });

                else
                    oExcel.GetType().InvokeMember("Visible", BindingFlags.SetProperty,
                        null, oExcel, new object[] { true });
            }
        }


А смысл нагромождения?
может проще?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 public bool Visible
        {
            set
            {
                    oExcel.GetType().InvokeMember("Visible", BindingFlags.SetProperty,
                        null, oExcel, new object[] { value });
            }
        }
...
Рейтинг: 0 / 0
11.12.2008, 21:35
    #35709381
.AleXo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
немой,

тоже вариант :)
...
Рейтинг: 0 / 0
11.12.2008, 22:36
    #35709445
Функции для работы с Excel из C#
А я в детстве вообще говорил - кукументы
...
Рейтинг: 0 / 0
12.12.2008, 07:02
    #35709690
Ъй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
Вот не пойму я - чего тут придумывать? Обычный late binding, тема перетиралась уже сто раз. Если нужно что-то новое - записываем макрос, смотрим его, и реализуем нужный метод по аналогии. Просто кодинг.

Первым делом мы испортим самолёты.
...
Рейтинг: 0 / 0
12.12.2008, 09:43
    #35709865
.AleXo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
Ну если уж этот класс никому не нужен, ладно, тогда тему можно закрыть.
...
Рейтинг: 0 / 0
12.12.2008, 11:54
    #35710375
Andrey1306
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
.AleXoНу если уж этот класс никому не нужен, ладно, тогда тему можно закрыть.


Класс нужен и интересно !! Автору респект и уважуха.

ЗЫ.

Еще бы групировку осветили, ваабще бы классно было
...
Рейтинг: 0 / 0
12.12.2008, 12:58
    #35710626
.AleXo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функции для работы с Excel из C#
Andrey1306,

пострараюсь сделать группировку
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Функции для работы с Excel из C# / 25 сообщений из 509, страница 1 из 21
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]