내가 같은 문제를 가지고하는 데 사용됩니다. 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 "PAMPERS" 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).
나머지는 역사입니다.이 정보가 도움이 되었기를 바랍니다.
해피 코딩 !!!
수정. 그러나 하나의 세부 사항 : 피벗 테이블 데이터가 숨겨져 있으면 (시트에 표시된 요약 만) 동일한 시트가 아니라 데이터 개체에서 찾을 수 있습니다. 이 경우, 예를 들어, xml 데이터를 추출하는 것이 용이 할 수있다. 방주 (xlsx 압축 풀기) –