python用workbook类方法带格式保存excel

本文介绍了一种使用Python将数据格式化并自动导出到Excel的方法,包括如何添加工作表、设置单元格格式、调整行高列宽,以及如何处理特定数据类型,如将小数转换为百分比和格式化日期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要步骤:

  • 1.用add_worksheet添加一个新的工作表,sheetname为工作表名称
  • 2.用add_format在工作表中创建一个新的格式对象来格式化单元格
  • 3.用set_row和set_column方法设置sheet表单元格的行高和列宽
  • 4.用write方法将普通数据写入单元格中

本例是直接将现有数据存到excel为例的

def change_format(self,df, writer, Item):
	"""
	修改dataframe的数据格式,如小数转为%,日期改成%Y-%m-%d
	"""
	df.to_excel(writer, sheet_name=Item, index=False)
	workbook = writer.book
	worksheet = writer.sheets[Item]
	cell_fmt = {'bold': False, 'font_name': '微软雅黑', 'font_size': 8, 'align': 'center', 'valign': 'vcenter',
	            'border': 0,'text_wrap':True}
	header_fmt = {'bold': True, 'font_name': '微软雅黑', 'font_size': 6, 'align': 'center', 'valign': 'vcenter',
	              'border': 0, 'bg_color': '#808080','text_wrap':True}
	cell_format = workbook.add_format(cell_fmt)
	header_format = workbook.add_format(header_fmt)

	df_col = [each for each in df.columns if each not in ['date', 'cus_type', '活跃人数','ad_channel','当日游客数','当日设备数']]
	# format 部分列进行%和保留两位小数处理
	if '比例' in list(df.iloc[:,0]):
	    for i in range(row_num,df.shape[0]):
	        for j in df_col:
	            try:
	                if float(df.loc[i,j])<=1:
	                    df.loc[i, j] = str(df.loc[i, j]*100)[:4]+ '%'
	                    print(df.loc[i, j])
	            except Exception as ExceptionError:
	                print('format % 每日新增数据格式处理 比例异常',ExceptionError)
	                pass
	elif '人均' in list(df.iloc[:,0]):
	    for i in range(row_num,df.shape[0]):
	        for j in df_col:
	            try:
	                df.loc[i, j] = np.round(df.loc[i, j],2)
	            except Exception as ExceptionError:
	                print('format % 每日新增数据格式处理 人均异常',ExceptionError)
	                pass
	else:
	    pass
	#format datetime
	for k in range(df.shape[0]):
	    try:
	        df.iloc[k,0] = pd.to_datetime(df.iloc[k,0]).strftime("%Y-%m-%d")
	    except Exception as ExceptionError:
	        print('时间格式处理异常:', str(ExceptionError))
	        pass
	# 列标题单元格格式处理
	# for colx, value in enumerate(df.columns.values):
	#     worksheet.write(0, colx, value, header_format)
	#     worksheet.write(row_num+1, colx, value, header_format)
	# A:C列宽16,D:Z列宽8,并全部按照cell_format格式处理
	worksheet.set_column('A:C', 16, cell_format)
	worksheet.set_column('D:Z', 8, cell_format)
	df.to_excel(writer, sheet_name=Item, index=False)
<think>我们被要求使用Python的Pandas库通过Workbook读写Excel文件。但是,需要注意的是,Pandas本身并不直接支持使用openpyxl的Workbook对象进行读写。Pandas通常使用`read_excel`函数读取Excel文件,该函数返回一个DataFrame;使用`to_excel`方法将DataFrame写入Excel文件。在底层,Pandas使用openpyxl(对于.xlsx文件)或xlrd等库来操作Excel文件。 然而,用户提到了“使用Workbook读写Excel文件”,可能是指使用openpyxl的Workbook对象。我们可以有两种方式: 1. 直接使用openpyxl库操作Excel文件(但问题要求使用pandas)。 2. 结合pandas和openpyxl:pandas在读写Excel文件时,可以指定engine参数为'openpyxl',但读写操作仍然是基于文件路径的,而不是直接操作Workbook对象。 如果我们想要在内存中操作而不保存为文件,pandas提供了一种方式:使用`pd.ExcelWriter`结合`io.BytesIO`或`io.StringIO`来读写内存中的Excel文件。但是,这仍然不是直接传递Workbook对象。 实际上,pandas的`read_excel`函数可以接受一个openpyxl的Workbook对象吗?答案是不直接接受。通常,`read_excel`接受文件路径、文件类对象或类似路径的对象。 但是,我们可以通过以下方式间接使用: - 如果已经有一个openpyxl的Workbook对象,我们可以将其保存到一个字节流,然后让pandas从这个字节流读取。 - 同样,写入时,我们可以先让pandas写入到一个字节流,然后用openpyxl加载这个字节流得到Workbook对象。 不过,用户的问题可能只是希望使用pandas读写Excel文件,而并不一定需要直接操作Workbook。因此,我们可以先给出常规的pandas读写Excel文件的方法,然后再介绍如何与openpyxl的Workbook对象进行交互。 根据引用[1][2][3][4]提供的信息,pandas读写Excel文件的基本方法如下: 读取Excel文件: ```python import pandas as pd df = pd.read_excel('filename.xlsx', sheet_name='Sheet1') ``` 写入Excel文件: ```python df.to_excel('output.xlsx', sheet_name='Sheet1', index=False) ``` 但是,如果用户确实需要操作Workbook对象(例如,需要在写入前或读取后对Excel文件进行更复杂的操作),我们可以结合使用pandas和openpyxl。 ### 结合openpyxl的Workbook对象 #### 读取 如果我们已经有一个openpyxl的Workbook对象(例如,从其他来源获得),我们可以将其保存到字节流,然后用pandas读取: ```python from openpyxl import load_workbook import pandas as pd from io import BytesIO # 假设我们有一个Workbook对象,例如从网络下载或内存中创建 wb = load_workbook('existing_file.xlsx') # 或者从其他来源获得 # 将Workbook保存到字节流 wb_bytes = BytesIO() wb.save(wb_bytes) wb_bytes.seek(0) # 将指针移回文件开头 # 用pandas读取 df = pd.read_excel(wb_bytes, engine='openpyxl') ``` #### 写入 如果我们想将DataFrame写入到一个新的Workbook对象(不保存为文件,而是内存中的Workbook对象),可以这样做: ```python from openpyxl import Workbook from io import BytesIO import pandas as pd # 创建一个DataFrame df = pd.DataFrame({'A': [1, 2], 'B': [3, 4]}) # 使用BytesIO作为中间存储 output = BytesIO() with pd.ExcelWriter(output, engine='openpyxl') as writer: df.to_excel(writer, sheet_name='Sheet1', index=False) # 将字节流指针移回开始 output.seek(0) # 用openpyxl加载这个字节流,得到Workbook对象 wb = load_workbook(output) ``` 这样,我们就得到了一个openpyxl的Workbook对象`wb`,可以继续用openpyxl操作它,最后保存到文件或发送出去。 ### 注意事项 1. 在写入时,使用`pd.ExcelWriter`,指定engine为'openpyxl',并且使用一个字节流(BytesIO)作为文件。 2. 读取时,将Workbook对象保存到字节流,然后让pandas从这个字节流读取。 ### 总结 虽然pandas不直接支持传递Workbook对象,但我们可以通过内存中的字节流(BytesIO)来桥接pandas和openpyxl的Workbook对象。 因此,回答用户的问题:可以使用pandas结合openpyxl的Workbook对象进行读写,但需要借助字节流。 下面给出完整的代码示例: ### 示例:读取一个已有的Workbook对象并转换为DataFrame ```python import pandas as pd from openpyxl import load_workbook from io import BytesIO # 加载一个已有的Excel文件到Workbook对象 wb = load_workbook('existing_file.xlsx') # 将Workbook保存到BytesIO流 wb_bytes = BytesIO() wb.save(wb_bytes) wb_bytes.seek(0) # 用pandas读取 df = pd.read_excel(wb_bytes, engine='openpyxl', sheet_name='Sheet1') print(df) ``` ### 示例:将DataFrame写入到新的Workbook对象 ```python import pandas as pd from openpyxl import Workbook from openpyxl import load_workbook from io import BytesIO # 创建一个DataFrame df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) # 使用BytesIO作为中间存储 output = BytesIO() # 使用ExcelWriter写入字节流 with pd.ExcelWriter(output, engine='openpyxl') as writer: df.to_excel(writer, sheet_name='Sheet1', index=False) # 将指针移回开始 output.seek(0) # 加载为Workbook对象 wb = load_workbook(output) # 现在wb是一个Workbook对象,可以继续操作,例如保存到文件 wb.save('new_file.xlsx') ``` ### 注意事项 - 在写入时,如果使用`pd.ExcelWriter`,它默认会创建一个新的Workbook。如果我们要在已有的Workbook上追加工作表,需要先加载已有的Workbook,然后传递给`pd.ExcelWriter`。但是,pandas的`to_excel`方法会覆盖整个文件,所以追加工作表需要特殊处理。通常,我们更建议直接使用openpyxl来追加工作表。 - 如果只是简单地读写整个工作表,使用pandas的`read_excel`和`to_excel`就足够了。 ### 相关问题 根据要求,生成相关问题: §§相关问题§§ 1. 如何用pandas读取Excel文件的多个工作表? 2. 如何将多个DataFrame写入同一个Excel文件的不同工作表? 3. 如何用openpyxl修改已有的Excel文件并保存? 4. pandas读取Excel文件时如何指定数据类型? 5. 如何避免pandas写入Excel文件时覆盖原有数据?</think>### 使用 Python Pandas 通过 Workbook 读写 Excel 文件 在 Pandas 中,虽然不直接使用 `Workbook` 对象,但可以通过 `openpyxl` 引擎实现完整的 Excel 读写操作。以下是具体方法: --- #### **1. 读取 Excel 文件** ```python import pandas as pd # 读取整个文件(自动识别引擎) df = pd.read_excel('input.xlsx', sheet_name='Sheet1') # 可指定工作表 # 读取特定区域(如跳过首行) df = pd.read_excel('input.xlsx', skiprows=1, usecols='A:C') # 只读A-C列 ``` **关键参数说明**: - `sheet_name`:工作表名或索引(默认0) - `skiprows`:跳过的行数 - `usecols`:指定读取的列(如 `'A:C'` 或 `[0,2]`) - `engine='openpyxl'`:强制使用 openpyxl 引擎(适用于 .xlsx) --- #### **2. 写入 Excel 文件** ```python # 创建示例 DataFrame data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30]} df = pd.DataFrame(data) # 写入新文件 df.to_excel('output.xlsx', sheet_name='Users', index=False) # 不写入索引列 ``` **关键参数说明**: - `sheet_name`:自定义工作表名 - `index=False`:不写入行索引 - `engine='openpyxl'`:确保写入 .xlsx 格式 - `startrow`/`startcol`:指定起始位置(如 `startrow=2`) --- #### **3. 追加数据到已有文件** 需结合 `openpyxl` 避免覆盖: ```python from openpyxl import load_workbook # 加载已有工作簿 book = load_workbook('existing.xlsx') # 追加新数据 with pd.ExcelWriter('existing.xlsx', engine='openpyxl') as writer: writer.book = book # 绑定已加载的工作簿 writer.sheets = {ws.title: ws for ws in book.worksheets} # 映射工作表 # 追加到新工作表(避免覆盖原数据) df.to_excel(writer, sheet_name='NewSheet', index=False) ``` --- #### **4. 批量处理多个文件** ```python import os all_data = pd.DataFrame() folder_path = '/path/to/excels' for file in os.listdir(folder_path): if file.endswith('.xlsx'): # 读取每个文件并合并 df = pd.read_excel(os.path.join(folder_path, file)) all_data = pd.concat([all_data, df]) # 写入汇总文件 all_data.to_excel('combined.xlsx', index=False) ``` --- #### **注意事项** 1. **依赖库安装**: ```bash pip install pandas openpyxl ``` 2. **数据类型一致性**: - 读取时用 `dtype` 参数指定列类型(如 `dtype={'ID': str}`) - 避免数值被误识别为浮点数 3. **大文件优化**: - 使用 `chunksize` 分块读取 - 关闭自动格式:`pd.ExcelWriter(..., engine='openpyxl', mode='a', if_sheet_exists='replace')` > 引用说明:Pandas 通过 `openpyxl` 引擎实现 Excel 文件操作,支持读写 .xlsx 格式并保留公式和格式[^1][^3]。对于复杂格式修改(如单元格样式),建议直接使用 `openpyxl` 库。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值