哪种执行效率更高一点?
我有一个关于考勤汇总的一个dataframe,pandas库的,,我称之为总表,现在是要把它根据不同的条件再次拆分成“所有办公地点的人员需要扣款的”、“所有办公地点的人员无需扣款的”、“总部办公室人员的”,。。。。最终形成一个excel文件,里面就包含了这个“总表”,还有再次拆分出来的另外三个表格,总共四个sheet.,,然后再进一步给生成的各个sheet做一个美化添加边框改字体什么的操作..我该用怎么样的流程去实现~效率会更高一点?我目前有两个想法,
第一个就是这个总表,先保存成一个excel文件,然后用openpyxl库,对这个总表表格文件做一个遍历,然后把遍历到的每一行根据它的实际条件,添加到不同的sheet里面,然后做美化。
第二个就是这个总表的DF,先分成另外三个DF出来,得到四个DF,再生成四个excel文件,然后再用openpyxl去遍历美化,最后用openpyxl把那三个表合并到总表的文件里,形成另外三个sheet,,再把那三个excel表格删除掉。
就这两种想法,,哪种的执行效率会比较高一点,,
或者说,从得到这个总表的df阶段开始,有别的实现方法效率更快的?麻烦告知 从效率的角度来看,第二种想法可能会更高一点。
在第一种想法中,你需要对总表的每一行进行遍历,并根据条件添加到不同的sheet中,这样的操作对于大型数据集可能会比较耗时。同时,由于你需要对每个sheet进行美化操作,可能需要多次遍历和修改,也会增加一定的时间消耗。
而在第二种想法中,你可以先将总表的DF分解成四个DF,生成四个单独的excel文件。然后使用openpyxl遍历和美化这四个文件的各个sheet。最后,你可以使用openpyxl将其他三个文件的sheet合并到总表的文件中,形成另外三个sheet,再删除其他三个excel表格。相比较第一种方法,在第二种方法中,你可以对四个DF和四个excel文件进行并行处理,节省了一些时间。
除此之外,如果你对时间效率要求比较高,还可以考虑使用pandas库的ExcelWriter来直接操作excel文件,从而避免生成中间文件的过程。这样可以减少IO操作,提高效率。
总之,第二种想法可能会更高效一些,但具体的效率还取决于数据量的大小以及美化操作的复杂程度。你可以尝试实现两种方法,并进行测试评估,选择最适合你需求的方式。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-25 10:58
从效率的角度来看,第二种想法可能会更高一点。
在第一种想法中,你需要对总表的每一行进行遍历,并根据 ...
明白。谢 laiyuanjie 发表于 2024-05-25 11:04
明白。谢
不客气,希望能帮到你。如果还有其他问题,随时来问我哦!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-25 11:04
不客气,希望能帮到你。如果还有其他问题,随时来问我哦!
以上回复来自 FishC AI 小助理,如未能正 ...
pandas库的ExcelWriter有没有办法在一个excel文件里生成4个sheet的? laiyuanjie 发表于 2024-05-25 11:06
pandas库的ExcelWriter有没有办法在一个excel文件里生 ...
是的,pandas库的ExcelWriter可以在一个excel文件中生成多个sheet。你可以按照以下步骤来实现:
1. 创建一个ExcelWriter对象,指定要保存的文件路径和文件名:
import pandas as pd
writer = pd.ExcelWriter('output.xlsx')
2. 将不同的DataFrame写入ExcelWriter对象的不同sheet中:
df_sheet1.to_excel(writer, sheet_name='Sheet1')
df_sheet2.to_excel(writer, sheet_name='Sheet2')
df_sheet3.to_excel(writer, sheet_name='Sheet3')
...
在上面的代码中,`df_sheet1`、`df_sheet2`等分别代表要写入的不同DataFrame,`sheet_name`参数用于指定要写入的sheet的名称。
3. 最后,调用ExcelWriter对象的save方法保存文件:
writer.save()
这样就可以将不同的DataFrame写入同一个excel文件的不同sheet中了。请根据你的具体需求修改代码,并适当添加美化操作。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-25 11:06
是的,pandas库的ExcelWriter可以在一个excel文件中生成多个sheet。你可以按照以下步骤来实现:
1....
欧了 laiyuanjie 发表于 2024-05-25 11:07
欧了
很高兴能帮到你!如果还有其他问题,随时来问我哦!祝你编程顺利!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-25 11:06
是的,pandas库的ExcelWriter可以在一个excel文件中生成多个sheet。你可以按照以下步骤来实现:
1....
如果我想把几个DF写进原先有内容的EXCEL表格里面呢? laiyuanjie 发表于 2024-05-26 20:22
如果我想把几个DF写进原先有内容的EXCEL表格里面呢?
如果你想将几个DataFrame写入到已有内容的Excel表格中,可以使用`openpyxl`库来进行操作。下面是一个示例代码:
import pandas as pd
from openpyxl import load_workbook
# 读取已有的Excel表格
book = load_workbook('原始表格.xlsx')
# 创建一个ExcelWriter对象,并指定要写入的Excel文件
writer = pd.ExcelWriter('原始表格.xlsx', engine='openpyxl')
writer.book = book
# 将DataFrame写入到指定的sheet中,注意指定开始写入的单元格位置
df1.to_excel(writer, sheet_name='Sheet1', startrow=<start_row>, startcol=<start_column>, index=False)
df2.to_excel(writer, sheet_name='Sheet2', startrow=<start_row>, startcol=<start_column>, index=False)
df3.to_excel(writer, sheet_name='Sheet3', startrow=<start_row>, startcol=<start_column>, index=False)
# 保存并关闭ExcelWriter对象
writer.save()
writer.close()
在上述代码中:
- `load_workbook`函数用于加载已有的Excel表格。
- 创建`ExcelWriter`对象时,通过`engine='openpyxl'`来指定使用`openpyxl`引擎。
- `writer.book`属性用于将已有的Excel表格关联到`ExcelWriter`对象中。
- 在调用`to_excel`方法时,通过`startrow`和`startcol`参数来指定从哪个单元格开始写入DataFrame的数据,这样可以保留已有数据,并将新的数据添加到相应位置。
请根据你的实际需求修改代码中的路径、sheet名称以及起始行列数等参数,以及添加其他的DataFrame写入操作。
如果有任何问题,请随时向我咨询!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-26 20:23
如果你想将几个DataFrame写入到已有内容的Excel表格中,可以使用`openpyxl`库来进行操作。下面是一个示 ...
如果我要把DF用openpyxl库来写入EXCEL的同时,给这个DF做一些美化,比如添加边框,改变列宽什么等一系列的操作,那么是把DF写入保存在EXCEL表格里面之后保存退出,再重新用openpyxl打开,去添加各种我要的属性,,,还是在一开始写入DF之后就马上可以进行操作~而不必中间保存退出再打开? laiyuanjie 发表于 2024-05-28 14:21
如果我要把DF用openpyxl库来写入EXCEL的同时,给这个D ...
如果你想在使用openpyxl库将DataFrame写入Excel的同时进行美化操作,可以直接在写入DataFrame之后进行操作,而不必保存退出再打开。下面是一个示例代码:
import pandas as pd
from openpyxl import Workbook, load_workbook
from openpyxl.styles import Border, Side
# 创建一个空白的Excel表格
wb = Workbook()
ws = wb.active
# 将DataFrame写入Excel表格
df.to_excel('output.xlsx', index=False, engine='openpyxl', sheet_name='Sheet1')
# 加载已有的Excel表格
wb = load_workbook('output.xlsx')
# 获取指定的sheet
ws = wb['Sheet1']
# 设置边框
border = Border(left=Side(border_style='thin'),
right=Side(border_style='thin'),
top=Side(border_style='thin'),
bottom=Side(border_style='thin'))
for row in ws.iter_rows():
for cell in row:
cell.border = border
# 设置列宽
ws.column_dimensions['A'].width = 15
ws.column_dimensions['B'].width = 12
ws.column_dimensions['C'].width = 20
# 保存修改后的Excel表格
wb.save('output.xlsx')
在上述代码中,首先使用`pandas`将DataFrame写入Excel表格,然后通过`load_workbook`加载已有的Excel文件,并获取到相应的sheet。接着,你可以使用`openpyxl`提供的函数和属性对Excel表格进行美化操作,比如设置边框和列宽。最后,使用`save`方法保存修改后的Excel表格。
请根据你的实际需求修改代码中的路径、sheet名称和具体的美化操作。如果有任何问题,请随时向我咨询!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-28 14:21
如果你想在使用openpyxl库将DataFrame写入Excel的同时进行美化操作,可以直接在写入DataFrame之后进行 ...
如果我的美化,每一列的边框,字体大小,对齐方式等等,都各不相同,那么代码比较好一点的写法是怎么样的 laiyuanjie 发表于 2024-05-29 15:49
如果我的美化,每一列的边框,字体大小,对齐方式等等 ...
如果每一列的边框、字体大小、对齐方式等都各不相同,可以使用一个字典来存储每一列的美化属性,然后在遍历每一列时,根据字典中对应的属性设置进行操作。下面是一个示例代码:
import pandas as pd
from openpyxl import Workbook, load_workbook
from openpyxl.styles import Border, Font, Alignment
# 创建一个空白的Excel表格
wb = Workbook()
ws = wb.active
# 将DataFrame写入Excel表格
df.to_excel('output.xlsx', index=False, engine='openpyxl', sheet_name='Sheet1')
# 加载已有的Excel表格
wb = load_workbook('output.xlsx')
# 获取指定的sheet
ws = wb['Sheet1']
# 定义每一列的美化属性(示例)
column_styles = {
'A': {
'border': Border(left=Side(border_style='thin')),
'font': Font(size=12),
'alignment': Alignment(horizontal='left', vertical='center')
},
'B': {
'border': Border(right=Side(border_style='thick')),
'font': Font(size=14, bold=True),
'alignment': Alignment(horizontal='center', vertical='center')
},
'C': {
'border': Border(top=Side(border_style='medium')),
'font': Font(size=16, italic=True),
'alignment': Alignment(horizontal='right', vertical='center')
}
}
# 遍历每一列,并根据属性设置进行美化操作
for column in ws.columns:
column_letter = column.column_letter
if column_letter in column_styles:
style = column_styles
for cell in column:
cell.border = style['border']
cell.font = style['font']
cell.alignment = style['alignment']
# 保存修改后的Excel表格
wb.save('output.xlsx')
在上述示例代码中,我们定义了一个`column_styles`字典来存储每一列的美化属性。键是列的字母标识,值是一个包含边框、字体和对齐方式的字典。在遍历每一列时,我们根据字典中对应的属性设置对单元格进行美化操作。
请根据你的实际需求修改代码中的路径、sheet名称和具体的美化属性。你可以按照这种方式为每一列设置不同的美化效果。如果有任何问题,请随时向我咨询!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-29 15:50
如果每一列的边框、字体大小、对齐方式等都各不相同,可以使用一个字典来存储每一列的美化属性,然后在 ...
class WriterExcel:
def __init__(self):
pass
def fun_save_sheet(self,sheet,sheet_name,path):
self.sheet = sheet
self.sheet_name = sheet_name
self.path = path
self.excel = vb.load_workbook(self.path)
self.fun_writer_excel()
def fun_writer_excel(self):
self.writer = pd.ExcelWriter(self.path,engine="openpyxl")
self.writer.book = self.excel
self.sheet.to_excel(self.writer,sheet_name=self.sheet_name,startrow=0,startcol=0,index=True)
#从这里接入美化的模块
self.writer.save()
self.writer.close()
如果我是在已有的EXCEL表格里,将一个pandas的DF写入成为一个新的sheet,,,在注释的那个地方接入美化的代码,,有没有问题?
是不是 laiyuanjie 发表于 2024-05-29 17:03
class WriterExcel:
def __init__(self):
...
你的代码基本上是正确的,只是在接入美化的代码时需要做一些修改。以下是修改后的代码示例:
class WriterExcel:
def __init__(self):
pass
def fun_save_sheet(self, sheet, sheet_name, path):
self.sheet = sheet
self.sheet_name = sheet_name
self.path = path
self.excel = load_workbook(self.path)
self.fun_writer_excel()
def fun_writer_excel(self):
self.writer = pd.ExcelWriter(self.path, engine="openpyxl")
self.writer.book = self.excel
# 将DataFrame写入到指定的sheet中,注意指定开始写入的单元格位置
self.sheet.to_excel(self.writer, sheet_name=self.sheet_name, startrow=0, startcol=0, index=True)
# 美化操作(示例)
ws = self.excel
# 设置边框
border = Border(left=Side(border_style='thin'),
right=Side(border_style='thin'),
top=Side(border_style='thin'),
bottom=Side(border_style='thin'))
for row in ws.iter_rows():
for cell in row:
cell.border = border
# 设置列宽
ws.column_dimensions.column_dimensions['A'].width = 15
ws.column_dimensions['B'].width = 12
ws.column_dimensions['C'].width = 20
self.writer.save()
self.writer.close()
在上述代码中,我们使用`load_workbook`函数加载已有的Excel文件,然后通过`self.excel`来获取指定的sheet。在美化操作部分,我们设置了边框和列宽的示例。你可以根据自己的需求对代码进行修改,并添加其他的美化操作。
希望这可以解决你的问题。如有其他疑问,请随时提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-29 17:04
你的代码基本上是正确的,只是在接入美化的代码时需要做一些修改。以下是修改后的代码示例:
class BeautifySheet:
def __init__(self):
pass
def fun_set_excel(self,excel):
self.excel = excel
def fun_beautify(self,sheet_name,dict):
self.sheet = self.excel
self.column_styles = dict
for self.column in self.sheet.columns:
self.column_letter = self.column.column_letter
print(self.column_letter)#即ABCD.....
if self.column_letter in self.column_styles:
self.style = self.column_styles
self.sheet.column_dimensions.width = self.style["width"]#设置列宽
for self.cell in self.column:
self.cell.border = self.style["border"]#边框
self.cell.font = self.style["font"]#字体
self.alignment = self.style["alignment"]#居中方式
from openpyxl.styles import Border, Font, Alignment
from openpyxl import Workbook, load_workbook
from Border import border
total_sheet_styles = {
'A': {
'border': border.l_thick_d_thin,
'font': Font(size=12, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 10
},
'B': {
'border': border.l_thin_d_thin,
'font': Font(size=15, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 12
},
'C': {
'border': border.l_drop_d_thin,
'font': Font(size=12, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 12
},
'D': {
'border': border.l_thick_d_thin,
'font': Font(size=10, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 10
},
'E': {
'border': border.d_thin,
'font': Font(size=10, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 6
},
'F': {
'border': border.l_drop_d_thin,
'font': Font(size=10, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 10
},
'G': {
'border': border.d_thin,
'font': Font(size=10, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 10
},
'H': {
'border': border.l_thin_d_thin,
'font': Font(size=10, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 10
},
'I': {
'border': border.d_thin,
'font': Font(size=10, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 6
},
'J': {
'border': border.l_drop_d_thin,
'font': Font(size=10, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 10
},
'K': {
'border': border.l_thin_d_thin,
'font': Font(size=10, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 10
},
'L': {
'border': border.d_thin,
'font': Font(size=10, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 10
},
'M': {
'border': border.d_thin,
'font': Font(size=10, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 10
},
'N': {
'border': border.l_thin_d_thin,
'font': Font(size=10, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 10
},
'O': {
'border': border.d_thin_r_thick,
'font': Font(size=10, bold=True),
'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
'width' : 10
}
}
为什么表格传入后美化~~单元格不会换行显示
laiyuanjie 发表于 2024-05-31 09:56
class BeautifySheet:
def __init__(self):
...
在你的代码中,单元格不会换行显示的问题可能是因为在设置对齐方式时,未正确指定`wrap_text`属性为`True`。请修改 `fun_beautify` 方法中的以下部分:
self.alignment = self.style
修改为:
self.cell.alignment = self.style['alignment']
此外,在设置列宽时,也应使用正确的语法:
self.sheet.column_dimensions.width = self.style['width']
请根据以上修改,重新运行代码,看看是否能实现单元格换行显示的效果。
如果问题仍然存在,请确保在创建Excel表格时启用了文本自动换行功能。如需启用该功能,请使用以下代码片段:
ws = wb.active
for row in ws.iter_rows():
for cell in row:
cell.alignment = Alignment(wrapText=True)
其中,`wb` 是你的 `Workbook` 对象。将此代码放在 `wb` 加载或创建后,并在进行美化操作前执行,以确保启用了文本自动换行。
希望这些修改能够解决你的问题。如果仍有疑问,请随时提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-5-31 09:56
在你的代码中,单元格不会换行显示的问题可能是因为在设置对齐方式时,未正确指定`wrap_text`属性为`Tr ...
那我的那串代码里,要调整行高得怎么弄 laiyuanjie 发表于 2024-05-31 10:07
那我的那串代码里,要调整行高得怎么弄
要调整行高,你可以在`fun_beautify`方法中添加以下代码来实现:
for row in self.sheet.iter_rows():
for cell in row:
cell.alignment = self.style['alignment']
cell.font = self.style['font']
cell.border = self.style['border']
self.sheet.row_dimensions.height = 20# 设置行高度
将上述代码添加到`for self.cell in self.column:`的循环内部,它会遍历每个单元格,并设置字体、对齐方式、边框以及行高。这里的`20`是行高度的示例值,你可以根据需要调整为合适的值。
在这段代码中,我们使用`self.sheet.row_dimensions.height`来设置行高。`cell.row`表示当前单元格所在的行号,`height`属性则用于设置行高。
请在你的代码中添加上述修改后,再次测试是否能够成功调整行高。如果还有其他疑问,请随时提问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]
2