Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона / 10 сообщений из 10, страница 1 из 1
07.07.2021, 21:43
    #40082439
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
Друзья, помогите с экспортом в эксель или направьте в правильное русло.
Есть таблицы, которые созданы по подобию страниц в файле шаблона. Оригинальный файл содержит более 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
09.07.2021, 10:51
    #40082907
Swa111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
Архимедофф,

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

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

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

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

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

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

Т.Е. Как то так
Код: 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
12.07.2021, 13:38
    #40083362
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
Архимедофф,
а не проще ли импортировать таблицу без строки заголовков,затем вставить вырезанную в буфер строку заголовков,если необходимо их сохранить или "обозвать" как Вам надо
...
Рейтинг: 0 / 0
23.08.2021, 13:00
    #40092656
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
sdku,
Боюсь что не проще. Оригинальный файл могу выслать на почту, т.к. тут слишком мальникий размер можно приаттачить. Админам пора увеличить квоту хотя бы до мегабайта :). Более того, в файле могут быть поля (столбцы) с точками. Акс этого не любит.
...
Рейтинг: 0 / 0
23.08.2021, 15:01
    #40092695
Прогер_самоучка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Экспорт в XLS на основе шаблона, где нужно выполнить проверку имен полей запроса и шаблона
Архимедофф
Более того, в файле могут быть поля (столбцы) с точками. Акс этого не любит.
и что? Он их автоматом заменяет.
Акс не такой уж и тупой ;)

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


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