Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Примеры формирования отчета в Excell из visual basic / 9 сообщений из 9, страница 1 из 1
02.02.2015, 09:16
    #38869054
Karlus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Примеры формирования отчета в Excell из visual basic
Доброго времени суток. Помогите, пожалуйста, своими наработками и советами.
Стоит задача формировать отчет в excell из программы, написаной на vb. Отчеты получаются достаточно большие по содержанию.
Сейчас сделал следующий вариант (см. ниже), но у него есть несколько недостатков:
1. достаточно медленно формируется отчет
2. Если во время формирования сделать активным окно экселя, то выскакивает ошибка.
3. нет прогресс бара при формировании отчета.
Область, куда вставлять данные и которую нужно размножать до необходимого количества называю как Lblock1
Ячейки, куда нужно вставлять информацию помечаю примечанием по названию столбца в sql запросе, который возвращает данные для отчета.
Может кто поделится своими наработками на данную тему. Очень нужно сделать стабильный и шустрый вариант.
Заранее всем огромное спасибо!
Код: vbnet
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.
 Sub PrintExcell(ByVal FTempl As String)
        Dim PathTemplate As String
        Dim PathTemp As String
        Dim Frep As String
        Dim XL As Object
        Dim LblockNum As String = "LBlock1"

        Dim Cn As String
        Dim I As Integer, J As Integer, X As Integer
        Dim cRow As Integer, cCol As Integer, mCol As Integer

        PathTemplate = "v:\Inversion\ufs\"
        PathTemp = "u:\Temp\"
        Frep = PathTemp & FTempl
        FTempl = PathTemplate & FTempl
        If Not My.Computer.FileSystem.FileExists(FTempl) Then
            MsgBox("Нет шаблона")
            Exit Sub
        Else
            If Check_Free_File(FTempl, Frep) = False Then
                Exit Sub
            Else
                If Not My.Computer.FileSystem.FileExists(Frep) Then
                Else

                    XL = ldObjExcel(Frep)
                    With XL
                        .Workbooks.Open(FileName:=Frep)
                        .Worksheets(1).Activate()
                        .ScreenUpdating = True
                        .Visible = False
                    End With

                    XL.Application.Range(LblockNum).Select()
                    cRow = XL.Selection.Row
                    mCol = XL.Application.Range(LblockNum).Columns.Count
                    If mCol > 100 Then mCol = 100
                    XL.ActiveSheet.Rows(cRow + 1 & ":" & cRow + 1).Select()
                    Dim Comm As New OleDb.OleDbCommand(Sql, Connect)
                    Dim DR As OleDbDataReader
                    DR = Comm.ExecuteReader()
                    I = 0
                    ReDim MRes(0, 0)
                    While DR.Read()
                        If I > 0 Then
                            XL.Selection.Insert()
                        End If
                        ReDim Preserve MRes(DR.FieldCount - 1, I)
                        For X = 0 To DR.FieldCount - 1
                            If IsDBNull(DR(X)) Then
                                MRes(X, I) = Nothing
                            Else
                                MRes(X, i) = DR(X)
                            End If
                        Next
                    End While
                    DR.Close()
                    DR = Comm.ExecuteReader()
                    I = 0
                    While DR.Read()
                        For cCol = 1 To mCol
                            Cn = ""
                            For J = 0 To DR.FieldCount - 1
                                If Not XL.ActiveSheet.Cells(cRow, cCol).Comment Is Nothing Then
                                    Cn = UCase(XL.ActiveSheet.Cells(cRow, cCol).Comment.Text)
                                End If
                                If Cn = UCase(DR.GetName(J)) Then
                                    If Not IsDBNull(DR.Item(J)) Then
                                        XL.ActiveSheet.Cells(cRow + I, cCol).Value = DR.Item(J)
                                    Else
                                        XL.ActiveSheet.Cells(cRow + I, cCol).Value = ""
                                    End If
                                End If
                            Next
                        Next
                        I = I + 1
                    End While
                    DR.Close()
                    DR = Nothing
                    Comm = Nothing
                    XL.visible = True
                End If
            End If
        End If
    End Sub
...
Рейтинг: 0 / 0
02.02.2015, 10:15
    #38869119
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Примеры формирования отчета в Excell из visual basic
Karlus1. достаточно медленно формируется отчета) По возможности формировать массив в памяти и потом вставлять на лист. Это быстрее, чем к каждой ячейке
б) Вставлять из БД с помощью CopyFromRecordset
в) Избавиться от Select: http://www.sql.ru/faq/faq_topic.aspx?fid=4344
г) Отключать ScreenUpdating на время формирования отчета
Karlus2. Если во время формирования сделать активным окно экселя, то выскакивает ошибка.не работать с ActiveWorkbook - Workbooks.Open возвращает ссылку на конкретную книгу. Не работать с Select (см. выше)Karlus3. нет прогресс бара при формировании отчета.Что мешает сделать?
...
Рейтинг: 0 / 0
02.02.2015, 10:53
    #38869164
Karlus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Примеры формирования отчета в Excell из visual basic
Shocker.Proв) Избавиться от Select: http://www.sql.ru/faq/faq_topic.aspx?fid=4344

Спасибо за инфу, сейчас переделаю.
Shocker.ProЧто мешает сделать?
А вот как это сделать? Взять за 100% количество строк массива и выводить в окно %% заполнения? Тут тогда вопрос как правильно создать это окно сообщения чтобы оно висело над экселем и все время обновлялось?
...
Рейтинг: 0 / 0
02.02.2015, 11:02
    #38869175
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Примеры формирования отчета в Excell из visual basic
KarlusСпасибо за инфу, сейчас переделаю.переделать надо не только пункт в. Как раз остальные пункты более эффективны.

KarlusА вот как это сделать? Взять за 100% количество строк массива и выводить в окно %% заполнения? Тут тогда вопрос как правильно создать это окно сообщения чтобы оно висело над экселем и все время обновлялось?А зачем ему вообще висеть над Экселем? Не показывай вообще Эксель, пока не готов отчет, показывай окно с прогресс-индикатором.

Кстати, почему в принципе выбран Interop, а не OpenXML SDK?
...
Рейтинг: 0 / 0
02.02.2015, 11:25
    #38869196
Karlus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Примеры формирования отчета в Excell из visual basic
Shocker.ProКстати, почему в принципе выбран Interop, а не OpenXML SDK?
Просто где-то взял пример, т.к. требовалось срочно реализовать формирование отчета. Но, т.к. сейчас размер отчетов и их количество увечилось и все встало на рельсы постоянного использования, вот и решил поспрашивать совета и идей у профессионалов. Может кто поделится идеями, опытом и кодом)
...
Рейтинг: 0 / 0
02.02.2015, 11:29
    #38869205
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Примеры формирования отчета в Excell из visual basic
Тогда лучше перейти на OpenXML SDK
Это если нужно формировать принципиально экселевский файл

Если это не принципиально, существует множество движков отчетов
...
Рейтинг: 0 / 0
02.02.2015, 11:59
    #38869260
Karlus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Примеры формирования отчета в Excell из visual basic
Shocker.ProТогда лучше перейти на OpenXML SDK
Это если нужно формировать принципиально экселевский файл
Если это не принципиально, существует множество движков отчетов
В том-то и дело что отчет нужен именно в эксель формировать.
Может есть примеры работы с OpenXML SDK?
Начал читать про него, но время время уйдет прилично, насколько я понял)
...
Рейтинг: 0 / 0
02.02.2015, 12:05
    #38869269
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Примеры формирования отчета в Excell из visual basic
KarlusМожет есть примеры работы с OpenXML SDK? есть, но не здесь, а в форуме по .NET. Здесь обсуждается Visual Basic, а не VB.NET
...
Рейтинг: 0 / 0
02.02.2015, 13:24
    #38869438
Karlus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Примеры формирования отчета в Excell из visual basic
Спасибо. Попробую там поспрашивать.
Если у кого есть примеры на vb по формированию отчетов в excell, поделитесь, пожалуйста. Может найдется альтернативное решение. пока изучаю OpenXML
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Примеры формирования отчета в Excell из visual basic / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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