Взаимодействие с Excel

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

FVG
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 28.05.2006 (Вс) 6:41

Взаимодействие с Excel

Сообщение FVG » 28.05.2006 (Вс) 9:36

В VB.Net 2005 к проекту добавил файл (заполненную таблицу Excel).
Как обратится к ячейке Excel (запись, чтение).
Перебрал все примеры из различных книг, в том числе и из MSDN -
ничего не идёт, одни ругательства.
FVG

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 29.05.2006 (Пн) 11:19

так уж прям все перебрал и не один не работает :roll:

AGGRESSOR
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 13.10.2005 (Чт) 10:09
Откуда: Мурманск

Сообщение AGGRESSOR » 05.06.2006 (Пн) 11:23

FVG
а как добавил?
я например не нахожу у себя в Project>Add Existing Item ... возможности добавить файл с расширением XLS

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 05.06.2006 (Пн) 11:31

Добавить то можно через "All Files *.*". Вопрос в том, зачем? С тем же успехом можно общаться с Excel файлом просто зная его путь через соответствующие библиотеки
Весь мир матрица, а мы в нем потоки байтов!

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 05.06.2006 (Пн) 13:10

AGGRESSOR писал(а):FVG
а как добавил?
я например не нахожу у себя в Project>Add Existing Item ... возможности добавить файл с расширением XLS


Ну, батенька, ставь VSTO.

А так, юзай COM
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

AGGRESSOR
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 13.10.2005 (Чт) 10:09
Откуда: Мурманск

Сообщение AGGRESSOR » 06.06.2006 (Вт) 8:01

Sebas
VS Tool for Office есть.
Но добавить в проект (темплэйт Windows Application) таблицу Excel так, чтоб с ней можно было работать, как с таблицей Office-проекта (темплэйт Excel Workbook) не получается.
то есть в Windows Application приходится писать:
Код: Выделить всё
Dim ex As Excel.Application
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
ex = CreateObject("Excel.Application")
wb = ex.Workbooks.Add
ws = wb.Worksheets(1)
ws.Range("A1").Value = "тут содержимое ячейки"
ex.Visible = True

а в Excel Workbook просто в любом месте проекта можно писать:
Код: Выделить всё
Globals.Лист1.Range("A1").Value = "тут содержимое ячейки"

и все ...
Вопрос в том можно ли добавить в проект Windows Application таблицу Excel со всеми листами и обращаться к ней так же просто как в проекте Excel Workbook?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 06.06.2006 (Вт) 8:45

Смысл? городить вместо нескольких строчек кода?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

AGGRESSOR
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 13.10.2005 (Чт) 10:09
Откуда: Мурманск

Сообщение AGGRESSOR » 06.06.2006 (Вт) 10:42

Sebas
смысл?
ну например я создаю новый документ в процедуре события Form_Load рисую там, ну скажем, заголовки столбцов ... а потом по событию Button_Click заполняю таблицу ... дык вот при каждом нажатии кнопки у меня создается в памяти новый EXCEL.EXE ... наверное я что-то неверно пишу?
в проектах Excel Workbook такой фигни нету ...

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 06.06.2006 (Вт) 10:51

AGGRESSOR
Ты явно что-то не то пишешь :roll:

AGGRESSOR
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 13.10.2005 (Чт) 10:09
Откуда: Мурманск

Сообщение AGGRESSOR » 06.06.2006 (Вт) 11:14

хм ... напряженно подумав :shock: я пришел к выводу что дело в
Код: Выделить всё
ex = CreateObject("Excel.Application")

вынес его в Load и поменял области действия переменных
Код: Выделить всё
Public Class Form1
    Public ex As Excel.Application
    Public wb As Excel.Workbook
    Public ws As Excel.Worksheet

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ws.Range("A1").Value = "номер раз"
        ex.Visible = True
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        ws.Range("A2").Value = "номер два"
        ex.Visible = True
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ex = CreateObject("Excel.Application")
        wb = ex.Workbooks.Add
        ws = wb.Worksheets(1)
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        ex.Visible = True
    End Sub

End Class

лишних EXCEL.EXE больше не плодится ...

temur
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.02.2005 (Чт) 21:17
Откуда: Georgia

Сообщение temur » 24.06.2006 (Сб) 14:17

С этим понятно но один экземпляр всетаки ведь остается висеть несмотря на то пользуешся ты им или нет.
Я думаю стоит его закрывть когда он не нужен

wb.Close()
ex.Close()

FVG
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 28.05.2006 (Вс) 6:41

Взаимодействие с Excel

Сообщение FVG » 26.06.2006 (Пн) 9:29

Добавил Excel к проекту: Project, Add Existing Item ..., Files of Type: All Files, E:\Excel2, Книга1. add. Требуется открыть существующий файл
не создавая нового.
FVG

AGGRESSOR
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 13.10.2005 (Чт) 10:09
Откуда: Мурманск

Сообщение AGGRESSOR » 27.06.2006 (Вт) 8:07

FVG
тогда так:

Код: Выделить всё
ex = CreateObject("Excel.Application")
wb = ex.Workbooks.Open ("D:\Книга.xls")
ws = ex.Workbooks("Книга.xls").Worksheets ("Лист 1")


причем файл Эксельки не надо добавлять в проект ... можно открыть любой файл.

AGGRESSOR
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 13.10.2005 (Чт) 10:09
Откуда: Мурманск

Сообщение AGGRESSOR » 27.06.2006 (Вт) 8:21

temur
Предполагалось что результатом работы программы будет помещение неких данных на лист в новой книге Excel ... если написать wb.close то Excel вполне законно попытается закрыть свежесозданную книжку с данными которые так хотел получить юзер. А если еще перед wb.close добавить wb.Saved=True, то юзер еще и офигенно удивится т.к. Excel не спросит его мнения на счет не сохраненных данных.

FVG
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 28.05.2006 (Вс) 6:41

Взаимодействие с Excel

Сообщение FVG » 27.06.2006 (Вт) 20:20

CreateObject - не создаёт ли новый объект?
FVG

AGGRESSOR
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 13.10.2005 (Чт) 10:09
Откуда: Мурманск

Сообщение AGGRESSOR » 28.06.2006 (Ср) 12:20

FVG
создает (это само приложение Microsoft Excel). И устанавливает связь с соответствующей библиотекой обьектов Excel чтоб получить доступ к свойствам и методам используемых обьектов Excel.

FVG
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 28.05.2006 (Вс) 6:41

Сообщение FVG » 28.06.2006 (Ср) 15:15

Требуется открыть существующий файл не создавая нового объекта.
FVG

AGGRESSOR
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 21
Зарегистрирован: 13.10.2005 (Чт) 10:09
Откуда: Мурманск

Сообщение AGGRESSOR » 30.06.2006 (Пт) 8:58

FVG
для чего? Считать данные? Или добавить/изменить?
В любом случае создавать обект Excel.Application придется т.к. это именно он осуществляет обмен данными с твоей прогой.

Если цель - чтение данных, то Excel можно потом уничтожить
Код: Выделить всё
ex.quit()

если ввод - можно дать юзеру позырить че получилось и принять решение сохранять/не сохранять
Код: Выделить всё
ex.visble=true

если его мнение не интересует
Код: Выделить всё
wb.save()
'или wb.saveas(всякие параметры сохранения)
ex.quit()


А просто открыть файл это FileOpen(). Но чтобы что-то сделать с книгой, в этом случае надо знать формат файла. :lol:

PetrOFFs
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 24.06.2006 (Сб) 15:50
Откуда: Омск

Сообщение PetrOFFs » 30.06.2006 (Пт) 9:04

Когда с помощю программы вносишь изменения в уже созданную книгу и после закрытия книги он выдаёт сообщение о сохранении.
Как зделать так чтобы это сообщение не появлялось и изменения сохранялись после закрытия книги!!!!!

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 30.06.2006 (Пт) 9:15

PetrOFFs писал(а):Когда с помощю программы вносишь изменения в уже созданную книгу и после закрытия книги он выдаёт сообщение о сохранении.
Как зделать так чтобы это сообщение не появлялось и изменения сохранялись после закрытия книги!!!!!


Код: Выделить всё

либо так (если первый раз сейвишь)
ActiveWorkbook.Saveas filename:="c:\1.xls"
все остальные:
ActiveWorkbook.Save
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 30.06.2006 (Пт) 13:10

FVG писал(а):Требуется открыть существующий файл не создавая нового объекта.


И кто же такие требования выставляет? Бугагагаг..))))))
Чтото подобное здесь я уже видел.... скачать файл не подключаясь к интернету? прочитать файл не открывая его? дадада, знаем, плавали)
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

FVG
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 28.05.2006 (Вс) 6:41

Взаимодействие с Excel

Сообщение FVG » 30.06.2006 (Пт) 13:41

Тут предлогают:Сначала Assembly.GetManifestResourceStream(), чтобы получить поток с данными ресурса, потом скормить этот поток компоненту, умеющему грузить Excel-евские файлы из потока, либо сохранить во временный файл и открыть его екселем.
FVG

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Взаимодействие с Excel

Сообщение Sebas » 30.06.2006 (Пт) 13:48

FVG писал(а):Тут предлогают:Сначала Assembly.GetManifestResourceStream(), чтобы получить поток с данными ресурса, потом скормить этот поток компоненту, умеющему грузить Excel-евские файлы из потока, либо сохранить во временный файл и открыть его екселем.


Чё?!?!? а что общего между Reflection и файлом Excel?!?!?!?!?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

PetrOFFs
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 24.06.2006 (Сб) 15:50
Откуда: Омск

Сообщение PetrOFFs » 30.06.2006 (Пт) 14:51

lord0n
ActiveWorkbook.SaveAs (filename:="c:\1.xls") такая команда применяется в Word'e

FVG
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 28.05.2006 (Вс) 6:41

Взаимодействие с Excel

Сообщение FVG » 30.06.2006 (Пт) 15:53

В данном случае Excel не является COM объектом (а не ресурс ли это ?)
FVG

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 30.06.2006 (Пт) 16:13

ЧТото в этой жизни я многих перестал понимать...
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

PetrOFFs
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 24.06.2006 (Сб) 15:50
Откуда: Омск

Сообщение PetrOFFs » 01.07.2006 (Сб) 6:43

Когда запускаеш программу и нажимаеш кнопку вставить открывается Excel вводятся данные после чего выдаётся такое сообщение:

An unhandled exception of type 'System.MissingMemberException' occurred in microsoft.visualbasic.dll
Additional information: Public member 'Saved' on type 'ApplicationClass' not found.

Сообщение отображается в окне где Можно нажать кнопки "Break" "Continue" "Help"

В кнопку я вставил код который должен сохранять Книгу:

appExcel.Saved()

Кто знает почему так?????

FVG
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 28.05.2006 (Вс) 6:41

Взаимодействие с Excel

Сообщение FVG » 01.07.2006 (Сб) 7:39

А через GetObject никак не получится?
FVG

PetrOFFs
Начинающий
Начинающий
 
Сообщения: 24
Зарегистрирован: 24.06.2006 (Сб) 15:50
Откуда: Омск

Сообщение PetrOFFs » 01.07.2006 (Сб) 8:37

FVG
То же самое!!

lord0n
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 845
Зарегистрирован: 30.06.2005 (Чт) 9:55
Откуда: Moskow

Сообщение lord0n » 01.07.2006 (Сб) 11:33

Совет:
открываете Excel, ставете макрос на запись, делаете нужные действия, останавливаете запись, заходите в макросы, копируете текст записанного макроса, вставляете в VB, дорабатываете напильником
Теория - это когда что-то не работает и известно почему.
Практика - это когда что-то работает, но неизвестно почему.
Нам удалось совместить теорию с практикой, теперь ничего не работает и неизвестно почему.

След.

Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 68

    TopList