Мне нужно сделать то, что, вероятно, очень просто для опытного кодера. Моя программа Python успешно выполняет следующие действия:
Вместо того, чтобы просто печатать значения, мне нужно, чтобы они были добавлены к листу в книге 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()
Вы можете попробовать 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()
Я больше экспериментировал с преобразованием списка обратно в 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)
Вы можете предоставить более подробную информацию о своем коде, чтобы мы могли легче помочь вам. Во всяком случае, есть несколько способов сделать то, что вам нужно, но я рекомендую вам использовать библиотечные панды.
Вот несколько ссылок с примерами.
https://www.datacamp.com/community/tutorials/pandas-tutorial-dataframe-python https://xlsxwriter.readthedocs.io/working_with_pandas.html
PS: Вы можете даже выполнять свои подсчеты, используя структуры панд.
Добро пожаловать в Stack Overflow. Проверьте этот метод DataFrame: .to_excel(). Вам нужно вызвать этот метод из вашего фрейма данных, указав путь к файлу, в котором будет находиться новый файл Excel. Пример: my_data_frame.to_excel('path/to/my/new_file.xlsx')
.