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
      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["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.height = 20

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


我要加以判断,如果单元格的值是0或者文本0,就让单元格为空,加了最后那几行代码之后,怎么打开后整个表格都变成空白的了呢?

FishC 发表于 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.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.height = 20# 设置行高

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

laiyuanjie 发表于 2024-5-31 10:49:22

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

    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["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.height = 20

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


我这代码不是判别那个单元格是否为0或“0”么?如果是才为空,如果不是不是就跳过了么,为什么还会对有内容且不为0的赋值成空?

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

laiyuanjie 发表于 2024-6-5 14:50:30

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

如果我在美化的同时,要给C列的每一格填入一条特定的excel公式,给E列填入另外一条excel公式,得怎么弄

FishC 发表于 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['C']:
                cell.value = formula_C
                cell.alignment = Alignment(horizontal='center')

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

            writer.save()

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

laiyuanjie 发表于 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
      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"]# 边框

                  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.height = 27#调整行高



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

如果我遍历的过程中,如果这个value == None,那么就pass,否则,就cell.value = 美化字典中的value。。。得怎么样实现这个。

FishC 发表于 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.column_letter
      if self.column_letter in self.column_styles:
            self.style = self.column_styles
            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 小助理,如未能正确解答您的问题,请继续追问。

laiyuanjie 发表于 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']

FishC 发表于 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

            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 小助理,如未能正确解答您的问题,请继续追问。

laiyuanjie 发表于 2024-6-5 20:52:13

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

    if self.style["value"] is not None:
KeyError: 'value'

FishC 发表于 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
      
            if self.style is not None:
                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.cell.alignment = self.style['alignment']
                  
                  self.sheet.row_dimensions.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 小助理,如未能正确解答您的问题,请继续追问。

laiyuanjie 发表于 2024-6-5 21:11:59

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

不用了,,我知道为什么了,,因为我这个模版是套了5个美化方案的,刚才只在一个方案里面增加了value,,另外四个没有,,,现在把另外4个加上value之后就可以了

FishC 发表于 2024-6-5 21:12:13

laiyuanjie 发表于 2024-06-05 21:11
不用了,,我知道为什么了,,因为我这个模版是套了5 ...

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: 1 [2]
查看完整版本: 哪种执行效率更高一点?