解决openpyxl操纵带公式的excel或者csv之后,pandas无法读取数值的问题

1 功能特点

  • openpyxl
    • 这是一个专门用于操作Excel文件(.xlsx/.xlsm)的库。它提供了丰富的功能来读取、写入和修改Excel文件的各个元素,如单元格、行、列、工作表等。例如,可以通过openpyxl轻松地创建一个新的Excel工作簿,添加工作表,设置单元格的样式(字体、颜色、对齐方式等)。
    • 可以读取Excel文件中的数据并进行逐行、逐列的处理。比如,以下代码片段展示了如何使用openpyxl读取一个Excel文件中的数据:
python 复制代码
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是一个强大的数据处理库,主要用于数据的分析、清洗和操作。它提供了高效的数据结构,如DataFrameSeries,可以处理各种类型的数据,包括从CSV文件、数据库、Excel文件等多种数据源获取的数据。
    • 对于数据的分析和转换非常方便。例如,可以使用pandas轻松地对数据进行排序、分组、过滤和聚合操作。以下是一个简单的示例,展示如何使用pandas读取Excel文件中的数据并进行简单的数据分析:
python 复制代码
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提供了更直接的控制。
  • pandas适用场景
    • 对于数据分析任务,特别是需要对大量数据进行复杂的分析和处理时,pandas是首选。它可以方便地处理缺失数据、进行数据标准化、对数据进行各种统计分析(如计算相关性、协方差等)。
    • 当需要从不同数据源(Excel、CSV、SQL数据库等)整合数据并进行统一处理时,pandas的强大数据结构和功能使其能够轻松地完成数据的读取、合并和转换。例如,在数据挖掘、机器学习项目的前期数据准备阶段,pandas可以高效地清理和预处理数据。
  1. 性能方面
    • openpyxl:在处理大型Excel文件时,如果只是简单的读写操作,性能表现尚可。但是当涉及到大量的数据处理和复杂的计算时,可能会相对较慢,因为它的设计重点是Excel文件的结构和格式操作。
    • pandaspandas在数据处理方面进行了高度优化,对于大量数据的读取、筛选、排序等操作通常具有较高的效率。它使用了一些高效的数据存储和计算方法,能够快速地处理数据,特别是在内存允许的情况下,对大数据集的处理能力更强。

总的来说,openpyxlpandas各有优势。如果你的主要任务是对Excel文件进行精细的格式设置和文件结构操作,选择openpyxl;如果重点是数据分析和处理,pandas会是更好的工具。在实际项目中,有时也可以将两者结合使用,充分发挥它们的优势。

还有就是openpyxl可以保留excle原始的公式、样式等,但是pandas就是纯数据了

3 问题以及解决

目前因为开发需求的原因,因为excel中带了公式,所以我前面用了openpyxl库,然后生成了一个新的文档,这样文档中带有公式的列就会自动更新并产生新的值。

后面因为pandas在大数据处理这块根据优势,因此选择了pandas,但是遇到的问题是当我用pandas打开并且读取带公式那列的时候,读取出来的全是公式字符,即使用pd.read_excel(data_path,engine='openpyxl',sheet_name="日回收")也不行,但我想要的是数字。

后面发现在openpyxl生成后,先打开excle,然后每次都要我保存,保存之后,再执行pandas的那部分代码,发现可以读出值了

但我又不可能每次都要这样操作,通过后续查找资料(这里忘记远处了,忘原谅,借原作者代码一用),可以写一个方法,就是在后台去执行上面的操作,如下

python 复制代码
# filename是文件路径
def just_open(filename):
    xlApp = DispatchEx("Excel.Application")
    xlApp.Visible = False
    xlBook = xlApp.Workbooks.Open(filename)
    xlBook.Save()
    xlBook.Close()

这样就解决了openpyxlpandas的衔接

相关推荐
UrbanJazzerati10 小时前
使用Excel制作多类别占比分析字母饼图
excel
The Future is mine14 小时前
Python实现文件夹中文件名与Excel中存在的文件名进行对比,并进行删除操作
excel
超龄超能程序猿17 小时前
(3)机器学习小白入门 YOLOv: 解锁图片分类新技能
python·numpy·pandas·scipy
Tomorrow'sThinker21 小时前
[特殊字符] Excel 读取收件人 + Outlook 批量发送带附件邮件 —— Python 自动化实战
python·excel·outlook
盛夏绽放1 天前
ExcelJS 完全指南:专业级Excel导出解决方案
excel·有问必答
bing_1581 天前
Excel 如何进行多条件查找或求和?
excel
秀儿还能再秀1 天前
基于Excel的数据分析思维与分析方法
数据分析·excel
bing_1581 天前
Excel 如何处理更复杂的嵌套逻辑判断?
excel
weixin_472339461 天前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
灵犀学长1 天前
EasyExcel之SheetWriteHandler:解锁Excel写入的高阶玩法
spring boot·excel