Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/47: Рейтинг темы: голосов - 47, средняя оценка - 4.89
 Аватар для Zuikovod
21 / 15 / 6
Регистрация: 26.05.2019
Сообщений: 119

Импорт из Excel длинного текста (более 255 символов)

20.01.2020, 22:55. Показов 9778. Ответов 25

Студворк — интернет-сервис помощи студентам
Добрый день ув. форумчане!
Вопрос по импорту длинного текста из Excel. Опишу с чем столкнулся, возможно кому то время сэкономит. Детектив целый.
Импортировал с помощью встроенного макроса ИмпортЭкспортЭлектроннойТаблицы, все вроде хорошо было.
Но потом поступили жалобы на то что форма отражает обрезанный текст.
Начал разбираться.
Нужные поля заданы правильно -Memo (Длинный текст). Но не импортируется полностью весь текст и все тут - максимум 255 знаков.

Проблема раз:
Не знаю как, но при создании таблицы в формат поля закрадывается знак "@"
Вложение 1105700
Найти этого жучка тяжело. Заходишь в таблицу, а отображается 255 знаков. Даже копируешь содержимое и вставляешь куда нибудь, но в буфер попадает 255 знаков. Отловил через len(). Удивился len показывает 456 символов, а отображается 255.
Пожили мы некоторое время нормально и опять тоже самое. Потратил день.

Проблема два (посложнее вышло):
Откопал в чем проблема где то на ин. яз. форумах. В общем проблема в следующем.
При импорте драйвер майкрософт не смотря на то что поле длинный текст оценивает импортируемые данные по первым 8 строчкам. Если в них данные менее чем по 255 символов, то он расценивает их как короткий текст и все что дальше соответственно обрезается.
То же касается любых других типов данных. Если первые строчки содержат числа, а ниже пошел текст, то все равно что вы импортируете в текстовое поле, будет ошибка.
Пробовал решить через запрос SQL в таблицу Excel, но тот же самый эффект, поскольку один и тот же драйвер за это отвечает.
Пришлось, как говорят - "забить костыль"
Перед импортом в заголовок (нужных полей) записываю по 256 символов, а после импорта удаляю из таблицы.
В целом жить можно, но на открытие огромного Excel для записи в заголовок, тратится достаточно много время.

Кликните здесь для просмотра всего текста
Visual Basic
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
Function TestMyFunc()
Dim strSQL$
    Dim LngText$, LngTextArr$()
        Dim xlSheetName$
            Dim dbTableName$
                Dim xlFile$
                    Dim I%, a%
                       Dim app As Object
xlFile = Form_Главная_форма.ТекущаяПапкаКореньБД & "\Выгрузки из 1сУПП\ВыгрузкаДог.xls"
    dbTableName = "TestImport"
        xlSheetName = "TDSheet"
    I = 256 'длина текста
        ReDim LngTextArr(I)
            For a = LBound(LngTextArr) To UBound(LngTextArr) - 1
                LngTextArr(a) = "Y"
            Next
    LngText = Join(LngTextArr, "")
Set app = CreateObject("excel.application")
    With app
            .Workbooks.Open (xlFile)
            .Range("B1").Value = LngText
            .Range("H1").Value = LngText
            .ActiveWorkbook.Save
            .Quit
    End With
'    Debug.Print LngText
    Set app = Nothing
         CurrentDb.Execute "DELETE * FROM " & dbTableName
            strSQL = "INSERT INTO [" & dbTableName & "] SELECT * FROM [" & xlSheetName & "$] "
                strSQL = strSQL & "IN '" & xlFile & "' [Excel 12.0 Xml; hdr=no;IMEX=1] "
                    strSQL = strSQL & "WHERE [" & xlSheetName & "$].F3 IS NOT NULL"
        CurrentDb.Execute strSQL
        CurrentDb.Execute "DELETE * FROM " & dbTableName & " TestImport WHERE f2='" & LngText & "'"
End Function

Если у кого есть более удачные варианты решения проблемы, прошу Вас поделитесь пожалуйста.
Ну или может есть более быстрый вариант "костыля" записи в Excel.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.01.2020, 22:55
Ответы с готовыми решениями:

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

Текст, состоящий не более 255 символов, разбейте на строки длиной не более 50 символов в строке. Переносите только на ме
Текст, состоящий не более 255 символов, разбейте на строки длиной не более 50 символов в строке. Переносите только на месте пропусков,...

Текст, состоящий не более чем из 255 символов, разбить на строки длиной не более 50 символов в строке
Текст, состоящий не более чем из 255 символов, разбейте на строки длиной не более 50 символов в строке. Переносите только на месте...

25
1326 / 544 / 112
Регистрация: 29.03.2016
Сообщений: 1,324
20.01.2020, 23:13
?String(256,"Y")
Ну и кешировать ссылку на CurrentDb.

Как минимум.
1
Эксперт MS Access
 Аватар для Eugene-LS
13198 / 5892 / 1510
Регистрация: 05.10.2016
Сообщений: 16,530
20.01.2020, 23:16
Цитата Сообщение от Zuikovod Посмотреть сообщение
Если у кого есть более удачные варианты ...
Думаю вместо :
Visual Basic
1
2
3
4
5
6
    I = 256 'длина текста
        ReDim LngTextArr(I)
            For a = LBound(LngTextArr) To UBound(LngTextArr) - 1
                LngTextArr(a) = "Y"
            Next
    LngText = Join(LngTextArr, "")
Можно написать одну строку:
Visual Basic
1
    LngText = String (256, "Y")
...
Аппаздал!
1
1326 / 544 / 112
Регистрация: 29.03.2016
Сообщений: 1,324
20.01.2020, 23:22
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Аппаздал!
Зато расписал подробно, а я поленился.
0
Эксперт MS Access
 Аватар для Eugene-LS
13198 / 5892 / 1510
Регистрация: 05.10.2016
Сообщений: 16,530
20.01.2020, 23:27
Цитата Сообщение от Jamaica Посмотреть сообщение
Ну и кешировать ссылку на CurrentDb.
А можно поподробнее для меня?
Перечитал :
Application.CurrentDb method (Access) ...
И не понял "кешировать" ...
0
1326 / 544 / 112
Регистрация: 29.03.2016
Сообщений: 1,324
21.01.2020, 00:12
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
Private coll As New Collection
 
Public Sub Test()
    Dim i As Integer
    For i = 1 To 3
        coll.Add CurrentDb
    Next i
    For i = 1 To 3
        Debug.Print ObjPtr(coll(i))
    Next i
    Set coll = Nothing
End Sub
Подозреваю, каждый вызов приводит к созданию нового объекта DAO.Database.
Не?

Добавлено через 2 минуты
Что бы этого не происходило можно просто:
PureBasic
1
2
3
4
5
With CurrentDb
   .Execute...
   .Execute...
   .Execute...
End With
0
Эксперт MS Access
 Аватар для Eugene-LS
13198 / 5892 / 1510
Регистрация: 05.10.2016
Сообщений: 16,530
21.01.2020, 00:27
Цитата Сообщение от Jamaica Посмотреть сообщение
Подозреваю, каждый вызов приводит к созданию нового объекта DAO.Database.
Не?
Не, Судя по:
The CurrentDb method returns an object variable of type Database that represents the database currently open in the Microsoft Access window.
Думаю что аналогично CurrentProject ...
0
 Аватар для Zuikovod
21 / 15 / 6
Регистрация: 26.05.2019
Сообщений: 119
21.01.2020, 01:55  [ТС]
Убрал цикл. Перемудрил конечно :-(

Цитата Сообщение от Jamaica Посмотреть сообщение
With CurrentDb
Даже если и не нужно - сделал, хотя бы ради красоты записи...

Кликните здесь для просмотра всего текста
Visual Basic
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
Function TestMyFunc()
Dim strSQL$
    Dim LngText$
        Dim xlSheetName$
            Dim dbTableName$
                Dim xlFile$
                       Dim app As Object
xlFile = Form_Главная_форма.ТекущаяПапкаКореньБД & "\Выгрузки из 1сУПП\ВыгрузкаДог.xls"
    dbTableName = "TestImport"
        xlSheetName = "TDSheet"
    LngText = String(256, "Y")
Set app = CreateObject("excel.application")
    With app
            .Workbooks.Open (xlFile)
            .Range("B1").Value = LngText
            .Range("H1").Value = LngText
            .ActiveWorkbook.Save
            .Quit
    End With
'    Debug.Print LngText
    Set app = Nothing
            strSQL = "INSERT INTO [" & dbTableName & "] SELECT * FROM [" & xlSheetName & "$] "
                strSQL = strSQL & "IN '" & xlFile & "' [Excel 12.0 Xml; hdr=no;IMEX=1] "
                    strSQL = strSQL & "WHERE [" & xlSheetName & "$].F3 IS NOT NULL"
    With CurrentDb
            .Execute "DELETE * FROM " & dbTableName
            .Execute strSQL
            .Execute "DELETE * FROM " & dbTableName & " TestImport WHERE f2='" & LngText & "'"
    End With
End Function


Спасибо большое за подсказку! Основной вопрос остался.
0
Мы один, давай на "ты"
3858 / 1400 / 348
Регистрация: 16.06.2016
Сообщений: 3,298
21.01.2020, 04:06
Цитата Сообщение от Zuikovod Посмотреть сообщение
xlFile = Form_Главная_форма.ТекущаяПапкаКореньБД & "\Выгрузки из 1сУПП\ВыгрузкаДог.xls"
Такого обращения к форме следует избегать. Нужно обращаться к конкретному экземпляру из коллекции открытых форм, а не вообще к классу.
1
Эксперт MS Access
 Аватар для Eugene-LS
13198 / 5892 / 1510
Регистрация: 05.10.2016
Сообщений: 16,530
21.01.2020, 08:47
Цитата Сообщение от Zuikovod Посмотреть сообщение
xlFile = Form_Главная_форма.ТекущаяПапкаКореньБД & "\Выгрузки из 1сУПП\ВыгрузкаДог.xls"
Смотрите такой пример:
Visual Basic
1
2
3
    Debug.Print "Папка:         "; CurrentProject.Path
    Debug.Print "Имя файла:     "; CurrentProject.Name
    Debug.Print "Полн. Путь:    "; CurrentProject.FullName
В вашем случае:
Visual Basic
1
    xlFile =  CurrentProject.Path & "\Выгрузки из 1сУПП\ВыгрузкаДог.xls"
Или:
Visual Basic
1
    xlFile = Forms!("Главная_форма")!ТекущаяПапкаКореньБД & "\Выгрузки из 1сУПП\ВыгрузкаДог.xls"
1
 Аватар для Zuikovod
21 / 15 / 6
Регистрация: 26.05.2019
Сообщений: 119
21.01.2020, 12:05  [ТС]
Цитата Сообщение от Eugene-LS Посмотреть сообщение
xlFile = Forms!("Главная_форма")!ТекущаяПапкаКоре ньБД & "\Выгрузки из 1сУПП\ВыгрузкаДог.xls"
Вот по всем инструкциям в интернете должно так работать. Но почему то у меня ошибка...


Но зато работает вот так:
Visual Basic
1
Forms.Item("Главная_форма")!ТекущаяПапкаКореньБД
Благодарю, поправил у себя в базе все ссылки на вспомогательное поле
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
21.01.2020, 12:14
Цитата Сообщение от Zuikovod Посмотреть сообщение
Цитата Сообщение от Eugene-LS Посмотреть сообщение
xlFile = Forms!("Главная_форма").....
Вот по всем инструкциям в интернете должно так работать. Но почему то у меня ошибка...
Нет. Не должно работать.
Или скобки, или восклицательный знак.
Вместе - нет.

То есть,
Visual Basic
1
2
3
4
' или так
Forms!Главная_форма
' или так
Forms("Главная_форма")
1
Эксперт MS Access
 Аватар для Eugene-LS
13198 / 5892 / 1510
Регистрация: 05.10.2016
Сообщений: 16,530
21.01.2020, 16:28
Цитата Сообщение от Zuikovod Посмотреть сообщение
Но зато работает вот так:
Мой косяк! - признаю.
Не от незнания - от дремучей усталости до глюков ...
Не изобретайте "велосипедов" пожалуйста.

Метод обращения к полю открытой формы из кода (не из запроса):
Visual Basic
1
    Forms("Имя формы")!ИмяКонтролаВФорме
Добавлено через 2 минуты
Цитата Сообщение от Capi Посмотреть сообщение
' или так
Forms!Главная_форма
Уточняю малость ...
Только если нет пробелов в названии формы ...
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
21.01.2020, 16:52
Имена с пробелами заключаются в квадратные скобки.
И все.
0
Эксперт MS Access
 Аватар для Eugene-LS
13198 / 5892 / 1510
Регистрация: 05.10.2016
Сообщений: 16,530
21.01.2020, 17:00
Цитата Сообщение от Capi Посмотреть сообщение
Имена с пробелами заключаются в квадратные скобки.
+ ещё уточнение.
Верно!
Я восхищён вашими познаниями!
...
А если в названии формы уже есть квадратные скобки - то как?!

Capi, то есть в БД можно именовать объекты с пробелами , а при обращении к ним просто брать их имена в квадратные скобки ...
Так?
... Фантастика!
0
 Аватар для Zuikovod
21 / 15 / 6
Регистрация: 26.05.2019
Сообщений: 119
21.01.2020, 17:53  [ТС]
Цитата Сообщение от Zuikovod Посмотреть сообщение
Если у кого есть более удачные варианты решения проблемы, прошу Вас поделитесь пожалуйста.
Ну или может есть более быстрый вариант "костыля" записи в Excel.
Коллеги хотел вернуть тему в заданное русло :-)
1. Вопрос быстрого импорта, без зависимости от "умного" драйвера
2. Вопрос быстрой записи в ячейку Excel (возможно есть варианты без открытия книги? она достаточно тяжелая)
0
Модератор
Эксперт MS Access
6231 / 2909 / 707
Регистрация: 12.06.2016
Сообщений: 7,839
21.01.2020, 18:04
А разве в названии формы допускаются квадратные скобки?
Вроде нет.
Посмотреть сейчас не могу - нахожусь в метро.
Но позже уточню.
0
1326 / 544 / 112
Регистрация: 29.03.2016
Сообщений: 1,324
21.01.2020, 18:10
Лучший ответ Сообщение было отмечено Zuikovod как решение

Решение

Цитата Сообщение от Eugene-LS Посмотреть сообщение
The CurrentDb method returns an object variable of type Database that represents the database currently open in the Microsoft Access window.
Это утверждение не отменяет того факта, что возвращаемые объекты разные для каждого вызова метода,
хотя и "represents the database currently open in the Microsoft Access window".
Вообще говоря, выигрыша в скорости при кешировании практически нет,
но код более структурированный и более читабельный.

В попытке же ускорения можно попробовать такой финт:
SQL
1
2
3
SELECT Top 1 0, "Any", String(256,"Y") FROM msysObjects
UNION ALL
SELECT * FROM [...] IN ...
Попробовать не могу, не на чем.
1
 Аватар для Zuikovod
21 / 15 / 6
Регистрация: 26.05.2019
Сообщений: 119
21.01.2020, 18:21  [ТС]
Цитата Сообщение от Jamaica Посмотреть сообщение
SELECT Top 1 0, "Any", String(256,"Y") FROM msysObjects
Union All
SELECT * FROM [...] IN ...
Ага, идея понятна. Вечерком попробую. Отпишусь по результату
0
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
21.01.2020, 19:10
Цитата Сообщение от Eugene-LS Посмотреть сообщение
А если в названии формы уже есть квадратные скобки - то как?!
а кавычек там нет случайно до кучи?

Добавлено через 2 минуты
Цитата Сообщение от Zuikovod Посмотреть сообщение
возможно есть варианты без открытия книги?
без отображения на экране есть. А как тарелку в шкаф положить, не открывая шкаф ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.01.2020, 19:10
Помогаю со студенческими работами здесь

Readln не более 255 символов.
Как Readln'ом с клавиатуры ввести больше 256 символов?

Более 255 символов в поле
Всем добрый вечер. Обнаружилась очередная "странность" Access'а. Предыстория: одна из организаций открыла филиал в...

Как прочесть более 255 символов с клавиатуры?
Привет всем. Приложение консольное. Пытаюсь пользоваться read/readln, но коряво выходит. Нужно прочитать 1001 символ. :((( Помогите...

Переменная String более чем 255 символов
возможно ли в переменную типа string проставить значение болие чем 255 символов

Дана строка S длиной не более 255 символов
Дана строка S длиной не более 255 символов. Подсчитать количество содержащихся в ней цифр. Входные данные: ввести строку S с длиной...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru