Python: вывод данных в электронную таблицу Excel

1

Мне нужно сделать то, что, вероятно, очень просто для опытного кодера. Моя программа Python успешно выполняет следующие действия:

  1. Импорт таблицы Excel
  2. Итерации по строкам и подсчет повторяющихся вхождений "Модели", независимо от того, потребляется ли модель (местоположение) или нет, и кто "потребляет" модель (и сколько их потреблял). Все, что не "Потреблено", будет считаться "доступным".
  3. Распечатайте "Модель", "Потребляемый", "Доступный" и "Запрос" (кто-то, кто потреблял модель).

Вместо того, чтобы просто печатать значения, мне нужно, чтобы они были добавлены к листу в книге Excel с помощью Model, Consumed, Avaible и Requestors в качестве заголовков столбцов.

Вот как я печатаю значения:

if not REQUESTORLIST:
    print(CURRENTMODEL, "Consumed:", CONSUMEDCOUNTER, "Available:", AVAILABLECOUNTER)
else:
    print(CURRENTMODEL,"Consumed:",CONSUMEDCOUNTER, "Available:",AVAILABLECOUNTER,REQUESTORS)

Вот типы данных:

print(type(CURRENTMODEL))
print(type(CONSUMEDCOUNTER))
print(type(AVAILABLECOUNTER))
print(type(REQUESTORS))

Выходы:

<class 'str'>
<class 'int'>
<class 'int'>
<class 'collections.Counter'>

Наконец, программные выходы усечены:

Model    WS-SFP Consumed: 1 Available: 2 Counter({'Requester    Anthony House': 1})

Я новичок в программировании (это первая программа, которую я написал), и у меня возникли проблемы с поиском способа получить эти значения для записи на листе excel с четырьмя заголовками столбцов, которые мне нужны. Я попытался преобразовать их в строки и использовать.write, но пока не увенчался успехом. У вас есть какие-нибудь предложения?

EDIT: Спасибо за быстрые ответы. Я думаю, что мне может быть полезно просто опубликовать мой код. Я открыт для отзывов о том, как оптимизировать эту вещь, поскольку она, вероятно, является подпарам. Я экспериментировал с.write, который пропускает строки в выходном файле excel, не заполняет заголовки столбцов и т.д. Вероятно, это не самый лучший вариант.

import os
import openpyxl
import matplotlib
import numpy
import pandas as pd
import xlrd
import xlwt
from xlwt import Workbook
import xlsxwriter
from collections import Counter

#file to pull data from
excel_file = 'Customer_Inventory_Test.xlsx'
models = pd.read_excel(excel_file)
#file to export results
workbook = xlsxwriter.Workbook('Inventory Report.xlsx')
worksheet = workbook.add_worksheet()

row = 0
col = 0
ROWCOUNT = models.shape[0]

while True:
    CONSUMEDCOUNTER = 0
    AVAILABLECOUNTER = 0
    REQUESTORLIST = []
    #break when no more rows
    if row == ROWCOUNT:
        break
    MODEL = models.iloc[row, [0]]
    #convert to string for comparison
    MODEL = MODEL.to_string()
    CURRENTMODEL = MODEL
    LOCATION = models.iloc[row, [2]]
    LOCATION = LOCATION.to_string()

    while CURRENTMODEL == MODEL:
        if "Consumed" in LOCATION:
            CONSUMEDCOUNTER += 1
            REQUESTOR = models.iloc[row, [17]]
            # convert to string for comparison
            REQUESTOR = REQUESTOR.to_string()
            REQUESTORLIST.append(REQUESTOR)
        else:
            AVAILABLECOUNTER += 1
        row += 1
        if row == ROWCOUNT:
            break
        MODEL = models.iloc[row, [0]]
        MODEL = MODEL.to_string()
        LOCATION = models.iloc[row, [2]]
        LOCATION = LOCATION.to_string()

    REQUESTORS = Counter(REQUESTORLIST)

    if not REQUESTORLIST:
        worksheet.write(row, col, CURRENTMODEL)
        worksheet.write(row, col + 1, CONSUMEDCOUNTER)
        worksheet.write(row, col + 2, AVAILABLECOUNTER)
        print(CURRENTMODEL[9:], "Consumed:", CONSUMEDCOUNTER, "Available:", 
AVAILABLECOUNTER)
    else:
        worksheet.write(row, col, CURRENTMODEL)
        worksheet.write(row, col + 1, CONSUMEDCOUNTER)
        worksheet.write(row, col + 2, AVAILABLECOUNTER)
        #worksheet.write(row, col + 3, REQUESTORS) <- Doesn't like 
#requestors data structure
        print(CURRENTMODEL[9:],"Consumed:",CONSUMEDCOUNTER, 
"Available:",AVAILABLECOUNTER,REQUESTORS)

workbook.close()
  • 0
    Возможно, полезно или связано: Написать заголовки в файл Excel в Python
  • 0
    Эй, не могли бы вы предоставить больше информации о форме данных, которые вы хотите экспортировать? Это на самом деле в кадре данных? В своем ответе я предположил, что так и было, что могло быть ошибкой ...
Показать ещё 1 комментарий
Теги:
pandas
excel

4 ответа

0

Вы можете попробовать hfexcel Human Friendly объектно-ориентированную библиотеку Python на основе XlsxWriter:

from hfexcel import HFExcel

hf_workbook = HFExcel.hf_workbook('example.xlsx', set_default_styles=False)

hf_workbook.add_style(
    "headline", 
    {
       "bold": 1,
        "font_size": 14,
        "font": "Arial",
        "align": "center"
    }
)

sheet1 = hf_workbook.add_sheet("sheet1", name="Example Sheet 1")

column1, _ = sheet1.add_column('headline', name='Column 1', width=2)
column1.add_row(data='Column 1 Row 1')
column1.add_row(data='Column 1 Row 2')

column2, _ = sheet1.add_column(name='Column 2')
column2.add_row(data='Column 2 Row 1')
column2.add_row(data='Column 2 Row 2')


column3, _ = sheet1.add_column(name='Column 3')
column3.add_row(data='Column 3 Row 1')
column3.add_row(data='Column 3 Row 2')

# In order to get a row with coordinates:
# sheet[column_index][row_index] => row
print(sheet1[1][1].data)
assert(sheet1[1][1].data == 'Column 2 Row 2')

hf_workbook.save()
0

Я больше экспериментировал с преобразованием списка обратно в dataframe, и похоже, что у меня есть рабочее решение.

Вот что у меня есть:

#NEWLIST is the list that changes with each loop iteration.
NEWLIST = [(CURRENTMODEL[9:], CONSUMEDCOUNTER, AVAILABLECOUNTER, REQUESTORS)]
CURRENTLIST.extend(NEWLIST)

df = pd.DataFrame(CURRENTLIST, columns=["Model","Consumed","Available","Requestor(s)"])
writer = pd.ExcelWriter('Inventory Summary Report.xlsx')
df.to_excel(writer,'Sheet1',freeze_panes=(1,1), index=False)
0

Вы можете предоставить более подробную информацию о своем коде, чтобы мы могли легче помочь вам. Во всяком случае, есть несколько способов сделать то, что вам нужно, но я рекомендую вам использовать библиотечные панды.

Вот несколько ссылок с примерами.

https://www.datacamp.com/community/tutorials/pandas-tutorial-dataframe-python https://xlsxwriter.readthedocs.io/working_with_pandas.html

PS: Вы можете даже выполнять свои подсчеты, используя структуры панд.

  • 0
    Я буду копаться в этом. Спасибо.
0

Добро пожаловать в Stack Overflow. Проверьте этот метод DataFrame: .to_excel(). Вам нужно вызвать этот метод из вашего фрейма данных, указав путь к файлу, в котором будет находиться новый файл Excel. Пример: my_data_frame.to_excel('path/to/my/new_file.xlsx').

  • 1
    Спасибо! Я немного поэкспериментировал с этим методом, но проблема в том, что в моем коде мне нужно преобразовать значения из df в строки, чтобы я мог сравнивать строки друг с другом. Я не смог выяснить, как преобразовать строки обратно во фрейм данных. Я разместил весь свой код в оригинальном вопросе для большего контекста.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню