以编程方式从 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 输出?

XSLT从Excel XML电子表格中提取数据

以编程方式提取 PDF 表

如何提取银行数据并将其导入 OneDrive 中的 Excel?

将 Excel 电子表格中的数据提取到 Ruby 中的数据库中

如何使用ruby中的电子表格gem从excel单元格中提取超链接地址?