3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70

Добавление данных из таблицы xlsx в базу .db с форматированием

19.10.2024, 14:31. Показов 4783. Ответов 59

Студворк — интернет-сервис помощи студентам
Добрый день.
Пытаюсь добавить данные для их обработки из нескольких файлов xlsx в одну созданную базу baza.db с помощью питона версии 3.9.7 (пакет Anaconda + jupyter notebook).

Есть код, создающий две таблицы:

Python
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
import sqlite3
import pyodbc
import pandas as pd
from datetime import datetime, timedelta, date
import time
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows
import csv
with sqlite3.connect(r'путь \baza.db') as conn:
    cursor = conn.cursor()
    # Открытие файла Excel и чтение данных
    df1 = pd.read_excel(r'путь айл1.xlsx', sheet_name='Лист1', usecols="A:J", nrows=4)
    df2 = pd.read_excel(r'путь айл1.xlsx', sheet_name='Лист2', usecols="A,C:I,K:Q,U:V", nrows=6, skiprows=1)
    for index, row in df1.iterrows():
        values_list = [row[column] for column in df1.columns]
        insert_query = """
        INSERT INTO Table1 (Ст1, Ст2, Ст3, Ст4, Ст5, Ст6, Ст7, Ст8, Ст9, Ст10)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
        """
        cursor.execute(insert_query, values_list)
    conn.commit()
    for index, row in df2.iterrows():
        values_list = [row[column] for column in df2.columns]
        insert_query = """
        INSERT INTO Table2 (Ст1, Ст2, Ст3, Ст4, Ст5, Ст6, Ст7, Ст8, Ст9, Ст10, Ст11, Ст12, Ст13, Ст14, Ст15, Ст16, Ст17)
        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
        """
        cursor.execute(insert_query, values_list)
    conn.commit()
cursor.close()
conn.close()
print("Данные подгружены"+time.ctime())
Есть две проблемы:
1) В столбце A с листа 2 (df2) надо добавить кавычки в каждую ячейку столбца: сейчас там все значения в формате ‘АБВ Вапваупауи’, а нужен вид ‘АБВ “Вапваупауи”’. Значения текстовые, разная длина.
2) Надо запихнуть данные с обоих листов файла в одну таблицу (а не две), по сути сложенную из обеих (к Table1 подтянуть значения Table2 (столбцы: Ст2, Ст3, Ст4, Ст5, Ст6, Ст7, Ст8, Ст9, Ст10, Ст11, Ст12, Ст13, Ст14, Ст15, Ст16, Ст17), на обоих листах файла excel текстовые значения в столбцах A совпадают (спасибо кавычкам), но могут быть расположены в разном порядке.

Подскажите, как допилить, пожалуйста)))
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.10.2024, 14:31
Ответы с готовыми решениями:

Добавление таблицы в базу данных
Как добавить таблицу в базу данных? Если нету ссылки добавление таблицы в базу данных SQL. Качал и устанавливал SQL Server Data Tools...

Добавление данных в базу и обновление таблицы на странице
Здравствуйте! Пишу сайт (я новичок), использую Python + Django + HTML + CSS + Bootstrap + JS + JQuery. Задача: хочу вызвать модальное...

Программное добавление таблицы в другую базу данных
Добрый день. Прошу сильно не пинать, я предварительно искал ответ - не нашел, видел только одну подобную тему и в ней не было ответов....

59
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
27.11.2024, 13:24  [ТС]
Студворк — интернет-сервис помощи студентам
Gdez, вопрос очень геморный, да?((
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,318
27.11.2024, 15:22
greker1, Как и любой анализ данных по нестандартным запросам (условиям)
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
27.11.2024, 18:36  [ТС]
Gdez, возникла мысль: а если сначала сделать два списка по статусам, а потом уже сравнивать время при совпадении других данных?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,318
27.11.2024, 19:16
greker1, вот эта строчка «делает» два списка (True, False) по статусам:
Python
1
df_tmp['tmp'] = df_tmp['Статус'].str.startswith('не')
Вот эта сравнивает время:
Python
1
ind = (df_tmp['tmp'] > df_tmp['tmp'].shift(-1)) & (df_tmp['Отдел'] == df_tmp['Отдел'].shift(-1))
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
27.11.2024, 23:10  [ТС]
Gdez, Спасибо, завтра попробую))

По первой задаче: получилось, спасибо!)))
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
29.11.2024, 23:14  [ТС]
Gdez, По второй тоже получилось, спасибо огромнейшее за помощь!)))

Попробовал по-другому: через merge сцепил нужные столбцы с обоих dataframe, а там уже отфильтровал по условию времени.

Главное, что получилось!!!
1
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
30.11.2024, 19:17  [ТС]
Добрый вечер)
Вопрос вылез(((
Пытаюсь несколько dataframe выгрузить в один файл xlsx на разные листы. Всё выгружается , но все числа в них без разрядов. При это excel их воспринимает именно как числа, тут всё в порядке. Пытаюсь привести к виду "ххх ххх ххх" и "ххх ххх ххх.хх", либо ошибки вроде со строками не работает, либо приводит внешне в нужный вид, но уже как строки(((
Не подскажете, как правильно выгрузить числа с форматом?
Спасибо!)))
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,318
30.11.2024, 20:17
greker1, «Напрямую» не получится
Можно с помощью xlsxwriter
https://xlsxwriter.readthedocs... andas.html
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
30.11.2024, 22:26  [ТС]
Gdez, сейчас у меня код выгрузки такой:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
workbook = openpyxl.workbook()
workbook.save('name.xlsx')
with pd.ExcelWriter('name.xlsx', engine='openpyxl', mode='a') as writer:
    df1.to_excel(writer, sheet_name='Лист1', index=False)
    df2.to_excel(writer, sheet_name='Лист2', index=False)
    df3.to_excel(writer, sheet_name='Лист3', index=False)
    df4.to_excel(writer, sheet_name='Лист4', index=False)
    df5.to_excel(writer, sheet_name='Лист5', index=False)
    df6.to_excel(writer, sheet_name='Лист6', index=False)
    df7.to_excel(writer, sheet_name='Лист7', index=False)
    df8.to_excel(writer, sheet_name='Лист8', index=False)
workbook = openpyxl.load_workbook('name.xlsx')
workbook.remove(workbook['Sheet']   # удаление лишнего листа, который создаётся при создании пустого файла
Дальше преобразование ширины столбцов через цикл for по листам файла, фиксация первых строк с "шапками" и фильтры для удобства работой.

Можешь подсказать, как переделать с xlsxwriter?
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,318
01.12.2024, 06:36
greker1,
Можешь подсказать, как переделать с xlsxwriter?
Нет, с форматированием через xlsxwriter и openpyxl не работал
0
115 / 100 / 15
Регистрация: 24.07.2019
Сообщений: 319
01.12.2024, 09:29
цикл по ячейкам и
Python
1
cell.number_format = '0.00' # '@', 'dd.mm.yyyy', '0.00', '0', '# ##0', 'General'
а вообще есть ведь хорошая документация
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
01.12.2024, 13:48  [ТС]
nilske, Ещё бы понимать, где что искать(( А так да, документация штука хорошая, согласен)

Цитата Сообщение от nilske Посмотреть сообщение
цикл по ячейкам и
PythonВыделить код
1
cell.number_format = '0.00' # '@', 'dd.mm.yyyy', '0.00', '0', '# ##0', 'General'
А можно конкретный пример, пожалуйста?))
0
115 / 100 / 15
Регистрация: 24.07.2019
Сообщений: 319
01.12.2024, 19:45
https://openpyxl.readthedocs.i... er-formats
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
03.12.2024, 22:11  [ТС]
Получилось в итоге так:

Python
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
from openpyxl import load_workbook
 
# Загрузка рабочей книги Excel
wb = load_workbook(filename="файл.xlsx")
 
# Перебор всех листов в книге
for ws in wb.worksheets:
    # Перебор всех строк на текущем листе
    for row in ws.iter_rows():
        # Перебор всех ячеек в текущей строке
        for cell in row:
            # Преобразуем значение ячейки в число, если возможно
            try:
                value = float(cell.value)
            except (ValueError, TypeError):
                continue  # Пропускаем ячейку, если не удается преобразовать значение в число
            
            # Проверяем значение ячейки
            if value < 1:
                cell.number_format = '### ### ##0.00'
            else:
                cell.number_format = '### ### ###'
 
# Сохранение изменений в той же книге
wb.save('файл.xlsx')
Спасибо за помощь)
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
04.12.2024, 22:58  [ТС]
Добрый вечер, возник вопрос((

Есть таблица excel с данными (файл вложен, лист "Что есть").

Подскажите, пожалуйста, как с помощью python сделать сортировку по нескольким столбцам сразу:
Отдел, Сотрудник и Должность - от А до Я (текстовые поля), Зп - по возрастанию (числовое поле).
Пример результата - на листе "Что должно получиться".

В самой "задачке" в файле 7 листов, данные разные, надо сделать такие сортировки на всех листах, но по разным столбцам((

Спасибо!)))
Вложения
Тип файла: xlsx Сортировочная.xlsx (24.5 Кб, 2 просмотров)
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,318
05.12.2024, 06:18
greker1, https://docs-python.ru/package... ort-index/
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
05.12.2024, 13:31  [ТС]
Gdez, получилось, спасибо)))
Пришлось поискать место в коде, куда именно сортировку воткнуть, чтобы сработало.

Спасибо за помощь)))
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
08.12.2024, 13:53  [ТС]
Здравствуйте))

Ещё один вопрос появился: есть два dataframe (вложенный файл, Заказ и Остаток), как из них получить dataframe вида Итого? Оба dataframe собраны в базе baza.db. Данных может быть несколько сотен строк, какие-то значения могут отсутствовать в Заказе и Остатке (как пример позиция строки №9 в Заказе и Итого, выделил курсивом)

Как их правильно объединить, чтобы были показаны данные из обоих dataframe?

Спасибо!)))
Вложения
Тип файла: xlsx Сборка.xlsx (12.5 Кб, 6 просмотров)
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,318
08.12.2024, 18:56
greker1,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
import numpy as np
 
df1 = pd.read_excel('/content/drive/MyDrive/Сборка.xlsx', sheet_name=0, skiprows=1, usecols="A,B,C,D")
df2 = pd.read_excel('/content/drive/MyDrive/Сборка.xlsx', sheet_name=0, skiprows=1, usecols="F,G,H,I")
df2.columns = df1.columns.tolist()[:3] + [df2.columns.to_list()[-1]]
 
 
df_res = pd.merge(df1, df2, on=['Товар', 'Изд-во', 'Кол-во'], how='outer') #Само объединение
df_res.dropna(subset='Товар', inplace=True)
df_res.fillna(0, inplace=True)
df_res['Остаток  - сумма заказа'] = df_res['Остаток'] - df_res['Сумма заказа']
df_res = df_res.convert_dtypes()
df_res
0
3 / 3 / 0
Регистрация: 25.06.2018
Сообщений: 70
15.12.2024, 22:43  [ТС]
Gdez, Извиняюсь за долгий ответ: пришлось заковыряться с проверкой дат, в результате треть скрипта переделывал(((
Со сборкой в итоге получилось так: к Остатку подтянул совпадения из Заказа, потом в отдельный dataframe выгрузил Заказы, которых нет в остатке (а вдруг такие появятся?), потом объединил их в один и к получившемуся уже притянул столбец Остаток из Остатка, заменив пустые значения на 0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.12.2024, 22:43
Помогаю со студенческими работами здесь

Переименование таблицы в базе данных (или добавление таблиц в базу данных с именами таблиц из переменной)
С помощью панды из двоичного файла получил таблицу типа DataFrame import pandas as pd df =...

Laravel 5: импорт данных из excel(xlsx) в базу
Всем доброго времени суток! Изучаю замечательный фреймворк Laravel относительно недавно (пару месяцев). Из достижений пока только блог,...

Скрипт конвертации CSV в XLSX с форматированием
Добрый день! Не много соображаю в VB.Net, но задача именно в формате отдельно исполняемого файла VBS. Задача: есть файл csv с...

Как автоматизировать импорт данных в базу mysql из xlsx файла?
Есть обновляемый файл xlsx на ftp сервере.Необходимо по расписанию импортировать его в базу mysql. подскажите как это сделать эффективно и...

Добавление записей из базу данных Access в базу данных SQL
Здравствуйте,пытаюсь добавить записи из базы данных Access в базу данных SQL,но не могу разобраться с подключениями,может ли кто подсказать...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru