powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
10 сообщений из 10, страница 1 из 1
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
    #40082439
Друзья, помогите с экспортом в эксель или направьте в правильное русло.
Есть таблицы, которые созданы по подобию страниц в файле шаблона. Оригинальный файл содержит более 50 листов. Тут приаттачил легкое подобие. Задача заполнить экселевский файл на основе данных из этих таблиц. Они заполняются по определенному алгоритму...
Идея такая, что через функцию передается имя листа, который нужно заполнить. Это имя в 100% случаев буде совпадать с именем таблицы в БД, а вот поля некоторые могут иметь отличия . Это скорее исключения, связанное с тем, что некоторые символы в именах полей запрещены. И вроде все красиво можно вставлять через рекордсет xlSheet.Range("A3").CopyFromRecordset rst, но может измениться версия шаблона, например на какой-то странице появится новая колонка. И тогда данные могут съехать. Не соображу, как лучше организовать проверку имен полей из 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.
Private Sub ExportTetsShablon_Click()
Filling "strA"  ' передаем имя страницы, оно будет совпадать с таблицей в Access
End Sub


Function Filling(SheetName$)
Dim strSQL$, m%
Dim rst: Set rst = CreateObject("ADODB.Recordset")
Dim SQLFieldsCount% 'Количество полей в запросе
Dim SblFieldsCount% 'Количество колонок в шаблоне на SheetName$
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim sFileName$          ' имя с которым сохраним итоговый файл
Dim CountMySheet%   ' Количество страниц в файле шаблона
'Dim mysheet

Set xlApp = CreateObject("excel.Application")
Set xlBook = xlApp.Workbooks.Open("c:\Temp\Shablon_test.xlsx")  ' шаблон в оригинале сложный многостраничный с кодом VBA

For CountMySheet = 1 To xlBook.Worksheets.Count ' найдем нужный лист в книге, т.к. их много
    Set xlSheet = xlBook.Sheets(CountMySheet)
    'Debug.Print xlSheet.Name
    If xlSheet.Name = SheetName Then            ' сравниваем имя текущего листа с переданным SheetName$
        strSQL = "SELECT * from " & SheetName   ' если совпадает имя текущего листа с переданным SheetName$, то делаем запрос к таблице с таким же именем
        'Debug.Print strSQL
        Set rst = CurrentDb.OpenRecordset(strSQL)
        'xlSheet.Range("A3").CopyFromRecordset rst ' идеальный вариант, если SQL запрос будет 100% совпадать с шаблоном
        
        Debug.Print "Количество строк в запросе =" & rst.RecordCount
        
        SQLFieldsCount = rst.Fields.Count
        SblFieldsCount = xlBook.Sheets(SheetName).UsedRange.Columns.Count
        Debug.Print "Количество полей в запросе =" & SQLFieldsCount
        Debug.Print "Количество колонок в шаблоне на " & SheetName & " =" & SblFieldsCount
        
        ' в идеале количество полей должно совпадать
        If SQLFieldsCount >= SblFieldsCount Then    ' в теории полей в исходной таблице может быть больше, если она используется для разных шаблонов
            '------------------------------------------------
            ' далее необходимо вставить данные из запроса в те столбцы, наименования которых совпадают с шаблонными.
            ' имена столбцов находятся на каждой странице шаблона во второй строке
        End If
        rst.Close
    End If
Next CountMySheet
    

If Dir("c:\temp") <> "" Then MkDir ("c:\temp") ' если отсутсвует папка, то создадим
sFileName = "c:\temp\test_EXP_" & Date & "_" & "time_" & Format(Time, "hh-mm") & ".xlsx"
xlSheet.SaveAs sFileName ' сохраняем файл
xlBook.Close

Set rst = Nothing
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing

MsgBox "Готово!"
End Function
...
Рейтинг: 0 / 0
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
    #40082907
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Архимедофф,

в файле шаблона в первой строке где должны быть данные вписываете имена колонок, для быстроты поиска - строке можно присвоить имя по определенной маске, например
tablename.Recordset
дaлее в цикле перебириаете рэнжи, фильтруем только те что соответсвуют маске "*.Recordset", из них собираем список колонок, формируем запрос, а дальше как предложили copyfromrecordset.
Главное что бы не боло объединенных строк.

Таким образом может существоватт даже несколько версий одного отчета.
...
Рейтинг: 0 / 0
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
    #40083339
Swa111,
Дело в том, что первая строка в оригинальном шаблоне это объединенные ячейки. Да и вообще, сам файл шаблона предоставлен производителем оборудования. В нем более 70 страниц и много кода на VBA. Фактически заполнять можно только то, что разрешено.
...
Рейтинг: 0 / 0
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
    #40083351
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Архимедофф,

имелось ввиду первая строка с данными а не шапка.

Если файл нельзя менять (кроме данных) в таком случае рядом держать файл с метаинформацией на какую страницу какие поля вывести.

Плюс ввести понятие контрольных ячеек, при измении которых не давать построить отчет по данному метафайлу.

Если число столбцов фиксировано, то все столбцы в контрольные ячейки занести.

Т.Е. Как то так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
[контрольные ячейки]
a1=№ по порядку
b1=Наименование
[источник данных]
таблица=myTable
вставить_с_строки=2
число_столбцов=2
столбец1=A;rowNum
столбец2=B;Caption

в результате сначала сверяем контрольные точки, если все равны - строим запрос

Код: sql
1.
select rowNum, Caption from myTable;



и начиная с строки 2 разносим поля
...
Рейтинг: 0 / 0
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
    #40083362
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Архимедофф,
а не проще ли импортировать таблицу без строки заголовков,затем вставить вырезанную в буфер строку заголовков,если необходимо их сохранить или "обозвать" как Вам надо
...
Рейтинг: 0 / 0
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
    #40092656
sdku,
Боюсь что не проще. Оригинальный файл могу выслать на почту, т.к. тут слишком мальникий размер можно приаттачить. Админам пора увеличить квоту хотя бы до мегабайта :). Более того, в файле могут быть поля (столбцы) с точками. Акс этого не любит.
...
Рейтинг: 0 / 0
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
    #40092695
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Архимедофф
Более того, в файле могут быть поля (столбцы) с точками. Акс этого не любит.
и что? Он их автоматом заменяет.
Акс не такой уж и тупой ;)

По существу вопроса: можно завести темповую таблицу с именем листа с каким-либо префиксом, например, tmp_sheet1.
Заливать полностью содержимое листа в эту таблицу без указанию полей
Сравнивать первую строку темп таблицы с названиями и количеством столбцов с метаданными таблицы, в которую будем импортировать. Рекордсеты в помощь
Настраиваем импорт из темп таблицы в нужную.
...
Рейтинг: 0 / 0
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
    #40092808
Прогер_самоучка,
я не сомневаюсь в ваших способностях, судя по количеству сообщений :) Напишите мне на почту, в профиле указан адрес, я вышлю файл. Сейчас я использую всего 8 временных таблиц для заполнения много большего количества листов экселя-темплэйта. Хочу более универсальный инструмент сделать, т.к. у меня сейчас костыль, хотя и рабочий. Иногда легче и быстрее допилить запрос под новые нужды, чем сделать то, до чего не доходят руки или не хватает мозгов. :)
...
Рейтинг: 0 / 0
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
    #40092818
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Архимедофф,
А чё Вы не прислушаетесь к тому что говорят и создаете трудности\проблемы,которых нет, а затем пытаетесь их героически преодолевать (8 временных таблиц....Однако)
sdku
Архимедофф,
а не проще ли импортировать таблицу без строки заголовков,затем вставить вырезанную в буфер строку заголовков,если необходимо их сохранить или "обозвать" как Вам надо
Прогер_самоучка
По существу вопроса: можно завести темповую таблицу с именем листа с каким-либо префиксом, например, tmp_sheet1.
Заливать полностью содержимое листа в эту таблицу без указанию полей
Сравнивать первую строку темп таблицы с названиями и количеством столбцов с метаданными таблицы, в которую будем импортировать. Рекордсеты в помощь
Настраиваем импорт из темп таблицы в нужную.
Плюсы:
Всего одна строка кода (где можно указать диапазон\лист) + необходимое количество строк для "допиливания" в EXCEL(при необходимости)
...
Рейтинг: 0 / 0
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
    #40092833
Архимедофф, я бы завёл спецтаблицу спецификаций с полями "имя листа", "номер столбца", "имя поля" (может быть пустым).
В функции первым делом открываем Recordset на нужных записях, отсортированных по номеру столбца, в цикле по записям формируем строку с перечнем полей, где вместо пустого значения вставляем слово "Null", а затем вставляем это в SQL выражение и выполняем
Может быть даже не одну, а две таблицы, где в первой имя листа и адрес первой ячейки с данными, а в связанной все остальное.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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