Python复制旧.XLS文件指定行并保留单元格格式的技术咨询
解决XLS文件日期格式保留的行复制问题
一、用xlrd实现日期格式保留
你当前的问题是row_values()直接把日期转成了浮点数,xlrd其实可以通过单元格类型判断+格式解析来保留日期的显示格式:
不要直接用
row_values(),而是逐个遍历单元格,判断每个单元格的类型:- 如果是日期类型(
xlrd.XL_CELL_DATE),先通过xldate_as_datetime把浮点数转成datetime对象 - 然后获取该单元格的格式字符串,用datetime的
strftime()按照原格式输出
- 如果是日期类型(
修改后的函数示例:
import xlrd from datetime import datetime def copy_xls_row(file_name, req_code): rows_list = [] wb = xlrd.open_workbook(file_name, formatting_info=True) sheet = wb.sheet_by_index(0) # 获取所有格式信息 format_map = wb.format_map for row_num in range(sheet.nrows): row_data = [] for col_num in range(sheet.ncols): cell = sheet.cell(row_num, col_num) cell_value = cell.value # 判断是否为日期单元格 if cell.ctype == xlrd.XL_CELL_DATE: # 转成datetime对象 dt = xlrd.xldate_as_datetime(cell_value, wb.datemode) # 获取单元格的格式索引,拿到格式字符串 fmt_idx = cell.xf_index fmt = format_map[fmt_idx] # 处理自定义日期格式,映射xlrd格式符到strftime格式符 date_fmt = fmt.format_str.replace('yyyy', '%Y').replace('mm', '%m').replace('dd', '%d')\ .replace('hh', '%H').replace('ss', '%S') # 格式化日期 row_data.append(dt.strftime(date_fmt)) else: # 非日期单元格直接转字符串 row_data.append(str(cell_value)) # 检查当前行是否包含目标代码 if req_code in row_data: row_as_string = " ".join(row_data) rows_list.append(row_as_string) return rows_list
注意:xlrd的格式符和strftime不完全一致,可能需要根据实际遇到的自定义格式调整映射规则,比如yyyy年mm月dd日这类格式,直接替换成%Y年%m月%d日即可。
二、无需转XLSX的替代模块
如果觉得xlrd处理自定义格式太麻烦,可以用以下方案:
1. win32com.client(仅Windows环境)
直接调用本地Excel应用,完全保留原文件的格式,相当于模拟人工操作:
import win32com.client as win32 def copy_xls_row_win32(file_name, req_code): rows_list = [] excel = win32.Dispatch("Excel.Application") excel.Visible = False # 后台运行不显示Excel窗口 wb = excel.Workbooks.Open(file_name) sheet = wb.Sheets(1) row_count = sheet.UsedRange.Rows.Count col_count = sheet.UsedRange.Columns.Count for row_num in range(1, row_count + 1): # 读取整行的显示文本(完全保留原格式) row_data = [sheet.Cells(row_num, col_num).Text for col_num in range(1, col_count + 1)] if req_code in row_data: row_as_string = " ".join(row_data) rows_list.append(row_as_string) wb.Close(SaveChanges=False) excel.Quit() return rows_list
这个方法不用手动处理格式映射,Excel会直接返回单元格显示的文本,自定义日期、数值格式都能完美保留。
2. pyxlsb(跨平台兼容)
如果需要跨平台处理,pyxlsb支持读取二进制XLSB文件,也兼容普通XLS,不过格式解析需要额外处理,适合对跨平台有要求的场景。
内容的提问来源于stack exchange,提问作者kazalagupagu
相关产品推荐
相关产品推荐

