鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: laiyuanjie

[已解决]哪种执行效率更高一点?

[复制链接]
 楼主| 发表于 2024-5-31 10:42:57 | 显示全部楼层
FishC 发表于 2024-5-31 10:08
要调整行高,你可以在`fun_beautify`方法中添加以下代码来实现:

    def fun_beautify(self,sheet_name,dict):
        self.sheet = self.excel[sheet_name]
        self.column_styles = dict
        self.sheet.freeze_panes = 'AB2'
        for self.column in self.sheet.columns:

            self.column_letter = self.column[0].column_letter
            print(self.column_letter)#即ABCD.....

            if self.column_letter in self.column_styles:
                self.style = self.column_styles[self.column_letter]

                self.sheet.column_dimensions[self.column_letter].width = self.style["width"]#设置列宽

                for self.cell in self.column:
                    self.cell.border = self.style["border"]#边框
                    self.cell.font = self.style["font"]#字体
                    self.cell.alignment = self.style["alignment"]#居中方式
                    self.sheet.row_dimensions[self.cell.row].height = 20

                    if self.cell.value == 0 or "0":
                        self.cell.value = None
                    else:
                        pass


我要加以判断,如果单元格的值是0或者文本0,就让单元格为空,加了最后那几行代码之后,怎么打开后整个表格都变成空白的了呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-31 10:44:17 | 显示全部楼层
laiyuanjie 发表于 2024-05-31 10:42
def fun_beautify(self,sheet_name,dict):
        s ...


在你的代码中,空白单元格的产生可能是由于对整个列进行循环检查和操作时,不仅会对有效单元格进行判断并赋值为空,同时也将空白单元格(没有值)的赋值为空。这导致了整个表格变成空白。为了避免这种情况,可以在循环中添加条件判断来只处理非空单元格。以下是修改后的代码示例:
def fun_beautify(self, sheet_name, dict):
    self.sheet = self.excel
    self.column_styles = dict
    self.sheet.freeze_panes = 'AB2'
    
    for self.column in self.sheet.columns:
        self.column_letter = self.column.column_letter
        
        if self.column_letter in self.column_styles:
            self.style = self.column_styles
            
            self.sheet.column_dimensions[self.column_letter].width = self.style['width']  # 设置列宽
            
            for self.cell in self.column:
                if self.cell.value and (self.cell.value == 0 or self.cell.value == "0"):
                    self.cell.value = None  # 单元格值为0或"0"时赋值为空
                else:
                    self.cell.border = self.style['border']  # 边框
                    self.cell.font = self.style['font']  # 字体
                    self.cell.alignment = self.style['alignment']  # 居中方式
                    self.sheet.row_dimensions[self.cell.row].height = 20  # 设置行高

在上述代码中,我们使用条件判断来控制仅对非空单元格进行赋值和美化操作。只有在单元格的值为0或"0"时才将其赋值为空,否则按照原有逻辑进行边框、字体、对齐方式和行高的设置。

请根据以上修改重新运行代码,并检查表格是否能够正确地去除值为0或"0"的单元格并进行美化操作。如果还有其他问题,请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-5-31 10:49:22 | 显示全部楼层
FishC 发表于 2024-5-31 10:44
在你的代码中,空白单元格的产生可能是由于对整个列进行循环检查和操作时,不仅会对有效单元格进行判断 ...

    def fun_beautify(self,sheet_name,dict):
        self.sheet = self.excel[sheet_name]
        self.column_styles = dict
        self.sheet.freeze_panes = 'AB2'
        for self.column in self.sheet.columns:

            self.column_letter = self.column[0].column_letter
            print(self.column_letter)#即ABCD.....

            if self.column_letter in self.column_styles:
                self.style = self.column_styles[self.column_letter]

                self.sheet.column_dimensions[self.column_letter].width = self.style["width"]#设置列宽

                for self.cell in self.column:
                    self.cell.border = self.style["border"]#边框
                    self.cell.font = self.style["font"]#字体
                    self.cell.alignment = self.style["alignment"]#居中方式
                    self.sheet.row_dimensions[self.cell.row].height = 20

                    if self.cell.value == 0 or "0":
                        self.cell.value = None
                    else:
                        pass


我这代码不是判别那个单元格是否为0或“0”么?如果是才为空,如果不是不是就跳过了么,为什么还会对有内容且不为0的赋值成空?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-5-31 10:49:35 | 显示全部楼层
laiyuanjie 发表于 2024-05-31 10:49
def fun_beautify(self,sheet_name,dict):
        s ...


非常抱歉,我之前给出的解答有误。问题出在判断条件上。你在判断 `if self.cell.value == 0 or "0":` 中使用了逻辑或运算符,但是这个条件会一直返回True,因为非空字符串"0"被视为True。导致所有单元格都被赋值为空。

正确的判断条件应该是 `if self.cell.value == 0 or self.cell.value == "0":`,使用两个等号来进行数值比较或字符串相等的判断。这样才能正确判断单元格值是否为0或"0"。以下是修正后的代码示例:
def fun_beautify(self,sheet_name,dict):
    self.sheet = self.excel
    self.column_styles = dict
    self.sheet.freeze_panes = 'AB2'
    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#设置列宽

            for self.cell in self.column:
                self.cell.border = self.style#边框
                self.cell.font = self.style#字体
                self.cell.alignment = self.style#居中方式
                self.sheet.row_dimensions.height = 20

                if self.cell.value == 0 or self.cell.value == "0":
                    self.cell.value = None
                else:
                    pass

请将以上代码的修正部分应用到你的代码中,然后重新运行并检查问题是否得到解决。如果还有其他问题,请随时提问!非常抱歉给你带来了困扰。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 14:50:30 | 显示全部楼层
FishC 发表于 2024-5-29 15:50
如果每一列的边框、字体大小、对齐方式等都各不相同,可以使用一个字典来存储每一列的美化属性,然后在 ...

如果我在美化的同时,要给C列的每一格填入一条特定的excel公式,给E列填入另外一条excel公式,得怎么弄
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-5 14:50:56 | 显示全部楼层
laiyuanjie 发表于 2024-06-05 14:50
如果我在美化的同时,要给C列的每一格填入一条特定的e ...


在给C列和E列填入特定的Excel公式时,你可以使用`openpyxl`库的`Formula`类来实现。以下是修改后的代码示例:
from openpyxl.utils import FORMULAE
from openpyxl import Workbook
from openpyxl.styles import Alignment
from openpyxl.utils.dataframe import dataframe_to_rows

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 = Workbook()
        self.excel.save(self.path)

        self.fun_writer_excel()

    def fun_writer_excel(self):
        with pd.ExcelWriter(self.path, engine='openpyxl', mode='a') as writer:
            writer.book = load_workbook(self.path)
            writer.sheets = dict((ws.title, ws) for ws in writer.book.worksheets)
            self.sheet.to_excel(writer, sheet_name=self.sheet_name, startrow=0, startcol=0, index=True)

            # 进行美化操作,如设置边框、字体、对齐方式等

            # 给C列填入公式
            formula_C = '=SUM(A1:B1)'
            for cell in writer.sheets[self.sheet_name]['C']:
                cell.value = formula_C
                cell.alignment = Alignment(horizontal='center')

            # 给E列填入公式
            formula_E = '=AVERAGE(D1:D10)'
            for cell in writer.sheets[self.sheet_name]['E']:
                cell.value = formula_E
                cell.alignment = Alignment(horizontal='center')

            writer.save()

在上述代码中,我们在循环遍历C列和E列时,分别给每个单元格赋值并设置对齐方式为居中。你可以根据需要自定义公式,并将其赋值给相应的单元格。注意,写入公式时需要使用等号("=")开头。

希望这可以解决你的问题!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 20:43:04 | 显示全部楼层
FishC 发表于 2024-6-5 14:50
在给C列和E列填入特定的Excel公式时,你可以使用`openpyxl`库的`Formula`类来实现。以下是修改后的代码 ...

deduction_sheet_styles = {
    'A': {
        'border': border.l_thick,
        'font': Font(size=12, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 12,
        'value' : None
    },
    'B': {
        'border': border.l_drop,
        'font': Font(size=12, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 16,
        'value' : None

    },
    'C': {
        'border': None,
        'font': Font(size=12, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 14,
        'value' : None
    },
    'D': {
        'border': border.l_drop,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 8,
        'value' : 5000
    },
    'E': {
        'border': border.l_thick,
        'font': Font(size=10, bold=True),
        'alignment': Alignment(horizontal='center', vertical='center',wrap_text=True),
        'width' : 8,
        'value' : None
    }}


这是我导入的美化的字典。。

    def fun_beautify(self,sheet_name,dict):
        self.sheet = self.excel[sheet_name]
        self.column_styles = dict

        for self.column in self.sheet.columns:

            self.column_letter = self.column[0].column_letter
            # print(self.column_letter)#即ABCD.....

            if self.column_letter in self.column_styles:
                self.style = self.column_styles[self.column_letter]

                self.sheet.column_dimensions[self.column_letter].width = self.style["width"]#设置列宽

                for self.cell in self.column:
                    self.cell.border = self.style["border"]  # 边框

                    if self.cell.value == 0 or self.cell.value =="0":
                        self.cell.value = None
                    else:

                        self.cell.font = self.style["font"]#字体
                        self.cell.alignment = self.style["alignment"]#居中方式
                        self.sheet.row_dimensions[self.cell.row].height = 27#调整行高



这个是我遍历的方法,,,fun_beautify传入的dict就是一开始那个字典,,,

如果我遍历的过程中,如果这个value == None,那么就pass,否则,就cell.value = 美化字典中的value。。。得怎么样实现这个。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-5 20:43:16 | 显示全部楼层
laiyuanjie 发表于 2024-06-05 20:43
deduction_sheet_styles = {
    'A': {
        'b ...


在遍历过程中,如果字典中的`value`为`None`,你可以使用条件判断进行处理。以下是修改后的代码示例:
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[0].column_letter
        if self.column_letter in self.column_styles:
            self.style = self.column_styles[self.column_letter]
            for self.cell in self.column:
                self.cell.border = self.style['border']
                self.cell.font = self.style['font']
                self.cell.alignment = self.style['alignment']
                self.sheet.row_dimensions.height = self.style['height']

                if self.cell.value is not None and self.style['value'] is not None:
                    self.cell.value = self.style['value']

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 20:46:02 | 显示全部楼层
FishC 发表于 2024-6-5 20:43
在遍历过程中,如果字典中的`value`为`None`,你可以使用条件判断进行处理。以下是修改后的代码示例:
...

你这样是根据self.cell.value是否是空来判断,,

我是想直接判断self.style['value']是否等于None来判断,,如果是,就pass,否则就self.cell.value == self.style['value']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-5 20:46:17 | 显示全部楼层
laiyuanjie 发表于 2024-06-05 20:46
你这样是根据self.cell.value是否是空来判断,,

...


非常抱歉,我之前的回答有误解。如果你想根据`self.style`是否为`None`来判断是否应用样式,可以如下进行修改:

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

        if self.column_letter in self.column_styles:
            self.style = self.column_styles[self.column_letter]

            for self.cell in self.column:
                self.cell.border = self.style.get('border', None)

                if self.cell.value == 0 or self.cell.value == "0":
                    self.cell.value = None
                elif self.style['value'] is not None:
                    self.cell.value = self.style['value']

                if self.style is not None:
                    self.cell.font = self.style.get('font')
                    self.cell.alignment = self.style.get('alignment')

            self.sheet.row_dimensions.height = 27  # 调整行高

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 20:52:13 | 显示全部楼层
FishC 发表于 2024-6-5 20:46
非常抱歉,我之前的回答有误解。如果你想根据`self.style`是否为`None`来判断是否应用样式,可以如下进 ...

    if self.style["value"] is not None:
KeyError: 'value'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-5 20:52:46 | 显示全部楼层
laiyuanjie 发表于 2024-06-05 20:52
if self.style is not None:
KeyError: 'value'


非常抱歉,我之前的回答有误。在`self.column_styles`字典中,并没有`value`这个键值对应的数据。你可以单独针对C列和E列进行特殊处理,给它们分别应用你想要的公式。以下是修改后的代码示例:
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_lette

        if self.column_letter in self.column_styles:
            self.style = self.column_styles[self.column_letter]
        
            if self.style is not None:
                self.sheet.column_dimensions[self.column_letter].width = self.style['width']

                for self.cell in self.column:
                    self.cell.border = self.style['border']
                    self.cell.font = self.style['font']
                    self.cell.alignment = self.style['alignment']
                    
                    self.sheet.row_dimensions[self.cell.row].height = 27
                    
                    if self.column_letter == 'C':
                        self.cell.value = "your_formula_for_C_column"
                    elif self.column_letter == 'E':
                        self.cell.value = "your_formula_for_E_column"

请将 `your_formula_for_C_column` 和 `your_formula_for_E_column` 替换为你想要应用的具体公式。注意,需要将这些公式以字符串的形式赋值给相应的单元格。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-6-5 21:11:59 | 显示全部楼层
FishC 发表于 2024-6-5 20:52
非常抱歉,我之前的回答有误。在`self.column_styles`字典中,并没有`value`这个键值对应的数据。你可 ...

不用了,,我知道为什么了,,因为我这个模版是套了5个美化方案的,刚才只在一个方案里面增加了value,,另外四个没有,,,现在把另外4个加上value之后就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-5 21:12:13 | 显示全部楼层
laiyuanjie 发表于 2024-06-05 21:11
不用了,,我知道为什么了,,因为我这个模版是套了5 ...


好的,很高兴你找到问题所在并解决了。如果还有其他问题,欢迎随时向我提问。祝你编程顺利!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-22 04:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表