以编程方式从 Excel 电子表格中提取数据
Posted
技术标签:
【中文标题】以编程方式从 Excel 电子表格中提取数据【英文标题】:Programmatically extract data from an Excel spreadsheet 【发布时间】:2010-11-17 15:08:07 【问题描述】:有没有一种简单的方法,使用一些常见的 Unix 脚本语言(Perl/Python/Ruby)或命令行实用程序,将 Excel 电子表格文件转换为 CSV?具体来说,这个:
http://www.econ.yale.edu/~shiller/data/ie_data.xls
特别是该电子表格的第三张表(前两张是图表)。
【问题讨论】:
这里是一些 Python 包的很好的汇编以及可能有用的单行描述:python-excel.org 【参考方案1】:有一个非常好的用于 xls 阅读的 Perl 库:Spreadsheet::ParseExcel。
【讨论】:
+1 几年前我自己用过这个;它肯定完成了工作。【参考方案2】:也许xlrd 会完成这项工作(在 Python 中)
edit:我真的应该学会阅读问题。但是写 csv 应该不是什么大问题,所以也许你可以实际使用它。
【讨论】:
对,输出为 CSV 没什么大不了的。谢谢!【参考方案3】:你可以在python中使用pyexcelerator。
此代码(包含在 pyexcelerator 的 examples
文件夹中,为 xls2csv.py
)从电子表格中提取所有工作表,并将它们作为 CSV 输出到 stdout
。
您可以轻松更改代码以执行您想要的操作。
pyexcelerator 最酷的地方在于,您还可以使用它编写/创建 excel xls 文件,而无需安装 excel。
#!/usr/bin/env python
# -*- coding: windows-1251 -*-
# Copyright (C) 2005 Kiseliov Roman
__rev_id__ = """$Id: xls2csv.py,v 1.1 2005/05/19 09:27:42 rvk Exp $"""
from pyExcelerator import *
import sys
me, args = sys.argv[0], sys.argv[1:]
if args:
for arg in args:
print >>sys.stderr, 'extracting data from', arg
for sheet_name, values in parse_xls(arg, 'cp1251'): # parse_xls(arg) -- default encoding
matrix = [[]]
print 'Sheet = "%s"' % sheet_name.encode('cp866', 'backslashreplace')
print '----------------'
for row_idx, col_idx in sorted(values.keys()):
v = values[(row_idx, col_idx)]
if isinstance(v, unicode):
v = v.encode('cp866', 'backslashreplace')
else:
v = str(v)
last_row, last_col = len(matrix), len(matrix[-1])
while last_row < row_idx:
matrix.extend([[]])
last_row = len(matrix)
while last_col < col_idx:
matrix[-1].extend([''])
last_col = len(matrix[-1])
matrix[-1].extend([v])
for row in matrix:
csv_row = ','.join(row)
print csv_row
else:
print 'usage: %s (inputfile)+' % me
【讨论】:
那些'cp1251'和'cp866'在里面做什么?如果数据中有日期会发生什么?为什么它使用 alist.extend([something]) 而不是 alist.append(something)?为什么它使用 ','.join(row) 而不是使用 csv 模块?你是认真的??? @John:我刚刚复制了pyexcelerator的例子。我认为该示例的重点是读取 xls 文件,而不是 csv 生成部分。有用。您可以根据需要对其进行修改和改进。 @nosklo:如果您的数据中有日期,它不起作用。一般用pyExcelerator写xls文件比较uncool。它没有定期维护。在 2009 年复活节前后的短暂维护复活之前的版本存在错误。使用 xlwt(一个维护的 fork)来编写 xls 文件。使用 xlrd 读取 xls 文件。见http://www.python-excel.org
【参考方案4】:
对于 ruby,电子表格 gem 非常适合读写修改,...excell 文件
https://github.com/zdavatz/spreadsheet
【讨论】:
【参考方案5】:这对游戏来说已经很晚了,但我想我会使用 gem "roo" 通过 Ruby 添加另一个选项:
需要“红宝石” 需要'roo' my_excel_file = Excelx.new("path/to/my_excel_file.xlsx") my_excel_file.default_sheet = my_excel_file.sheets[2] my_excel_file.to_csv("路径/to/my_excel_file.csv")【讨论】:
第三张怎么选? 啊,公平点。在“to_csv”行之前,将默认工作表设置为第三个工作表,即 my_excel_file.default_sheet = my_excel_file.sheets[2]【参考方案6】:在 Ruby 中,这是我使用的代码:(需要出色的 parseexcel gem) 需要'parseexcel'
def excelGetSheet(worksheet)
sheet=Array.new
worksheet.each |row|
if row != nil # empty row?
cells=Array.new
j=0
row.each |cell|
cells << cell.to_s('latin1') unless cell == nil
j=j+1
sheet << cells
end
return sheet
end
workbook = Spreadsheet::ParseExcel.parse("MyExcelFile.xls")
sheet1 = excelGetSheet(workbook.worksheet(0))
puts sheet1.inspect
【讨论】:
更多解释也可以在这里找到:codeweblog.com/parseexcel-ruby-used-to-read-excel【参考方案7】:对于 python,有许多选项,请参阅 here、here 和 here。请注意,最后一个选项仅适用于安装了 Excel 的 Windows。
【讨论】:
pyXLreader 自 2005 年以来似乎没有得到维护,在 sourceforge 跟踪器中有一个惊人的突出错误(省略分数,所有数字都以整数表示)加上我在几分钟内发现的更多问题玩它(在大文件上崩溃,有时会打印“FCUKDATE”(不是开玩笑!)当数据中有日期时,所用时间至少是 xlrd 的 6 倍,并且可能是 O(N**2),内存使用至少是 xlrd 的 7 倍)。你自己用的非常多吗? 没有。我曾简单地使用过 xlrd,但我倾向于将数据存储为 CSV 并以此为基础工作。我对这三个网站进行了书签评论,所以我认为它可能有用。 评论?我用谷歌找不到这样的东西。请张贴链接。【参考方案8】:所有三种语言都有选项。问题是——你最熟悉哪一个。当然,这是您应该使用的语言。如果您对其中任何一个都不熟悉,那么这个应用程序并不是在语言之间进行选择的一个很好的例子。
附议:如果你不会任何一种语言,只要学习 Python 并使用xlrd
。
【讨论】:
哦,我不是说这是一个语言战争问题或任何东西。只需要完成这项任务,并且乐于使用任何可以轻松完成任务的语言。【参考方案9】:我可能已经找到了可以接受的答案:
xls2csv
但有兴趣了解还有哪些其他选项,或其他语言的工具。
【讨论】:
【参考方案10】:使用pyexcel 库,您可以这样做:
>>> import pyexcel as p
>>> data_sheet=p.get_sheet(file_name='/Users/jaska/Downloads/ie_data.xls', sheet_name='Data')
>>> data_sheet.top_left()
pyexcel sheet:
+---------------------------------------------------------------------------------------------------------+---+---+---+------------+---+---+---+---+---+------------+---+---+---+---+---+---+
| | | | | | | | | | | | | | | | | |
+---------------------------------------------------------------------------------------------------------+---+---+---+------------+---+---+---+---+---+------------+---+---+---+---+---+---+
| Stock Market Data Used in "Irrational Exuberance" Princeton University Press, 2000, 2005, 2015, updated | | | | | | | | | | Cyclically | | | | | | |
+---------------------------------------------------------------------------------------------------------+---+---+---+------------+---+---+---+---+---+------------+---+---+---+---+---+---+
| Robert J. Shiller | | | | | | | | | | Adjusted | | | | | | |
+---------------------------------------------------------------------------------------------------------+---+---+---+------------+---+---+---+---+---+------------+---+---+---+---+---+---+
| | | | | | | | | | | Price | | | | | | |
+---------------------------------------------------------------------------------------------------------+---+---+---+------------+---+---+---+---+---+------------+---+---+---+---+---+---+
| | | | | Consumer | | | | | | Earnings | | | | | | |
+---------------------------------------------------------------------------------------------------------+---+---+---+------------+---+---+---+---+---+------------+---+---+---+---+---+---+
>>> data_sheet.save_as('ie_data.csv')
为了让它工作,你需要安装:
$ pip install pyexcel
$ pip install pyexcel-xls
此外,您还可以安装pyexcel-cli 并在一个命令行中获取您的csv数据:
$ pyexcel transcode --sheet-name 'Data' /your/home/Downloads/ie_data.xls ie_data.csv
【讨论】:
以上是关于以编程方式从 Excel 电子表格中提取数据的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式填写和获取 Excel 电子表格的 PDF 输出?
如何提取银行数据并将其导入 OneDrive 中的 Excel?