Создание dbf с добавлением данных из Excel
Всем доброго времени суток!
Может и не сюда надо было писать но уже всю голову сломал как сделать. До сих пор не научусь с именами ничего делать только учить активно начал.и то на примерах..
Ситуация такая:
1. Есть Excel-файл со столбцом который содержит уникальный код клиента (пример-список кодов.xls)
2. Есть Excel-файл с 2 столбцами (пример-цены.xls), как вариант он может быть и dbf
Задача:
1.создать .dbf с именем pmp_IDCLIENT.dbf согласно "список кодов.xls"
2.внутри pmp_IDCLIENT.dbf создать 3 столбца и во 2 и 3 тупо скопировать данные из "цены.xls"
3.в первом столбце до конца протянуть код IDCLIENT согласно список кодов.xls
4. результат должен быть такой как pmp_10738640.dbf
4. save и close
это вообще реально? А то больше 850 файлов каждый понедельник вот так делать
Сразу говорю, если что то несложное и научился делать поглядывая на примеры (перебор по маске, в папках и прочей ерунды), то у меня затык как всегда с именем (больное мое место)
Работаю на Excel 2007, Excel 2003 и только сегодня уломал руководителя мне поставить Access 2003 (в нем вообще новорожденный младенец) .
VBA только начал изучать, так как понял что на работе очень сильно пригодится
Вложения
Примеры.rar (23.4 Кб, 29 просмотров) |
Создание XML-документа из имеющегося шаблона с добавлением вводимых данных
Добрый день! подскажите как будет выглядеть скрипт: запускаю, ввожу параметры в диалоговом окне.
Создание обработки для выгрузки данных в dbf: Ошибка создания файла
Всем добрый день! Пытаюсь написать обработку для выгрузки данных в dbf, нашла разные примеры. В.
Создание бланка заявки в Excel на основании данных из другого файла Excel
Всем доброго времени суток! Есть у меня такая задумка в Excel, может быть кто-нибудь сталкивался с.
Узнай как
В связи с тем, что начиная с MS Office 2007 прекращена поддержка чтения и сохранения листов в формате DBF, между тем во многих организациях России эта связь между Excel и dbf все еще необходима.
Базы данных формата dbf всё еще поддерживает популярная бухгалтерская программа 1С, во многих организациях также до сих пор используются решения на Foxpro.
Есть несколько способов как обойти эту проблему.
1 СПОСОБ
1. Открыть MS Access 2010 или MS Access 2007.
2. Создать новую базу данных нажать "Новая база данных".
3. На вкладке "Внешние данные" нажать кнопку "Excel", импортировать данные из файла Excel.
4. Выбрать файл и нажать "ОК".
5. Нажать "Далее".
6. Поставить галочку "Первая строка содержит заголовки столбцов" и нажать "Далее".
7. Проверить тип данных в столбцах, если необходимо поменять тип и нажать "Далее".
8. Поставить галочку "Не создавать ключ" и нажать "Далее".
9. Задать имя таблицы и нажать "Готово".
10. Нажать кнопку "Закрыть".
11. На закладке "Внешние данные" во вкладке "Экспорт" нажать "Дополнительно" и выбрать "Файл dBase".
12. Выбрать версию dBase и нажать "ОК".
13. Нажать кнопку "Закрыть".
14. В той же директории, где находится файл Excel, появилась таблица dbf.
2 СПОСОБ
Применим пакет компенсирующий сознательное решение Microsoft прекратить поддержку DBF начиная с MS Office 2007, 2010.
1. Скачать архив содержащий библиотеку zjvcst.dll и надстройку Dbf_Operations.xla>>>
2. Скопировать из архива файл zjvcst.dll в папку %SYSTEMROOT% (C:\Windows).
3. Скопировать из архива файл Dbf_Operations.xla
в C:\Program Files\Microsoft Office\Office\Library для MS Office 97
в C:\Program Files\Microsoft Office\Office11\Library для MS Office 2003
в C:\Program Files\Microsoft Office\Office12\Library для MS Office 2007
в C:\Program Files\Microsoft Office\Office14\Library для MS Office 2010
4. Открываем Excel.
6. Вкладка "Надстройки" -> "Управление:" нажать кнопку "Перейти. ".
7. Поставить галочку "Надстройка для работы с DBF" и нажать "ОК".
8. В Excel в закладке "Надстройки" появятся три пункта для работы с DBF.
Считать DBF в текущий лист начиная с выделенной ячейки.
Считать DBF во вновь созданную книгу.
Сохранить выделенные ячейки в формате DBF.
WallaceWilliam/VBA-macros-XLS-To-DBF
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
Readme.md
VBA macros XLS To DBF
Fork содержит возможность перекодировки
Подключение надстройки XlsToDBF.
В EXCEL 2007 (а также EXCEL 2016)
- Кнопка «Office»
- Кнопка «Параметры Excel»
- Слева, «Надстройки»
- Внизу «Управление: Надстройки Excel», кнопка «Перейти»
- В окне «Надстройки»: кнопка «Обзор. «
- Найти сохранённый ранее файл XlsToDBF.xla и нажать «OK»
- В окне «Надстройки» в списке доступных надстроек должна появиться строка «XLS -> DBF» с установленным флажком проверки, нажать «OK»
Запуск макроса для сохранения данных в DBF-формате
- Выделить ячейку относящуюся к экспортируемой областии (формат области должен отвечать некоторым требованиям, см. ниже «Формат экспортируемой области»)
- Вызвать диалог «Макрос» (ALT-F8)
- В поле «Имя макроса:» ввести XlsToDBF и нажать «Выполнить»
- Файл сохранится в той же папке, где расположена открытая книга под именем, заданным в первой ячейки экспортируемой области. Если книга только создана и ещё не сохранялась, DBF-файл сохраниться в папку по умолчанию (скорее всего, в «Мои документы»). Для полной уверенности, перед экспортом имеет смысл сохранить книгу.
Формат экспортируемой области
Программа не в ключает в себя ни каких диалогов настройки экспорта. Поэтому всю информацию необходимо сообщить непосредственно в заголовке области экспорта.
- Первая ячейка первой строки области содержит имя выходного DBF-файла (например, TEST.DBF), кодировку DBF (напрмер Windows-1251), кодировку EXCEL (опционатьно, напрмер cp866)
- Вторая и третья строки содержат описания и названия полей соответственно
- Начиная с 4-ой строки и до конца области располагаются данные
Каждое поле ОБЯЗАТЕЛЬНО должно быть описано. Описания полей соответствуют стандарту FoxPro: Cnnn — строковый тип (например, C100) Nnn или Nnn.n — числовой тип (например, N10 или N10.2) D — тип даты L — логический тип
Пример: Колонка 1: Колонка 2: Колонка 3:
Строка 1: Test.dbf Windows-1251 cp866 Строка 2: N10 С20 N8.3 Строка 3: ID Name Netto Строка 4: 10000 Огурцы 256.5 Строка 5: 20000 Помидоры 113
Логический тип (L) может быть задан, например 0 — False, 1 — True, пустое поле трактуется, как False. Также в русской версии EXCEL можно использовать «ИСТИНА» и «ЛОЖЬ».
В файле SIMPLE.XLS содержится таблица, отвечающая требованиям.
ВНИМАНИЕ! Макрос XlsToDBF не выполняет, практически, ни каких проверок на ошибки со стороны пользователя.
Как создать dbf файл из excel
Вопрос действительно интересный! 🙂 Схема получения dbf-таблиц могла бы быть следующей:
- получение xml- данных из xls- файла
- преобразование полученных xml- данных в структуру, пригодную для преобразований в связанные dbf- файлы
- ну и собственно преобразование xml- данных в dbf -таблицы, используя VFP- класс XMLAdapter
Первый шаг может быть выполнен достаточно просто, если вы имеет Excel из MS Office 2003 (или выше). Чтобы выполнить второй шаг, на мой взгляд, проще всего воспользоваться технологией XSLT -преобразований, для чего следует хотя бы в общих чертах иметь представление об этой технологии. Другие пути для выполнения преобразований над xml -данными в использовании xml -парсеров и объектной модели DOM , также возможно написание кода обработки с использованием SAX2 . Если у вас большие объёмы данных, то последнее выглядит наиболее предпочтительным. Наконец, чтобы воспользоваться VFP- классом XMLAdapter , появившемся в версии 8.0 , вы должны быть обладателем именно версии VFP 9 .0 (или выше), т.к. в перелагаемом в этой статье VFP- коде, используется свойство XMLField.XMLNameIsXPath . Ниже предполагается, что все перечисленные условия удовлетворены.
Итак, попробуем пройти все шаги, разбирая конкретный пример данных в MS Excel 2003. Допустим, что требуется получить dbf- таблицы для данных, которые в MS Excel выглядят так:
Представленная таблица имеет "заголовок таблицы" (строки: 3-6), со строк: 7, 15, . начинаются группы, а со строк: 8,13;16. начинаются соответствующие подгруппы. Каждая подгруппа помимо своего "заголовка" (строки: 8, 13, 16, . ), имеет некоторое множество строк — "содержания подгруппы" (строки: 9-12,14,17-20, . ).
По этим данным, требуется получить три VFP- таблицы связанные отношениями:
- для заголовков групп (назовём её group ),
- для заголовков подгрупп (назовём её subgroup )
- и наконец, для данных подгрупп (назовём её cells )
Экспорт данных Excel- таблицы в xml- файл
Как было сказано выше, для этого средствами MS Excel 2003 (или выше), выделив соответствующую таблицу ( из файла: table.xls) , выполним пункт меню: Файл/Сохранить как. [ Другие форматы/Тип файла: Таблица XML 2003 ] .
при этом, на возникший запрос о несоответствии формата следует ответить утвердительно. После чего мы получим файл с данными таблицы в xml- формате примерно такой структуры:
здесь незначимая для нас информация упущена и оставлено только то, что нам необходимо для дальнейшей работы. Обратите внимание на следующие моменты:
- корневой элемент имеет "область имён" ( namespace ) "по умолчанию": xmlns="urn:schemas-microsoft-com:office:spreadsheet" .
- собственно "сами данные" располагаются в элементах: /.//Workbook/Worksheet/Table/Row , а точнее в /.//Workbook/Worksheet/Table/Row/Cell/Data , в то время как значение атрибута ss:StyleID=»s. » у элемента Cell позволяет достаточно чётко различать функциональную особенность данных элемента.
Удаление "области имён по умолчанию"
К сожалению, наличие "области имён по умолчанию" делает невозможным использование таких средств как XSLT -преобразования. Поэтому первым шагом на нашем пути, удалим xmlns="urn:schemas-microsoft-com:office:spreadsheet" из корневого элемента Workbook , а полученный после такого редактирования файл сохраним с новым именем (из _table.xml в table.xml в нашем случае).
Признаки отбора "прикладных данных"
Относительно "признаков выбора", требуемых нам "прикладных данных", глядя на содержимое полученного xml- файла, можно заметить следующее:
- информация "о группах" располагается в таких элементах /.//Workbook/Worksheet/Table/Row/Cell/Data , у которых для элемента Cell атрибут ss:StyleID=»s43″
- в свою очередь, признаком выбора информации "о подгруппах" является значение этого атрибута ss:StyleID=»s44″
- наконец, элемент Row тогда содержит множество ячеек Cell содержащих "данные подгруппы", если среди них есть элемент Cell с атрибутом ss:StyleID="s42"
Далее, мы постараемся воспользоваться этими обстоятельствами, чтобы организовать обработку данных с помощью XSLT- преобразования.
XSLT- преобразование из "плоского" XML в "структурированный", согласно группировки данных
Если вы уже имели опыт написания XSLT- преобразований, вам наверное известно, что всякий раз, когда требуется решить задачу, связанную "с организацией группировок в XSLT ", мы испытываем вполне ощутимые трудности. 🙁 см. например, одно из решений здесь: http://xmlhack.ru/books/xslt/ch_11.html. В нашем случае, "на входе" мы имеем "линейную" последовательность элементов Row , тогда как "на выходе" т.е. в результате преобразований, нам требуется получить "вложенные" xml- структуры согласно связям типа: "родитель — > дети".
Чтобы обеспечить это, воспользуемся перебором всего множества элементов из /.//Workbook/Worksheet/Table/Row с помощью XSLT -конструкции: <xsl:for-each> , организуя требуемую вложенность элементов их "динамическим формированием" в выходной поток. Что же конкретно нам нужно? Попробуем сформулировать:
- всякий раз, когда "на входе" встречается элемент Row , содержащий в себе элемент Cell с атрибутом ss:StyleID=»s43″, нам нужно "организовать начало новой группы" (закрыв прежде открытую, если такая имеется, естественно). В качестве имени для такого группового элемент возьмём название group.
- в рамках групп, организованных с помощью предыдущего пункта, при обнаружении "на входе" в текущем Row элемента Cell с атрибутом ss:StyleID=»s44″, нам следует организовать начало новой вложенной подгруппу (закрыв аналогичную предшествующую, если такая имеется). В качестве имени элемента для подгруппы возьмём subgroup.
- по завершению цикла обработки всего множества элементов Row мы должны закрыть как подгруппу subgroup так и группу group , если они не были ещё закрыты.
Здесь предполагается, что во входном потоке отсутствуют "разрывы" в смысле групп/подгрупп. Т.е. данные во входном потоке упорядочены в строгом соответствии с требованиями группировок, а также и то, что во входном потоке нет данных, не принадлежащих ни группам, ни их подгруппам. Основная трудность в реализации этой схемы заключается в проверке условий на момент открытия новой группы/подгруппы, позволяющих ответить на вопрос: а есть ли ранее открытые аналогичные группы/подгруппы, которые следует закрыть при открытии новых?