python - 通过 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 进行转换 - 它最终会保留公式中的值。
所以我的代码中肯定有问题(惊喜,惊喜)这样做。不过不知道为什么。
解决方案
解决了
我能够解决我自己的问题 - 在这里为有类似问题的其他人发布它(搜索这个问题让我相信你会存在,所以你去吧。)
注意:这仅适用于安装了 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
推荐阅读
- django - 超级用户创建错误 NOT NULL 约束失败
- stm32 - stm32和外接flash(w25q)连接问题
- nginx - 如何解决 nginx 中的“没有实时上游”错误?
- python - Python/Kivy 立即崩溃
- apache-camel - Apache Camel ActiveMQ 组件是否保证将消息传递给代理?
- javascript - jQuery - 使用 :contains 选择然后更改内容
- php - 如果它具有特定的 php 函数,有没有办法跟踪 html 标签?
- javascript - 为什么在 mapToDispatch ownProps 中没有正确填充连接的道具?
- list - 如何在 TCL 中逐行拆分变量?
- mockito - 如何验证多次调用的方法