2010-12-13 17 views
3

定期的に更新され、私のサーバーにアップロードされるピボットテーブルに基づいたExcelスプレッドシートを持っています(出力で何かを変更することを非常に気にしないグループによって生成されます) 。私は処理するためにcronジョブを介して実行できるスクリプトを書くことができたいと思います、そして、ピボットテーブルから生データを私のデータベースに読み込みます。エクセルからデータを抽出する

しかし、手動でウィンドウに入り、Excelでファイルを開いたり、合計セルをダブルクリックしたり、生のデータをすべて入れて新しいシートを取得したりすることなく、基礎となるデータを取得する方法を理解できませんそのセルをポピュレートし、そのシートをcsvとして保存して、私のデータベースにいくつかの言語(私の場合はPython)で読み込むことができます。基になるデータを抽出するためにはスクリプト可能な方法が必要です。

私はLinuxマシン(VMでWindows/Officeを実行していますが、ウィンドウが含まれていないソリューションが望ましいです)があります。私はxls2csv(生データにアクセスしない)やpython-unoconvのようなツールを使ってPythonからオープンオフィス文書を編集するツールに精通しています。しかし、openofficeを手動で使用しても、基礎となるデータを取得する方法はありません。

編集:何か進歩していない(これを投稿する前に)良い数時間を過ごした後、私はunoconvでODSに変換していくつか作っていませんし、python-odfで何かを使うことができるようです最後のシート(「DPCache」と呼ばれます)を抽出します。

これで問題は、CSVに変換されたODSからシートを取得することです。私は理解するのが難しいはずはありません(しかし、助けが大いに評価されます)。

答えて

1

xlrdを試しましたか? python-excel websiteから入手できるチュートリアルも参照してください。

それはこの単純です:

>>> import xlrd 
>>> book = xlrd.open_workbook('pivot_table_demo.xls') 
>>> sheet = book.sheet_by_name('Summary') 
>>> for row_index in xrange(sheet.nrows): 
...  print sheet.row_values(row_index) 
... 
[u'Sum of sales', u'qtr', '', '', '', ''] 
[u'person', 1.0, 2.0, 3.0, 4.0, u'Grand Total'] 
[u'dick', 100.0, 99.0, 95.0, 90.0, 384.0] 
[u'harriet', 100.0, 110.0, 121.0, 133.1, 464.1] 
[u'tom', 100.0, 101.0, 102.0, 103.0, 406.0] 
[u'Grand Total', 300.0, 310.0, 318.0, 326.1, 1254.1] 
>>> 
+0

修正。ただし、1つの詳細:ピボットテーブルのデータが非表示になっている場合(シートに表示されているサマリーのみ)、同じシート内ではなくデータオブジェクトに表示される場合があります。その場合、xmlデータを、例えば、 Ark(xlsxの解凍) –

0

私は同じ問題を持っていました。 xlsxを解凍し、xmlファイルを読み込み/解釈することで解決できます。より重要な2つのファイルは、これらのファイルです。

  • XL/pivotCache/pivotCacheDefinition1.xml
  • XL/pivotCache/pivotCacheRecords1.xml

最初のものは、あなたがアクセスする必要があること、pivotCacheRecords1.xmlにおける生データのrelationshitを持っていますインデックス番号によって、私がこれを意味するのは、<x>というタグを持つpivotCacheRecords1.xmlの各列が、<x>というタグのインデックス番号でpivotCacheDefinition1.xmlのデータを取得する必要があるということです。 xmlファイルを参照してください。

pivotCacheDefinition1.xml

<?xml version="1.0" encoding="UTF-8"?> 
<pivotCacheDefinition xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" r:id="rId1" refreshedBy="ADNLatam" refreshedDate="42972.64919178241" createdVersion="5" refreshedVersion="6" recordCount="1923161"> 
    <cacheSource type="external" connectionId="1" /> 
    <cacheFields count="26"> 
     <cacheField name="C - Cadenas" numFmtId="0" sqlType="-9"> 
     <sharedItems count="3"> 
      <s v="superA" /> 
      <s v="superB" /> 
      <s v="superC" u="1" /> 
     </sharedItems> 
     </cacheField> 
     <cacheField name="C - Locales" numFmtId="0" sqlType="-9"><span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span> 
     <sharedItems count="80"> 
      <s v="Itaugua" /> 
      <s v="Denis Roa" /> 
      <s v="Total" /> 
      <s v="Los Laureles" /> 
      <s v="CDE" /> 
      <s v="S6 Fdo." /> 
      <s v="Central" u="1" /> 
      <s v="Unicompra" u="1" /> 
      <s v="San Lorenzo Centro" u="1" /> 
     </sharedItems> 
     </cacheField> 
    </cacheFields> 
</pivotCacheDefinition> 
</xml> 

pivotCacheRecords1.xml

<pivotCacheRecords 
xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" count="246209"> 
<r> 
    <x v="0"/> 
    <x v="0"/> 
    <x v="0"/> 
    <x v="0"/> 
    <s v="PAÐAL &quot;PAMPERS&quot; BABYSAN REGULAR GDE 9UN"/> #Z - Sku/Descripcion 
    <s v="07501006720341"/> 
    <x v="0"/> 
    <x v="0"/> 
    <x v="0"/> 
    <x v="0"/> 
    <x v="0"/> 
    <x v="0"/> 
    <n v="1"/> 
    <n v="11990"/> 
    <n v="2.3199999999999998"/> 
    <n v="10900"/> 
    <n v="11990"/> 
    <n v="1"/> 
    <d v="2012-02-03T00:00:00"/> 
    <x v="0"/> 
    <x v="0"/> 
    <n v="3"/> 
    <n v="6"/> 
    <x v="0"/> 
    <x v="0"/> 
    <x v="0"/> 
    <x v="0"/> 
    <x v="0"/> 
    <x v="0"/> 
</r> 

CacheRecords1タグで<x>は今、CacheDefinition1で<s>タグの関係であることを参照してください。もし分かればこれは、レコードの反復でそれを使用するのは難しいことではありません。

 definitions = '/tmp/scantrack_tmp/xl/pivotCache/pivotCacheDefinition1.xml' 
     defdict = {} 
     columnas = [] 
     e = xml.etree.ElementTree.parse(definitions).getroot() 
     for fields in e.findall('{http://schemas.openxmlformats.org/spreadsheetml/2006/main}cacheFields'): 
      for cidx, field in enumerate(fields.getchildren()): 
       columna = field.attrib.get('name') 
       defdict[cidx] = [] 
       columnas.append(columna) 
       for value in field.getchildren()[0].getchildren(): 
        tagname = value.tag 
        defdict[cidx].append(value.attrib.get('v', 0)) 

このディクテーションをサポートします。あなたはTODOを持っているすべてはCacheRecords1を反復処理すると、タグが<x>

dfdata = [] 


    bdata = '/tmp/scantrack_tmp/xl/pivotCache/pivotCacheRecords1.xml' 

    for event, elem in xml.etree.ElementTree.iterparse(bdata, events=('start', 'end')): 
    if elem.tag == '{http://schemas.openxmlformats.org/spreadsheetml/2006/main}r' and event == 'start': 
     tmpdata = [] 
     for cidx, valueobj in enumerate(elem.getchildren()): 
      tagname = valueobj.tag 
      vattrib = valueobj.attrib.get('v') 
      rdata = vattrib 
      if tagname == '{http://schemas.openxmlformats.org/spreadsheetml/2006/main}x': 
       try: 
        rdata = defdict[cidx][int(vattrib)] 
       except: 
        logging.error('this it not should happen index cidx = {} vattrib = {} defaultidcts = {} tmpdata for the time = {} xml raw {}'.format(
                                       cidx, vattrib, defdict, tmpdata, 
                                       xml.etree.ElementTree.tostring(elem, encoding='utf8', method='xml') 
                                       )) 
      tmpdata.append(rdata) 
     if tmpdata: 
      dfdata.append(tmpdata) 
     elem.clear() 

ときdefdictでキーと列のインデックスを一致さ

{ 
    0: ['supera', 'superb', u'superc'], 
    1: ['Terminal', 
    'CDE', 
    'Brasilia', 
    ] 
    3: ['PANTENE', 'DOVE'] 
    ... 
} 

その後、その後、データフレーム

にdfdata置くことができます
df = pd.DataFrame(dfdata). 

残りは歴史です。私はこれがあなたを助けてくれることを願っています。

ハッピーコーディング!

関連する問題