解决openpyxl操纵带公式的excel或者csv之后,pandas无法读取数值的问题
1 功能特点
- openpyxl:
- 这是一个专门用于操作Excel文件(
.xlsx
/.xlsm
)的库。它提供了丰富的功能来读取、写入和修改Excel文件的各个元素,如单元格、行、列、工作表等。例如,可以通过openpyxl
轻松地创建一个新的Excel工作簿,添加工作表,设置单元格的样式(字体、颜色、对齐方式等)。 - 可以读取Excel文件中的数据并进行逐行、逐列的处理。比如,以下代码片段展示了如何使用
openpyxl
读取一个Excel文件中的数据:
- 这是一个专门用于操作Excel文件(
import openpyxl
# 打开工作簿
workbook = openpyxl.load_workbook('example.xlsx')
# 选择工作表
worksheet = workbook['Sheet1']
# 遍历行和列读取数据
for row in worksheet.iter_rows(values_only=True):
for cell_value in row:
print(cell_value)
- pandas:
pandas
是一个强大的数据处理库,主要用于数据的分析、清洗和操作。它提供了高效的数据结构,如DataFrame
和Series
,可以处理各种类型的数据,包括从CSV文件、数据库、Excel文件等多种数据源获取的数据。- 对于数据的分析和转换非常方便。例如,可以使用
pandas
轻松地对数据进行排序、分组、过滤和聚合操作。以下是一个简单的示例,展示如何使用pandas
读取Excel文件中的数据并进行简单的数据分析:
import pandas as pd
# 读取Excel文件
df = pd.read_excel('example.xlsx')
# 查看数据的前几行
print(df.head())
# 计算某一列的平均值
column_mean = df['column_name'].mean()
print(column_mean)
2 适用场景
- openpyxl适用场景:
- 当需要对Excel文件进行细致的格式设置和底层的文件结构操作时,
openpyxl
是更好的选择。例如,在需要创建具有特定样式的复杂报表,如添加带有各种样式(如不同字体、颜色、边框)的表格、图表,或者需要在Excel文件中插入图像、超链接等元素时,openpyxl
可以很好地完成这些任务。 - 如果主要的工作是和Excel文件本身的交互,比如需要将数据按照Excel的特定格式(如单元格合并、冻结窗格等)进行输出,
openpyxl
提供了更直接的控制。
- 当需要对Excel文件进行细致的格式设置和底层的文件结构操作时,
- pandas适用场景:
- 对于数据分析任务,特别是需要对大量数据进行复杂的分析和处理时,
pandas
是首选。它可以方便地处理缺失数据、进行数据标准化、对数据进行各种统计分析(如计算相关性、协方差等)。 - 当需要从不同数据源(Excel、CSV、SQL数据库等)整合数据并进行统一处理时,
pandas
的强大数据结构和功能使其能够轻松地完成数据的读取、合并和转换。例如,在数据挖掘、机器学习项目的前期数据准备阶段,pandas
可以高效地清理和预处理数据。
- 对于数据分析任务,特别是需要对大量数据进行复杂的分析和处理时,
- 性能方面
- openpyxl:在处理大型Excel文件时,如果只是简单的读写操作,性能表现尚可。但是当涉及到大量的数据处理和复杂的计算时,可能会相对较慢,因为它的设计重点是Excel文件的结构和格式操作。
- pandas:
pandas
在数据处理方面进行了高度优化,对于大量数据的读取、筛选、排序等操作通常具有较高的效率。它使用了一些高效的数据存储和计算方法,能够快速地处理数据,特别是在内存允许的情况下,对大数据集的处理能力更强。
总的来说,
openpyxl
和pandas
各有优势。如果你的主要任务是对Excel文件进行精细的格式设置和文件结构操作,选择openpyxl
;如果重点是数据分析和处理,pandas
会是更好的工具。在实际项目中,有时也可以将两者结合使用,充分发挥它们的优势。还有就是
openpyxl
可以保留excle
原始的公式、样式等,但是pandas
就是纯数据了
3 问题以及解决
目前因为开发需求的原因,因为excel
中带了公式,所以我前面用了openpyxl库,然后生成了一个新的文档,这样文档中带有公式的列就会自动更新并产生新的值。
后面因为pandas在大数据处理这块根据优势,因此选择了pandas,但是遇到的问题是当我用pandas打开并且读取带公式那列的时候,读取出来的全是公式字符,即使用pd.read_excel(data_path,engine='openpyxl',sheet_name="日回收")
也不行,但我想要的是数字。
后面发现在openpyxl
生成后,先打开excle
,然后每次都要我保存,保存之后,再执行pandas
的那部分代码,发现可以读出值了
但我又不可能每次都要这样操作,通过后续查找资料(这里忘记远处了,忘原谅,借原作者代码一用),可以写一个方法,就是在后台去执行上面的操作,如下
# filename是文件路径
def just_open(filename):
xlApp = DispatchEx("Excel.Application")
xlApp.Visible = False
xlBook = xlApp.Workbooks.Open(filename)
xlBook.Save()
xlBook.Close()
这样就解决了openpyxl
和pandas
的衔接