以编程方式从Excel电子表格中提取数据

时间:2009-08-07 08:13:55

标签: python ruby perl excel csv

是否有一种简单的方法,使用一些常见的Unix脚本语言(Perl / Python / Ruby)或命令行实用程序将Excel电子表格文件转换为CSV?具体来说,这一个:

http://www.econ.yale.edu/~shiller/data/ie_data.xls

特别是该电子表格的第三张(前两张是图表)。

10 个答案:

答案 0 :(得分:14)

有一个非常好的用于xls阅读的Perl库:Spreadsheet::ParseExcel

答案 1 :(得分:8)

也许xlrd将完成作业(在Python中)

编辑:我应该学会阅读问题。但编写csv应该不是一个大问题,所以也许你可以实际使用它。

答案 2 :(得分:4)

您可以在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

答案 3 :(得分:4)

对于ruby,电子表格gem非常适合读写修改,... excel文件

https://github.com/zdavatz/spreadsheet

答案 4 :(得分:3)

游戏已经很晚了,但我想我会通过Ruby使用gem“roo”添加另一个选项:

    require 'rubygems'
    require '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("path/to/my_excel_file.csv")

答案 5 :(得分:2)

在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

答案 6 :(得分:1)

我可能已经找到了一个可以接受的答案:

xls2csv

但有兴趣了解其他选项或其他语言的工具。

答案 7 :(得分:1)

对于python,有很多选项,请参阅hereherehere。请注意,最后一个选项仅适用于安装了Excel的Windows。

答案 8 :(得分:1)

所有三种语言都有选项。问题是 - 你最熟悉哪一个。这是您应该使用的语言,当然。如果您对这两种语言都不熟悉,那么这个应用程序并不是在语言之间进行选择的一个很好的例子。

Opinionated P.S:如果您不懂任何语言,只需学习Python并使用xlrd

答案 9 :(得分:1)

使用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