Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/275: Рейтинг темы: голосов - 275, средняя оценка - 4.79
 Аватар для am-wrag
11 / 11 / 2
Регистрация: 17.02.2011
Сообщений: 145

Работа с excel: Открытие, чтение, запись, сохранение книги

22.11.2011, 14:56. Показов 58167. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Приведите, если не сложно, пару примеров работы с excel. Создание, открытие книги/страницы, сохрание в информации в определенную ячейку, сохранение документа.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.11.2011, 14:56
Ответы с готовыми решениями:

Открытие книги Excel с паролем
Задал пароль для книги эксель. Пытаюсь подцепить и открыть Книгу в своем проекте и вывести данные в listview. вот код: Dim oExcel...

Чтение и сохранение записи из БД. При загрузке получить последнюю запись в БД
Здравствуйте! Визуал студио бейсик 2010, как при загрузки формы для заполнения базы данных, форма загружалась с новой записи и какой код...

Чтение, редактирование и запись данных из MS Excel
Доброго времени суток товарищи! Программирую на VB 2010 не долго, можно сказать на "вы". Подскажите пожалуйста как сделать...

24
 Аватар для dim2603
1 / 1 / 0
Регистрация: 19.09.2011
Сообщений: 51
22.11.2011, 15:03
Excle? Excele? Не знакомый софт. Или вы про MS Office | Excel?
0
 Аватар для am-wrag
11 / 11 / 2
Регистрация: 17.02.2011
Сообщений: 145
22.11.2011, 15:06  [ТС]
excel, офис, конечно, *.xls
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
22.11.2011, 15:24
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Class Form1
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim Exc As Object
        Exc = CreateObject("Excel.Application")
        Exc.Workbooks.Open("C:\1.xls").Activate()
        Exc.Cells(1, 1) = "ПРИВЕТ!"
        Exc.Rows(7).Insert(Shift:=-4121)
        Exc.ActiveWorkbook.Save()
        Exc.ActiveWorkbook.Close()
        Exc.Quit()
        Exc = Nothing
    End Sub
End Class
7
 Аватар для am-wrag
11 / 11 / 2
Регистрация: 17.02.2011
Сообщений: 145
22.11.2011, 15:35  [ТС]
Памирыч, а лист книги эксель где указывать?
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
22.11.2011, 15:39
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

1)Добавляем в референцы ссылку на Microsoft Excel 11 object library

далее:
VB.NET
1
2
3
4
Dim _excel as new microsoft.office.interop.excel.application
Dim _workbook as microsoft.office.interop.excel.workbook
_excel.visible=true'отображаем пустой эксель на экране
_workbook=excel.worcbooks.add()'cjplftv новую книгу на основе шаблона по-умолчанию. Если нужен конкретный шаблон, то в скобках указать полный путь к файлу, который будет шаблоном
итог: имеешь экземпляр экселя в переменной _excel и экземпляр книги _workbook. Делай с ними что хошь.
Активация нужного листа в книге:
VB.NET
1
_workbook.sheets(2).activate
активирует лист за номером 2 в книге.
Все остальное - см члены переменных _excel и _workbook. Плюс пользуйся макрорекордером, встроенным в эксель. Там синтаксис на 90% совпадет, ну разве что по мелочам поменяешь.

Еще: в самом начале мы добавили ссылку на библу экселя. Это называется "раннее связывание".
Можно было не добавлять. Тогда это позднее связывание. Тогда ситуация такая:
VB.NET
1
2
Dim _excel as object
Dim _workbook as object
если эксель запущен, можно подхватить активный экземпляр
VB.NET
1
_excel = getobject("Excel.Application")
или, если фрагмент выше в итоге останется nothing, можно создать новый
VB.NET
1
_excel = createobject("Excel.Application")
далее так же как и по первому примеру. Только нужно хорошо знать объектную модель экселя: члены не будут видны при написании кода.
Примерно так. За 100% корректность синтаксиса не ручаюсь - писал на коленке, но работаю с вордом и экселем часто, так что сильно не наопечатывался.
4
 Аватар для am-wrag
11 / 11 / 2
Регистрация: 17.02.2011
Сообщений: 145
24.11.2011, 14:48  [ТС]
Цитата Сообщение от Юпатов Дмитрий Посмотреть сообщение
1)Добавляем в референцы ссылку на Microsoft Excel 11 object library
Обьясни как.
Я так понял это через
VB.NET
1
Import ...
А здесь что именно писать?

Добавлено через 6 минут
Нашол где чо, только у меня Microsoft Excel 14 object library или здесь без разницы, прсото версия поновей?

Добавлено через 6 минут
От себя дабавлю что пример Памирыч не применим для стартового изучения, поскольку без импорта библиотеки не выскакивают подсказки с вариантами, а без этого лично мне очень тяжео разобраться.
0
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
24.11.2011, 14:58
Цитата Сообщение от am-wrag Посмотреть сообщение
не применим для стартового изучения
Согласен, но я отказался от библ, уж больно их не охота таскать за прогой.
Насчет стартового изучения - полностью за.
0
 Аватар для am-wrag
11 / 11 / 2
Регистрация: 17.02.2011
Сообщений: 145
24.11.2011, 17:27  [ТС]
Обьясните плиз чем отличаются обьекты
VB.NET
1
2
Dim книга As Workbook, book As _Workbook
Dim лст As Worksheet, lst As _Worksheet
Допустим просто Worksheet совершенно не подходит для работы, у него совершенно отсутвуют параметры в отличие от такогоже но с _
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
24.11.2011, 17:52
Цитата Сообщение от am-wrag Посмотреть сообщение
меня Microsoft Excel 14 object library
это у тебя просо офис поновее. Кажется 2010.

Цитата Сообщение от Памирыч Посмотреть сообщение
Согласен, но я отказался от библ, уж больно их не охота таскать за прогой
В данном случае и не надо таскать библу экселя с собой. Для этого в референцах параметр "копировать локально" ставим в false и все, библа не будет добавляться в пакет установки. А работать даже перетащенная, она без установленного экселя все равно не будет. Так что на конечной машине наличие экселя - обязательно.
Цитата Сообщение от Памирыч Посмотреть сообщение
Насчет стартового изучения - полностью за
Конечно, но можно пойти на хитрость:
1) в начале проектирования добавляем библу, пишем код, тестим.
2) На финише типы переменных, завязанные на эту библу, меняем на object, в референцах удаляем ссылку на библу.
Вуаля! Получаем в итоге позднее связывание с удобствами проектирования раннего.
2
 Аватар для am-wrag
11 / 11 / 2
Регистрация: 17.02.2011
Сообщений: 145
28.11.2011, 16:27  [ТС]
Почемуто после каждого сохраниения в процессах остается событие EXCEL.EXE, которое продолжает множится при последующих сохранениях.
В коде имеется
VB.NET
1
xls.ActiveWorkbook.Close() :  xls.Quit()
1
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
28.11.2011, 16:48
am-wrag, после закрытия программы процессы продолжают висеть?
0
 Аватар для Юпатов Дмитрий
1721 / 1208 / 228
Регистрация: 23.12.2010
Сообщений: 1,544
28.11.2011, 16:57
попробуй сделать после всего
VB.NET
1
xls.Dispose
потому как хоть ты эксель и закрыл, но переменная осталась.
Ручаться не стану, но вполне может помочь.
Однако это не очень красиво, т.к. снова использовать объект xls ты сможешь только после рестарта программы (уничтожаем саму переменную, а не значение)
1
 Аватар для am-wrag
11 / 11 / 2
Регистрация: 17.02.2011
Сообщений: 145
28.11.2011, 17:44  [ТС]
Цитата Сообщение от Памирыч Посмотреть сообщение
am-wrag, после закрытия программы процессы продолжают висеть?
Когда прога закрывается процессы пропадают. Заметил тут ещё такую чтуку: сохранять позволяет в эксель токлько первый раз, затем процесс сохранения не пашет...
1
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
28.11.2011, 17:59
Работа такого кода представлена на скрине, в ходе работы программы не было ни одной ошибки:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Class Form1
    Dim appExcel As Object
    Dim I As Integer = 0
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        appExcel = CreateObject("Excel.Application")
        appExcel.Workbooks.Open("C:\1.xls")
        appExcel.Visible = False
        With appExcel.ActiveSheet
            .Range("C" & I + 1).Value = "QWERTY" & I
        End With
        appExcel.Workbooks(1).Close(True)
        appExcel.Quit()
        I += 1
    End Sub
End Class
Миниатюры
Работа с excel: Открытие, чтение, запись, сохранение книги  
5
 Аватар для am-wrag
11 / 11 / 2
Регистрация: 17.02.2011
Сообщений: 145
29.11.2011, 12:47  [ТС]
Вот мои проекты, вроде отличий минимум... Код загрузки информации в лист бокс работает прекрасно(если не брать в расчет лишних процессoв). Код сохранения не сохраняет, ума не приложу почему...
Части кода отвечающие за передачу информации о контролах работают абсолютно верно, неодноркатно проверял. Проблема именно в процессе сохранения данных в эксель.

Код сохранения
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub SaveOpt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveOpt.Click
        SaveF.Filter = "Excele 2003 файл настроек (*.xls)|*.xls"
        SaveF.FileName = "Opt_XAR" : SaveF.ShowDialog()
        xls = New Microsoft.Office.Interop.Excel.Application
        Try
            книга = xls.Workbooks.Open(SaveF.FileName) : книга.Activate() : b = 0
        Catch
            книга = xls.Workbooks.Add : книга.Activate() : b = 1
        End Try
        лст = книга.Sheets(1) : c = 1
        For n = 0 To main.TabControl1.TabPages.Count - 1
            For i = c To c - 1 + main.TabControl1.TabPages(n).Controls.Count / 2
                лст.Cells(i, 1) = main.TabControl1.TabPages(n).Controls("LB" & i).Text
                лст.Cells(i, 2) = main.TabControl1.TabPages(n).Controls("TB" & i).Text
            Next
            If n = 0 Then c += 20 Else c += 30
        Next
        лст.Cells(1, 4) = main.Find_name.Text
        If b = 0 Then xls.ActiveWorkbook.Save() Else xls.ActiveWorkbook.SaveAs(SaveF.FileName)
        книга.Close(True) : xls.Quit()
    End Sub

Код загрузки
VB.NET
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
 Private Sub OpnOpt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpnOpt.Click
        table = Nothing
        table = New Data.DataTable
        table.Columns.Add("1") : table.Columns.Add("2")
        OpnF.Filter = "Файл настроек (*.xls)|*.xls"
        OpnF.FileName = "Opt_XAR"
        OpnF.ShowDialog()
        Try
            xls = New Microsoft.Office.Interop.Excel.Application
            книга = xls.Workbooks.Open(OpnF.FileName)
            лст = книга.Sheets(1)
            InX.Items.Clear() 
            For i = 1 To лст.UsedRange.Rows.Count
                InX.Items.Add(лст.Cells(i, 1).value2)
                If лст.Cells(i, 2).value2 Is Nothing Then
                Else
                    table.Rows.Add()
                    table.Rows.Item(c).Item(0) = лст.Cells(i, 1).value2
                    table.Rows.Item(c).Item(1) = лст.Cells(i, 2).value2                    
                End If
            Next
            книга.Close(True) : xls.Quit() : ind = 1            
        Catch
            ind = 0
        End Try
    End Sub


Добавлено через 1 час 48 минут
Забыл про обьявления
VB.NET
1
2
3
4
5
6
7
8
9
Imports System.Data
Imports System.IO
Imports Microsoft.Office.Interop.Excel
Public ind, x As Integer
    Dim xls As Application
    Dim книга As Workbook
    Dim лст As _Worksheet, c, b As Integer 
    Dim rng As Range
    Public table As Data.DataTable
1
18 / 18 / 2
Регистрация: 12.02.2013
Сообщений: 387
12.04.2016, 12:44
Памирыч, Добрый день! Очень мало инфы по exel для неопытных пользователей в интернете. Если не затрудник, не могли бы взглянуть на проблему?
с тем как записать и вывести значение + закрывание процесса я разобрался.... Но теперь не могу сдеать основное действие.
Нужно найти первую ячейку в столбике B2 по формату( любой цвет который введем, допустим черный)Найти- разукрасить в красный и выдать нам сообщение, причем ячеек может быть не 1 , что мы и спрашиваем в inputbox. В vba у меня получилось, а сюда перенести не могу..... Ошибка выскакивает на _Excel.xlFormulas, xlPart, xlByColumns..в общем уточняющих... Как верно нужно объявлять? Он пишет что они не относятся к _Excel

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        Dim _Excel As New Application 'Приложение Excel
        Dim Книга As Workbook = _Excel.Workbooks.Open("C:\Users\Stanislav\Desktop\test.xlsx", [ReadOnly]:=False) 'Открываем книгу
        Dim Лист As Worksheet = CType(Книга.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet) 'Первый лист книги
        Try
            _Excel.Range("B1").Select()
        With _Excel.Application.FindFormat.Font
            .Name = "Calibri"
            .FontStyle = "обычный"
            .Size = 11
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
 
            .Color = -1003520
            .TintAndShade = 0
        End With
        _Excel.Cells.Find(What:="", After:=_Excel.ActiveCell, LookIn:=_Excel.xlFormulas, LookAt:=
        _Excel.xlPart, SearchOrder:=_Excel.xlByColumns, SearchDirection:=_Excel.xlNext, MatchCase:=
        False, SearchFormat:=True).Activate()
        _Excel.ActiveCell.Value = "Привет"
Добавлено через 37 минут
Памирыч, нашел рабочий пример на англиццком, если поможете подогнать под мою задачу, было бы отлично.... как задать формат поиска, а не row искать.


VB.NET
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
Imports Excel = Microsoft.Office.Interop.Excel
 
Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim xlApp As New Excel.Application
        Dim xlWb As Excel.Workbook
        Dim xlsheet As Excel.Worksheet
        Dim lRow As Long = 0
 
        With xlApp
            .Visible = True
 
            '~~> Open workbook
            xlWb = .Workbooks.Open("c:\Sample.xlsx")
 
            '~~> Set it to the relevant sheet
            xlsheet = xlWb.Sheets("Sheet1")
 
            With xlsheet
                '~~> Check if there is any data in the sheet
                If xlApp.WorksheetFunction.CountA(.Cells) <> 0 Then
                    lRow = .Cells.Find(What:="*", _
                                  After:=.Range("A1"), _
                                  LookAt:=Excel.XlLookAt.xlPart, _
                                  LookIn:=Excel.XlFindLookIn.xlFormulas, _
                                  SearchOrder:=Excel.XlSearchOrder.xlByRows, _
                                  SearchDirection:=Excel.XlSearchDirection.xlPrevious, _
                                  MatchCase:=False).Row
                Else
                    lRow = 1
                End If
            End With
 
            MessageBox.Show("The last row in Sheet1 which has data is " & lRow)
 
            '~~> Close workbook and quit Excel
            xlWb.Close(False)
            xlApp.Quit()
 
            '~~> Clean Up
            releaseObject(xlsheet)
            releaseObject(xlWb)
            releaseObject(xlApp)
 
        End With
    End Sub
 
    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
End Class

Автор http://www.siddharthrout.com/2... rettyPhoto
1
Почетный модератор
 Аватар для Памирыч
23248 / 9160 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
12.04.2016, 13:02
ctac1412, Я не знаток Экселя, увы. Будет лучше, если Вы будете обращаться не к конкретным пользователям, а ко всем; не нужно указывать ники. И лучше создавать свои темы.
1
0 / 0 / 0
Регистрация: 12.07.2015
Сообщений: 2
24.08.2016, 19:45
Этот кусок кода реально помог почистить паразитные процессы Excel, остающиеся в системе.
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'~~> Clean Up
            releaseObject(xlsheet)
            releaseObject(xlWb)
            releaseObject(xlApp)
 
        End With
    End Sub
 
    Private Sub releaseObject(ByVal obj As Object)
        Try
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj)
            obj = Nothing
        Catch ex As Exception
            obj = Nothing
        Finally
            GC.Collect()
        End Try
    End Sub
Только вот этого кода почему-то было недостаточно.
VB.NET
1
2
xlApp.Quit()
xlApp=Nothing
ctac1412, Спасибо!
0
 Аватар для jkrnd
179 / 69 / 13
Регистрация: 22.12.2015
Сообщений: 2,648
06.12.2016, 11:09
Цитата Сообщение от Памирыч Посмотреть сообщение
Exc.Rows(7).Insert(Shift:=-4121)
а это для чего?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2016, 11:09
Помогаю со студенческими работами здесь

Чтение и запись информации с листа Excel
Ребята помогите пожалуста , у меня на форме 2 кнопки , кнопка-read и кнопка-write и ещё textbox. программа на vb.net 10 Как с помощью этих...

Работа с Excel: Открытие из ресурсов
Проблема в правильном открытие шаблона .xlsx находящийся в ресурсах приложения. Прикрепляю файл из меню ресурсов, прикрепляется как...

Работа с Excel. Ввод пароля книги
Прошу помочь с вопросом: Есть книга Excel с установленным паролем на ее открытие. Эта книга хранится в ресурсах программы, и в...

Запись в закрытую книгу Excel и аналогично чтение
Здраствуйте. Подскажите как можно записать данные в ексель не открывая файл, а потом при необходимости считать эти данные. Private...

Загрузка данных из Excel (только чтение из файла) и запись в БД
Загрузка данных из Excel (только чтение из файла) и запись в БД. Вопрос: как проще открыть в ASP.Net Excel-файл (самое главное), и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru