2010-12-13 3 views
3

필자는 주기적으로 (매달) 업데이트되고 내 서버에 업로드되는 피벗 테이블을 기반으로하는 Excel 스프레드 시트를 가지고 있습니다 (출력물을 변경하는 것을 주저하는 그룹이 생성 함) . 나는 cron 작업을 통해 실행할 수있는 스크립트를 작성하여 피벗 테이블의 원시 데이터를 처리하고 데이터베이스에로드 할 수 있기를 원합니다.Excel에서 데이터 추출하기 Linux의 피벗 테이블 스프레드 시트

그러나 수동으로 창에 들어가서 Excel에서 파일을 열고 합계 셀을 두 번 클릭하고 들어간 모든 원시 데이터가있는 새 시트를 가져 오지 않고 기본 데이터를 얻는 방법을 알 수는 없습니다 그 셀을 채우고, 그 시트를 csv로 저장하고, 그 다음에 어떤 언어 (내 경우에는 파이썬)를 통해 데이터베이스에로드 할 수 있습니다. 기본 데이터를 추출하기위한 스크립팅 가능한 방법이 필요합니다.

저는 리눅스 머신 (VM을 사용하는 윈도우/오피스를 실행하고 있지만 윈도우가 포함되지 않은 솔루션을 선호합니다) 만 있습니다. xls2csv (원시 데이터에 액세스하지 못함)와 python-unoconv와 같은 도구를 사용하여 파이썬에서 오픈 오피스 문서를 편집하는 것과 같은 도구에 익숙합니다. 그러나 openoffice를 수동으로 사용하는 경우에도 기본 데이터를 가져올 방법이 없습니다.

EDIT : (게시하기 전에) 어떤 진전을 보이지 않고 몇 시간을 보내고 난 후에는 unoconv를 통해 ODS로 변환하여 일부를 만들기 시작하지 않고 python-odf와 함께 사용할 수있을 것입니다. 마지막 시트를 추출합니다 (호출 된 'DPCache').

이제 문제는 ODS에서 시트를 CSV로 변환하는 것입니다. 내가 알아내는 것이 너무 힘들어서는 안된다.

답변

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

수정. 그러나 하나의 세부 사항 : 피벗 테이블 데이터가 숨겨져 있으면 (시트에 표시된 요약 만) 동일한 시트가 아니라 데이터 개체에서 찾을 수 있습니다. 이 경우, 예를 들어, xml 데이터를 추출하는 것이 용이 할 수있다. 방주 (xlsx 압축 풀기) –

0

내가 같은 문제를 가지고하는 데 사용됩니다. xlsx의 압축을 풀고 xml 파일을 읽고 해석하여 해결할 수 있습니다. 더 중요한 두 파일은 다음과 같습니다.

  • 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)) 

우리는이 사전을 강화합니다. 태그가 그런 <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() 

을 때

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

은 모든 당신은 당신이 dataframe에 dfdata 넣을 수 있습니다 할 일이 CacheRecords1 반복하고 defdict의 키에 열의 인덱스와 일치되어 있습니다

df = pd.DataFrame(dfdata). 

나머지는 역사입니다.이 정보가 도움이 되었기를 바랍니다.

해피 코딩 !!!

관련 문제