首页 > 解决方案 > 通过 Python 将 Excel 文件保存为 CSV

问题描述

语言:Python 3.8
平台:MacOS 11 | Windows 10
文件类型:.xlsx | .csv。
任务:文件/格式转换

概要:我的 excel 文件包含带有函数/公式的单元格。我想将此文件保存为 .csv,同时保留公式的值(不是函数的实际字符串,本身)

工作原理:暂停脚本,提示用户打开 Excel > '另存为' .csv // Excel 处理单元格内的函数并在另存为 .csv 之前保留值

什么不起作用:使用 pandas 或 openpyxl 将 excel 文件转换为 .csv(例如 'wb.save' 和 'df.to_csv' // 生成的 .csv 文件不处理函数单元格,而是不输出任何内容在那些细胞内。

问题:无论如何在 Python 脚本中利用 excel 的“处理函数并保存值”函数?

谢谢!

示例代码 - 熊猫

df = pd.read_excel('file.xlsx')
df.to_csv('file.csv')

示例代码 - Openpyxl

wb = openpyxl.load_workbook('file.xlsx', data_only=True)
sheet = wb.active
with open('file.csv', 'w', newline="") as f:
c = csv.writer(f)
for r in sheet.iter_rows():
c.writerow([cell.value for cell in r])
wb.save('file.csv')

示例问题

Excel 列:

A: ['First Initial']
B: ['Last Name']
C: ['Email']

C列中所有行的公式:

C1: [=CONCATENATE(A1,".",B1,"@domain.net")]
C2: [=CONCATENATE(A2,".",B2,"@domain.net")]
C3: [=CONCATENATE(A3,".",B3,"@domain.net")]
etc.

'file.xlsx' 通过 excel & 'file.csv' 输出(通过 excel > 'Save As' .csv):

A1: ['j']
B1: ['doe']
C1: ['j.doe@domain.net']

遵循 Pandas 示例代码后的“file.csv”输出:

A1: ['j']
B1: ['doe']
C1: ['']

如果单元格不包含公式,则转换会在单元格内输出正确的值。对于带有公式的单元格,这些单元格是空的(因为 .csv 只是纯文本)。有没有办法复制excel首先运行函数>将输出值保存到单元格>另存为.csv的行为?

更新:

所以我发现了这个问题,虽然不知道如何解决这个问题。当我创建一个新的 .xlsx 并尝试示例代码时,Pandas 会按预期工作。但它不适用于我脚本中的 .xlsx - 我将其缩小到这一步

以下是我的脚本中的一个片段,它将值从一个 excel 文件复制到另一个文件中:

wb1 = xl.load_workbook('/file1.xlsx')
ws1 = wb1.worksheets[0]

wb2 = xl.load_workbook('/file2.xlsx')
ws2 = wb2.active

mr = ws1.max_row
mc = ws1.max_column

for i in range (1, mr + 1):
    for j in range (1, mc + 1):
        c = ws1.cell(row = i, column = j)
        ws2.cell(row = i, column = j).value = c.value


wb2.save('file2.xlsx')

该文件('file2.xlsx')虽然看起来像普通的 excel 文件一样打开和运行,但在通过 pandas 将其转换为 .csv 后,不会将其值保留在具有公式的单元格中。

但是,文件 ('file1.xlsx') 可以做到这一点。

但是,如果我打开 'file2.xlsx' 并简单地保存它(不更改任何内容),然后尝试通过 pandas 进行转换 - 它最终会保留公式中的值。

所以我的代码中肯定有问题(惊喜,惊喜)这样做。不过不知道为什么。

标签: pythonexcelpandascsvopenpyxl

解决方案


解决了

我能够解决我自己的问题 - 在这里为有类似问题的其他人发布它(搜索这个问题让我相信你会存在,所以你去吧。)

注意:这仅适用于安装了 Excel 的 Windows 系统

import win32com.client as win32
from win32com.client import Dispatch
from win32com.client import constants as c

    excel = Dispatch('Excel.Application') # Calls Excel
    excel.DisplayAlerts = False # Disables prompts, such as asking to overwrite files
    wb = excel.Workbooks.Open("/file.xlsx") # Input File
    wb.SaveAs("/file.csv"), c.xlCSV) # Output File
    excel.Application.Quit() # Close Excel
    excel.DisplayAlerts = True # Turn alerts back on

推荐阅读