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