【问题标题】:Programmatically extract data from an Excel spreadsheet以编程方式从 Excel 电子表格中提取数据
【发布时间】: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

标签: python ruby perl excel csv


【解决方案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
    

    【讨论】:

    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2014-02-16
        • 1970-01-01
        • 2014-04-06
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多