j2333234 发表于 2024-6-21 11:41

python实现excel替换碰到日期格式替换成数字或者直接替换不了

功能源代码如下,替换测试文字没有问题,但是会碰到2个问题,1.xlsx文件,日期转换不成功,xls文件日期转换成功,但会变成对应的数字。2.替换完成后,原表格格式没了。
def replace_content_in_excel(file, original_text, new_text, callback=None):
    try:
      original_text = str(original_text)
      logging.info(f"尝试处理 Excel 文件: {file}")

      if file.endswith('.xlsx'):
            # 使用 openpyxl 处理 xlsx 文件
            workbook = openpyxl.load_workbook(file)
            for sheet in workbook:
                for row in sheet.iter_rows():
                  for cell in row:
                        if cell.value is not None and original_text in str(cell.value):
                            if isinstance(cell.value, str):# 如果单元格值是字符串
                              cell.value = cell.value.replace(original_text, new_text)
                            elif isinstance(cell.value, (int, float)):# 如果单元格值是数值(可能是日期的序列号)
                              # 这里需要根据实际情况进行日期格式的处理
                              pass# 根据需要进行日期格式处理
                            else:
                              pass# 其他类型的数据,根据需要进行处理
            workbook.save(file)

      elif file.endswith('.xls'):
            # 使用 xlrd 打开 xls 文件
            logging.info(f"使用 xlrd 打开 Excel 文件: {file}")
            workbook_rd = xlrd.open_workbook(file, formatting_info=True)
            # 使用 xlwt 创建新的工作簿对象
            workbook_wr = xlwt.Workbook()
            for sheet_index in range(workbook_rd.nsheets):
                worksheet_rd = workbook_rd.sheet_by_index(sheet_index)
                worksheet_wr = workbook_wr.add_sheet(workbook_rd.sheet_names(), cell_overwrite_ok=True)
                for row in range(worksheet_rd.nrows):
                  for col in range(worksheet_rd.ncols):
                        cell_value = worksheet_rd.cell_value(row, col)
                        if isinstance(cell_value, str) and original_text in cell_value:
                            new_cell_value = cell_value.replace(original_text, new_text)
                            worksheet_wr.write(row, col, new_cell_value)
                        else:
                            worksheet_wr.write(row, col, cell_value)

            # 保存新文件并覆盖原文件
            workbook_wr.save(file)

      if callback:
            callback()

      logging.info(f"成功处理 Excel 文件: {file}")
      return True

    except Exception as e:
      logging.error(f"处理 Excel 文件 {file} 时出错: {e}")
      return False

goditorjoker 发表于 2024-6-21 21:03

意见仅供参考:
前言:我习惯使用pandas库处理关系型数据,这是一个利用openpyxl或xlrd等库读取文件的库。
1、python中有的库读取日期数据自动识别转换成时间类型数据,可能就不是字符串了,可以用type()检查一下。"xls文件日期转换成功,但会变成对应的数字"我不知道是什么意思;
2、我猜测你的方法类似于指针,实际上是在修改原文件.所以可能需要复制一份新文件,
个人建议:
换pandas库

dleo 发表于 2024-6-22 21:06

xlrd.sheet.Cell 有个判断类型的 cell_type(rowx, colx)

API Reference — xlrd 2.0.1 documentation
https://xlrd.readthedocs.io/en/latest/api.html?highlight=cell_type#xlrd.sheet.Cell

Type symbol        Type number        Python value
XL_CELL_EMPTY        0        empty string ''
XL_CELL_TEXT        1        a Unicode string
XL_CELL_NUMBER        2        float
XL_CELL_DATE        3        float
XL_CELL_BOOLEAN        4        int; 1 means TRUE, 0 means FALSE
XL_CELL_ERROR        5        int representing internal Excel codes; for a text representation, refer to the supplied dictionary error_text_from_code
XL_CELL_BLANK        6        empty string ''. Note: this type will appear only when open_workbook(..., formatting_info=True) is used.


当这个类型是3表示是日期类型的,可以用xlrd.xldate直接处理了

API Reference — xlrd 2.0.1 documentation
https://xlrd.readthedocs.io/en/latest/api.html?highlight=cell_type#module-xlrd.xldate





j2333234 发表于 2024-6-23 09:52

goditorjoker 发表于 2024-6-21 21:03
意见仅供参考:
前言:我习惯使用pandas库处理关系型数据,这是一个利用openpyxl或xlrd等库读取文件的库。 ...

好的,感谢,我试试
页: [1]
查看完整版本: python实现excel替换碰到日期格式替换成数字或者直接替换不了