Программно извлекать данные из электронной таблицы Excel - PullRequest
7 голосов
/ 07 августа 2009

Есть ли простой способ, с помощью какого-нибудь распространенного языка сценариев Unix (Perl / Python / Ruby) или утилиты командной строки, конвертировать файл таблицы Excel в CSV? В частности, это:

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

И, в частности, третий лист этой таблицы (первые две таблицы).

Ответы [ 10 ]

14 голосов
/ 07 августа 2009

Существует действительно хорошая библиотека Perl для чтения в формате xls: Электронная таблица :: ParseExcel .

8 голосов
/ 07 августа 2009

Может быть xlrd выполнит задание (на Python)

редактировать: я действительно должен научиться читать вопросы. Но написание csv не должно быть большой проблемой, поэтому, возможно, вы действительно сможете его использовать.

4 голосов
/ 19 января 2010

для ruby, гем электронных таблиц отлично подходит для чтения, записи, изменения, ... превосходные файлы

https://github.com/zdavatz/spreadsheet

4 голосов
/ 07 августа 2009

Вы можете использовать pyexcelerator в python.

Этот код (включенный в папку examples pyexcelerator как xls2csv.py) извлекает все листы из электронных таблиц и выводит их в stdout как CSV.

Вы можете легко изменить код, чтобы сделать то, что вы хотите.

Крутая вещь в 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 голосов
/ 10 октября 2012

Это довольно поздно для игры, но я подумал, что добавлю еще один вариант через Ruby, используя гем "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")
2 голосов
/ 12 сентября 2009

В Ruby вот код, который я использую: (требуется превосходный гем parseexcel) требуется 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
1 голос
/ 05 июля 2017

Используя библиотеку 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
1 голос
/ 07 августа 2009

Опции существуют для всех трех языков. Вопрос в том, с кем вы больше всего знакомы. Это язык, который вы должны использовать, наверняка. И если вы не знакомы ни с чем, это приложение не является хорошим примером выбора между языками.

Мнение P.S: если вы не знаете ни одного языка, просто изучите Python и используйте xlrd.

1 голос
/ 07 августа 2009

Для python есть несколько опций, см. здесь , здесь и здесь . Обратите внимание, что последний вариант будет работать только в Windows с установленным Excel.

1 голос
/ 07 августа 2009

Возможно, я уже нашел приемлемый ответ:

xls2csv

Но интересно узнать, какие еще есть варианты или об инструментах на других языках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...