python代码: 1. 使用excel进行文档管理,可以添加多个供应商,A列序号,B列项目名称,C列供应商名称,D列需求总条数,E列FC条数,F列NC条数 2. 可以修改某个供应商的FC条数,NC条数 3. 可以新增一个供应商的数据 4. 可以删除某个供应商的数据 5. 可以对同一个文档根据FC条数进行排序 6. 可以对同一个文档根据NC条数进行排序 7. 可以查看某个供应商的数据 8. 有输入合法性校验 9. 根据C, E列生成数据透视图到新的sheet页 10. 根据C, F列生成数据透视图到新的sheet页 11. 根据C, E列生成折线图到新的sheet页 12. 根据C, F列生成折线图到新的sheet页 13. 根据C,E,F列生成柱状图到新的sheet页
时间: 2024-03-25 16:40:28 浏览: 65
这个需求和之前的需求基本相同,下面是一个稍微完善一些的实现示例:
```python
import pandas as pd
from openpyxl import Workbook, load_workbook
from openpyxl.chart import LineChart, BarChart, Reference, Series
from openpyxl.utils.dataframe import dataframe_to_rows
# 读取 Excel 文件
wb = load_workbook('data.xlsx')
ws = wb.active
# 将数据转换为 DataFrame 格式
data = ws.values
cols = next(data)
df = pd.DataFrame(data, columns=cols)
# 添加新供应商
def add_supplier(df, sn, name, demand, fc, nc):
max_sn = df['序号'].max()
new_supplier = {'序号': max_sn+1, '项目名称': 'xxx', '供应商名称': 'yyy', '需求总条数': 100, 'FC条数': 50, 'NC条数': 50}
new_supplier['序号'] = sn
new_supplier['供应商名称'] = name
new_supplier['需求总条数'] = demand
new_supplier['FC条数'] = fc
new_supplier['NC条数'] = nc
df = df.append(new_supplier, ignore_index=True)
return df
# 修改供应商数据
def modify_supplier(df, name, fc, nc):
df.loc[df['供应商名称'] == name, ['FC条数', 'NC条数']] = [fc, nc]
return df
# 删除供应商数据
def delete_supplier(df, name):
df = df[df['供应商名称'] != name]
return df
# 根据 FC 条数排序
def sort_by_fc(df):
df = df.sort_values('FC条数')
return df
# 根据 NC 条数排序
def sort_by_nc(df):
df = df.sort_values('NC条数')
return df
# 查看某个供应商的数据
def view_supplier_data(df, name):
supplier_data = df[df['供应商名称'] == name]
return supplier_data
# 生成数据透视表
def generate_pivot_table(df, pivot_cols, value_col):
pivot = pd.pivot_table(df, values=value_col, index=pivot_cols, aggfunc=sum)
return pivot
# 生成折线图
def generate_line_chart(ws, chart_title, y_axis_title, x_axis_title, data_range):
chart = LineChart()
chart.title = chart_title
chart.y_axis.title = y_axis_title
chart.x_axis.title = x_axis_title
data = Reference(ws, min_col=data_range[0], min_row=data_range[1], max_col=data_range[2], max_row=data_range[3])
categories = Reference(ws, min_col=data_range[0]-1, min_row=data_range[1]+1, max_row=data_range[3])
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
return chart
# 生成柱状图
def generate_bar_chart(ws, chart_title, y_axis_title, x_axis_title, data_range):
chart = BarChart()
chart.title = chart_title
chart.y_axis.title = y_axis_title
chart.x_axis.title = x_axis_title
data = Reference(ws, min_col=data_range[0], min_row=data_range[1], max_col=data_range[2], max_row=data_range[3])
categories = Reference(ws, min_col=data_range[0]-1, min_row=data_range[1]+1, max_row=data_range[3])
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
return chart
# 输入合法性校验
def validate_input(sn, name, demand, fc, nc):
if not isinstance(sn, int) or sn <= 0:
return False
if not isinstance(name, str) or len(name.strip()) == 0:
return False
if not isinstance(demand, int) or demand < 0:
return False
if not isinstance(fc, int) or fc < 0:
return False
if not isinstance(nc, int) or nc < 0:
return False
return True
# 添加新供应商
sn = 10
name = 'xxx'
demand = 100
fc = 50
nc = 50
if validate_input(sn, name, demand, fc, nc):
df = add_supplier(df, sn, name, demand, fc, nc)
# 修改供应商数据
name = 'yyy'
fc = 60
nc = 40
if validate_input(0, name, 0, fc, nc):
df = modify_supplier(df, name, fc, nc)
# 删除供应商数据
name = 'zzz'
df = delete_supplier(df, name)
# 根据 FC 条数排序
df = sort_by_fc(df)
# 根据 NC 条数排序
df = sort_by_nc(df)
# 查看某个供应商的数据
name = 'yyy'
supplier_data = view_supplier_data(df, name)
# 生成数据透视表
pivot_fc = generate_pivot_table(df, ['供应商名称'], 'FC条数')
pivot_nc = generate_pivot_table(df, ['供应商名称'], 'NC条数')
# 创建新的 sheet 页
ws2 = wb.create_sheet('数据透视表')
ws3 = wb.create_sheet('折线图')
ws4 = wb.create_sheet('柱状图')
# 写入数据透视表
for r in dataframe_to_rows(pivot_fc, index=True, header=True):
ws2.append(r)
for r in dataframe_to_rows(pivot_nc, index=True, header=True):
ws2.append(r)
# 生成折线图
chart_fc = generate_line_chart(ws2, 'FC条数折线图', '条数', '供应商名称', (2, 1, 2, len(pivot_fc)+1))
chart_nc = generate_line_chart(ws2, 'NC条数折线图', '条数', '供应商名称', (3, len(pivot_fc)+3, 3, len(pivot_nc)*2+2))
ws3.add_chart(chart_fc, 'A1')
ws3.add_chart(chart_nc, 'A15')
# 生成柱状图
chart_bar = generate_bar_chart(ws2, '条数柱状图', '条数', '供应商名称', (2, 1, 3, len(pivot_nc)*2+2))
ws4.add_chart(chart_bar, 'A1')
# 保存 Excel 文件
wb.save('data.xlsx')
```
这个示例中,我们添加了一些函数来更好地组织代码,同时增加了输入合法性校验来确保数据的正确性。
阅读全文