Вверх ↑
Этот топик читают: Гость
Ответов: 143
Рейтинг: 0
#1: 2025-03-07 11:55:28 ЛС | профиль | цитата
Всем привет. Есть база товаров в Excel (xlsx), нужно переделать в XML. Помогите пожалуйста это осуществить. В архиве примеры
Нужно в XML добавить такое же количество строк как в EXCEL, да еще и столбцы нужно строго определенные и данные из них и еще определенные строки не добавлять, там где указано Распродажа. В общем скажите, реально это вообще или как?

Редактировалось 2 раз(а), последний 2025-03-07 11:59:14
карма: 1

0
Ответов: 516
Рейтинг: 166
#2: 2025-03-07 13:21:33 ЛС | профиль | цитата
Serascer писал(а):
реально это вообще или как?

скорее да чем нет Добавил результат (primer/zip)- это примерно то?
если да то пример набросаю , если нет то конкретнее ТЗ..

Редактировалось 1 раз(а), последний 2025-03-07 13:25:22
карма: 4

0
файлы: 1primer.zip [1.7KB] [21]
Ответов: 143
Рейтинг: 0
#3: 2025-03-07 13:47:19 ЛС | профиль | цитата
tig-rrr, вроде похоже, приложите схему пожалуйста
карма: 1

0
Ответов: 8939
Рейтинг: 824
#4: 2025-03-07 14:30:29 ЛС | профиль | цитата
Serascer, зачем схема, в Excel "сохранить как" и выбрать формат "*xml"
Другое дело сохранить в формате таблицы HiAsm
карма: 19

0
Ответов: 143
Рейтинг: 0
#5: 2025-03-07 14:33:23 ЛС | профиль | цитата
Леонид, ну потому что в XML из моего архива состав как бы отличается ) Нужно не просто сохранить Excel в XML, а перелопатить его под нужную структуру.
карма: 1

0
Ответов: 516
Рейтинг: 166
#6: 2025-03-07 15:48:09 ЛС | профиль | цитата
Serascer писал(а):
приложите схему пожалуйста


Add(Edit,16153760,266,140)
{
Left=130
Top=110
Width=405
Text="Полный путь к файлу"
}
Add(Button,11294511,119,140)
{
Left=20
Top=110
Width=105
Caption="Выбрать xlsx"
link(onClick,12418851:doExecute,[])
}
Add(Memo,11649951,63,140)
{
Left=15
Top=10
Width=520
Height=90
Strings=#61:Для работы примера в системе должен быть установлен Python. |28:Тестировалось на версии 3.12|28:И дополнительные библиотеки |20:pip install openpyxl|18:pip install pandas|
}
Add(BitBtn,8443894,56,273)
{
Left=425
Top=140
Width=110
Height=25
Font=[Arial,9,0,0,204]
Caption="xlsx to xml"
link(onClick,14760339:doEvent1,[])
}
Add(ODialog,12418851,175,140)
{
link(onExecute,16153760:doText,[])
}
Add(MainForm,4113618,63,189)
{
Width=561
Height=211
Caption="XLSX to XML"
Position=1
Point(onClose)
link(onClose,10102205:doDelete,[])
}
Add(FormatStr,7180411,287,287)
{
@Hint=#3:Код|
Mask="import pandas as pd\r\nimport xml.etree.ElementTree as ET\r\nfrom datetime import datetime\r\n\r\n# Укажите путь к Excel-файлу\r\nexcel_file = r'%1'\r\n\r\n# Загрузка данных из Excel\r\ndf = pd.read_excel(excel_file)\r\n\r\n# Фильтрация данных: исключаем строки, где "Некондиция/распродажа" содержит "Распродажа"\r\nif 'Некондиция/распродажа' in df.columns:\r\n df = df[df['Некондиция/распродажа'] != 'Распродажа']\r\n\r\n# Создание корневого элемента XML\r\nroot = ET.Element('Сток', Дата=datetime.now().strftime("%d.%m.%Y %H:%M"))\r\n\r\n# Преобразование каждой строки DataFrame в XML-элемент\r\nfor index, row in df.iterrows():\r\n товар = ET.SubElement(root, 'Товар', {\r\n 'Группа': str(row['Группа оборудования']),\r\n 'Вид': str(row['Вид оборудования']),\r\n 'Производитель': str(row['Производитель']),\r\n 'НН': str(row['Номенклатурный номер']),\r\n 'Партномер': str(row['Каталожный номер']),\r\n 'Название': str(row['Наименование']),\r\n 'НазваниеРус': str(row['Наименование']), # Если нужно другое значение, укажите его\r\n 'Статус': '', # Пустое значение, так как в данных нет столбца "Статус"\r\n 'Цена': str(row['Цена']),\r\n 'Валюта': str(row['Валюта']),\r\n 'ПроцентКонв': 'call', # Заполните, если есть данные\r\n 'Вес': str(row['Вес (кг)']),\r\n 'Объем': str(row['Объём (м3)']),\r\n 'Ширина': str(row['Ширина (м)']),\r\n 'Высота': str(row['Высота (м)']),\r\n 'Глубина': str(row['Глубина (м)']),\r\n 'ЕдИзм': str(row['Единица измерения'])\r\n })\r\n\r\n # Добавляем вложенный элемент <Склад>\r\n if pd.notna(row['Москва']): # Используем данные из столбца "Москва"\r\n склад = ET.SubElement(товар, 'Склад', Место="ЦО", Количество=str(int(row['Москва'])))\r\n ET.SubElement(товар, 'Склад', Место="ЦО(Москва)", Количество=str(int(row['Москва'])))\r\n\r\n# Создание XML-дерева и запись в файл\r\noutput_xml = r'%2.xml'\r\ntree = ET.ElementTree(root)\r\ntree.write(output_xml, encoding='utf-8', xml_declaration=True)\r\n\r\nprint(f"Файл успешно создан: {output_xml}")"
Point(FString)
link(Str1,15035740:Var2,[(293,243)(272,243)])
link(Str2,13838545:Part1,[])
AddHint(61,-45,34,13,@Hint)
}
Add(StrList,16121741,469,266)
{
FileName="xlsx_xml.py"
Point(doSave)
AddHint(51,-20,67,13,FileName)
}
Add(WinExec,2056341,469,350)
{
FileName="xlsx_xml.py"
Mode=0
Point(doConsoleExec)
Point(onConsoleResult)
AddHint(44,-21,67,13,FileName)
}
Add(Hub,14760339,126,273)
{
OutCount=4
link(onEvent1,13838545:doSplit,[(214,279)(214,209)])
link(onEvent2,16121741:doClear,[(266,286)(266,279)])
link(onEvent3,7180411:doString,[])
link(onEvent4,16063345:doCharset,[(214,300)(214,349)])
}
Add(DoData,10488280,378,350)
{
link(onEventData,8325440:doEvent1,[])
}
Add(Hub,8325440,427,350)
{
link(onEvent1,16121741:doSave,[(449,356)(449,300)])
link(onEvent2,2056341:doShellExec,[])
}
Add(FileTools,10102205,119,196)
{
DelToRecycle=1
FileName="xlsx_xml.py"
AddHint(-22,45,67,13,FileName)
}
Add(Charset,16063345,287,343)
{
Type=6
link(onCharset,2444890:doEvent1,[])
link(Text,7180411:FString,[])
}
Add(Hub,2444890,336,343)
{
link(onEvent1,16121741:doAdd,[(362,349)(362,272)])
link(onEvent2,10488280:doData,[])
}
Add(MultiStrPart,13838545,294,203)
{
Char="."
link(Str,15035740:Var3,[(300,187)])
}
Add(GetDataEx,15035740,266,182)
{
link(Data,16153760:Text,[])
}

карма: 4

0
Ответов: 143
Рейтинг: 0
#7: 2025-03-07 15:52:48 ЛС | профиль | цитата
tig-rrr, большое спасибо! Буду изучать

--- Добавлено в 2025-03-07 16:13:37

tig-rrr, такс ) установил питона и библиотеки. Выбрал xlsx, нажал кнопку xlsx to xml, создался файлик xlsx_xml.py и больше ничего не происходит. Что не так?

--- Добавлено в 2025-03-07 16:22:59

Попробовал запустить xlsx_xml.py просто так через питона, выдало вот что:
SyntaxError: unexpected character after line continuation character

Редактировалось 2 раз(а), последний 2025-03-07 16:22:59
карма: 1

0
Ответов: 516
Рейтинг: 166
#8: 2025-03-07 16:23:09 ЛС | профиль | цитата
Serascer писал(а):
Что не так?

Вместе с установкой Python устанавливается и - IDLE (Python 3.12 64-bit)
вот этот файлик xlsx_xml.py и нужно открыть в этой среде и попробовать запустить оттуда. И детально посмотреть на возможные ошибки. Кстати как правило! В файле пути не должно быть русских букв и пробелов)
Тестировал в Windows 11 Pro 64 bit 24H2
Python 3.12 64-bit
Мне удобней в Visual Studio Code на Python код отлаживать.

Редактировалось 2 раз(а), последний 2025-03-07 16:28:08
карма: 4

0
Ответов: 143
Рейтинг: 0
#9: 2025-03-07 16:27:12 ЛС | профиль | цитата
tig-rrr, У меня вот тоже Windows 11. Вот ошибка какая:
Traceback (most recent call last):
File "C:\Users\User\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\indexes\base.py", line 3805, in get_loc
return self._engine.get_loc(casted_key)
File "index.pyx", line 167, in pandas._libs.index.IndexEngine.get_loc
File "index.pyx", line 196, in pandas._libs.index.IndexEngine.get_loc
File "pandas\\_libs\\hashtable_class_helper.pxi", line 7081, in pandas._libs.hashtable.PyObjectHashTable.get_item
File "pandas\\_libs\\hashtable_class_helper.pxi", line 7089, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 'Группа оборудования'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "C:\Users\User\Desktop\1.py", line 21, in <module>
'Группа': str(row['Группа оборудования']),
File "C:\Users\User\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\series.py", line 1121, in __getitem__
return self._get_value(key)
File "C:\Users\User\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\series.py", line 1237, in _get_value
loc = self.index.get_loc(label)
File "C:\Users\User\AppData\Local\Programs\Python\Python313\Lib\site-packages\pandas\core\indexes\base.py", line 3812, in get_loc
raise KeyError(key) from err
KeyError: 'Группа оборудования'

Редактировалось 1 раз(а), последний 2025-03-07 16:30:42
карма: 1

0
Ответов: 516
Рейтинг: 166
#10: 2025-03-07 18:21:13 ЛС | профиль | цитата
Serascer писал(а):
Вот ошибка какая:

Ошибка KeyError: 'Группа оборудования' указывает на то, что столбец с именем 'Группа оборудования' не найден в DataFrame

Serascer писал(а):
SyntaxError: unexpected character after line continuation character

Что-то с символом возможно (\) - (/). В пути файла...х.з.

Serascer, если на Python не получается можно попробовать в самом Excel ,
тут я не силён от слова совсем ) но чего-то на пробовал...
Открыть baza.xlsm
Нажмите Alt + F8, выберите макрос ExportToXML и нажмите Выполнить.
Макрос создаст файл TEST.xml в той же папке, где находится ваш Excel-файл.
Для редактирования макроса VBA: Нажмите Alt + F11.

Редактировалось 1 раз(а), последний 2025-03-07 18:38:38
карма: 4

1
файлы: 1baza.zip [21.7KB] [16]
Голосовали:Serascer
Ответов: 865
Рейтинг: 186
#11: 2025-03-07 19:39:49 ЛС | профиль | цитата
Serascer писал(а):
Всем привет. Есть база товаров в Excel (xlsx), нужно переделать в XML. Помогите пожалуйста это осуществить. В архиве примеры
Нужно в XML добавить такое же количество строк как в EXCEL, да еще и столбцы нужно строго определенные и данные из них и еще определенные строки не добавлять, там где указано Распродажа. В общем скажите, реально это вообще или как?

Вот пример на VBJScript
https://forum.hiasm.com/getfile/39725
карма: 18

0
файлы: 1RAB-VBS.ZIP [10.2KB] [16]
Ответов: 143
Рейтинг: 0
#12: 2025-03-07 19:47:19 ЛС | профиль | цитата
tig-rrr, Я понял в чем дело! Блин, вот сразу об этом подумал и забыл )))) В моем оригинальном файле несколько листов внутри файла. Удалил все кроме того где таблица и всё заработало. А теперь вопрос: есть ли возможность сделать так, чтобы можно было использовать программу без установки питона? Через компиляцию вроде можно было подобное, но я не помню как.

--- Добавлено в 2025-03-07 20:03:24

Gunta, скрипт конечно работает, но ооооооочень долго ) Схема Тигра практически мгновенно все делает.

Редактировалось 3 раз(а), последний 2025-03-07 20:48:15
карма: 1

0
Ответов: 143
Рейтинг: 0
#13: 2025-03-07 21:01:18 ЛС | профиль | цитата
Немного модернизировал схему, сделал выбор конкретной страницы в файле. Огромное спасибо tig-rrr за помощь )
Add(Edit,16153760,581,133)
{
Left=130
Top=110
Width=405
Text="Полный путь к файлу"
}
Add(Button,11294511,434,133)
{
Left=20
Top=110
Width=105
Caption="Выбрать xlsx"
link(onClick,12418851:doExecute,[])
}
Add(Memo,11649951,378,133)
{
Left=15
Top=10
Width=520
Height=90
Strings=#51:Для работы в системе должен быть установлен Python |28:Тестировалось на версии 3.12|27:И дополнительные библиотеки|51:После установки Python в комнадной строке набрать: |20:pip install openpyxl|18:pip install pandas|
}
Add(BitBtn,8443894,371,266)
{
Left=425
Top=140
Width=110
Height=25
Font=[Arial,9,0,0,204]
Caption="xlsx to xml"
link(onClick,14760339:doEvent1,[])
}
Add(ODialog,12418851,490,133)
{
Filter="Excel|*.xls*"
FileName=""
link(onExecute,16153760:doText,[])
}
Add(MainForm,4113618,378,182)
{
Width=561
Height=211
Caption="XLSX to XML"
Position=1
Point(onClose)
link(onClose,10102205:doDelete,[])
}
Add(FormatStr,7180411,602,280)
{
@Hint=#3:Код|
Mask="import pandas as pd\r\nimport xml.etree.ElementTree as ET\r\nfrom datetime import datetime\r\n\r\n# Укажите путь к Excel-файлу\r\nexcel_file = r'%1'\r\n\r\n# Загрузка данных из Excel\r\ndf = pd.read_excel(excel_file, sheet_name='Наличие и цены')\r\n\r\n# Фильтрация данных: исключаем строки, где "Некондиция/распродажа" содержит "Распродажа"\r\nif 'Некондиция/распродажа' in df.columns:\r\n df = df[df['Некондиция/распродажа'] != 'Распродажа']\r\n\r\n# Создание корневого элемента XML\r\nroot = ET.Element('Сток', Дата=datetime.now().strftime("%d.%m.%Y %H:%M"))\r\n\r\n# Преобразование каждой строки DataFrame в XML-элемент\r\nfor index, row in df.iterrows():\r\n товар = ET.SubElement(root, 'Товар', {\r\n 'Группа': str(row['Группа оборудования']),\r\n 'Вид': str(row['Вид оборудования']),\r\n 'Производитель': str(row['Производитель']),\r\n 'НН': str(row['Номенклатурный номер']),\r\n 'Партномер': str(row['Каталожный номер']),\r\n 'Название': str(row['Наименование']),\r\n 'НазваниеРус': str(row['Наименование']), # Если нужно другое значение, укажите его\r\n 'Статус': '', # Пустое значение, так как в данных нет столбца "Статус"\r\n 'Цена': str(row['Цена']),\r\n 'Валюта': str(row['Валюта']),\r\n 'ПроцентКонв': 'call', # Заполните, если есть данные\r\n 'Вес': str(row['Вес (кг)']),\r\n 'Объем': str(row['Объём (м3)']),\r\n 'Ширина': str(row['Ширина (м)']),\r\n 'Высота': str(row['Высота (м)']),\r\n 'Глубина': str(row['Глубина (м)']),\r\n 'ЕдИзм': str(row['Единица измерения'])\r\n })\r\n\r\n # Добавляем вложенный элемент <Склад>\r\n if pd.notna(row['Москва']): # Используем данные из столбца "Москва"\r\n склад = ET.SubElement(товар, 'Склад', Место="ЦО", Количество=str(int(row['Москва'])))\r\n ET.SubElement(склад, 'Склад', Место="ЦО(Москва)", Количество=str(int(row['Москва'])))\r\n\r\n# Создание XML-дерева и запись в файл\r\noutput_xml = r'%2.xml'\r\ntree = ET.ElementTree(root)\r\ntree.write(output_xml, encoding='utf-8', xml_declaration=True)\r\n\r\nprint(f"Файл успешно создан: {output_xml}")"
Point(FString)
link(Str1,15035740:Var2,[(608,236)(587,236)])
link(Str2,13838545:Part1,[])
AddHint(61,-45,34,13,@Hint)
}
Add(StrList,16121741,784,259)
{
FileName="xlsx_xml.py"
Point(doSave)
AddHint(51,-20,67,13,FileName)
}
Add(WinExec,2056341,784,343)
{
FileName="xlsx_xml.py"
Point(doConsoleExec)
Point(onConsoleResult)
AddHint(44,-21,67,13,FileName)
}
Add(Hub,14760339,441,266)
{
OutCount=4
link(onEvent1,13838545:doSplit,[(529,272)(529,202)])
link(onEvent2,16121741:doClear,[(581,279)(581,272)])
link(onEvent3,7180411:doString,[])
link(onEvent4,16063345:doCharset,[(529,293)(529,342)])
}
Add(DoData,10488280,693,343)
{
link(onEventData,8325440:doEvent1,[])
}
Add(Hub,8325440,742,343)
{
link(onEvent1,16121741:doSave,[(764,349)(764,293)])
link(onEvent2,2056341:doShellExec,[])
}
Add(FileTools,10102205,434,189)
{
DelToRecycle=1
FileName="xlsx_xml.py"
AddHint(-22,45,67,13,FileName)
}
Add(Charset,16063345,602,336)
{
Type=6
link(onCharset,2444890:doEvent1,[])
link(Text,7180411:FString,[])
}
Add(Hub,2444890,651,336)
{
link(onEvent1,16121741:doAdd,[(677,342)(677,265)])
link(onEvent2,10488280:doData,[])
}
Add(MultiStrPart,13838545,609,196)
{
Char="."
link(Str,15035740:Var3,[(615,180)])
}
Add(GetDataEx,15035740,581,175)
{
link(Data,16153760:Text,[])
}


Редактировалось 2 раз(а), последний 2025-03-07 21:02:20
карма: 1

0
Ответов: 865
Рейтинг: 186
#14: 2025-03-08 13:17:34 ЛС | профиль | цитата
Serascer писал(а):
скрипт конечно работает, но ооооооочень долго ) Схема Тигра практически мгновенно все делает

Можно такой вариант. Он значительно быстрее.
https://forum.hiasm.com/getfile/39728
карма: 18

0
файлы: 1Excel в XML.zip [10.7KB] [14]
Ответов: 516
Рейтинг: 166
#15: 2025-03-08 13:18:08 ЛС | профиль | цитата
Serascer писал(а):
есть ли возможность сделать так, чтобы можно было использовать программу без установки питона? Через компиляцию вроде можно было подобное

Варианты есть и их несколько. Только как обычно есть нюансы. Если без интерфейса , то нужен механизм передачи пути файла в exe (строго привязанный путь и имя файла) (Текстовые файлы: CSV, JSON, XML, TXT ...) (Сети: Сокеты, HTTP, WebSockets) (SQL-базы данных (MySQL,SQLite... ) и т.д. С интерфейсом (Tkinter, PyQt и т.д.) свои нюансы. К примеру
при использовании nuitka-(это компилятор Python, который преобразует Python-код в машинный код (C++)). Размер файла EXE(конкретной задачи, без сжатия , оптимизации но со свеми зависимостями) - 66MB, и при запуске и выполнении этой задачи (на моём компе) в сравнении с вариантом от Gunta выражение
Serascer писал(а):
но ооооооочень долго )
покажется вполне приемлемым...

Редактировалось 1 раз(а), последний 2025-03-08 13:35:03
карма: 4

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)