2017-12-01 30 views
0

Excelファイルから書式設定されたテキストを読み込もうとしています。それは一連の反応から成り、いくつかの反応物は下付き文字を有し、他のものは上付き文字を有する。私は上付き文字と下付き文字を区別するのに苦労しています。例えばPython pandasを使用してExcelファイルから下位/上付き文字を読み取る

、反応物があると言う:私は

O2+

と区別したい

O2+

ここに関連する質問があります。このことから Usage of unicode() and encode() functions in Python

は、私が思いました多分私はユニコードに文字列を変換する必要がありますが、パンダは、上付き文字/下付き文字をまったく読み取っていないようです。

+0

したがって、テキストはセル内で下付き文字と上付き文字のフォントオプションを使用してフォーマットされますか? – James

+0

そうですよ。 – rahulv88

+0

これは 'O2 +'と 'O²+'でしょうか? –

答えて

0

パンダはxlrdを使用してExcelファイルを読み込みますが、残念ながらxlrdはセル内で使用されている書式設定を解析しません。

openpyxlパッケージでは文字列の書式設定を処理できますが、古い.xls書式の場合のみです。おそらく、基礎となるXMLデータを調べるカスタムパーサを記述する必要があります。

.xlsxファイルは、xmlファイルのコレクションを含むzipアーカイブです。あなたが見てする必要がある2つの

  • file.xlsx/XL/sharedStrings.xml
  • file.xlsx/XL /ワークシート/ sheet1.xmlている(または、あなたのシートの名前は何でも)

    最初のファイルには、文字列が含まれ、書式はです。 2番目のファイルには、シート内のセルと、それらが参照する文字列が含まれています。文字列は、sharedStrings.xmlでその順序で参照されます。ここ

    例のスクリーンキャップされたシートをエクセル:

    enter image description here

    例sharedStrings.xmlファイル:

    <?xml version="1.0" encoding="UTF-8"?> 
    <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="3" uniqueCount="3"> 
        <si> 
        <r> 
         <t>O</t> 
        </r> 
        <r> 
         <rPr> 
         <vertAlign val="subscript"/><sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
         </rPr> 
         <t>2</t> 
        </r> 
        <r> 
         <rPr> 
         <vertAlign val="superscript"/><sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
         </rPr> 
         <t>+</t> 
        </r> 
        </si> 
        <si> 
        <r> 
         <t>H</t> 
        </r> 
        <r> 
         <rPr> 
         <vertAlign val="subscript"/><sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
         </rPr> 
         <t>2</t> 
        </r> 
        <r> 
         <rPr> 
         <sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
         </rPr> 
         <t>O</t> 
        </r> 
        </si> 
        <si> 
        <r> 
         <t>O</t> 
        </r> 
        <r> 
         <rPr> 
         <vertAlign val="superscript"/><sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
         </rPr> 
         <t>2+</t> 
        </r> 
        </si> 
    </sst> 
    

    <si>要素はテキストの塊です。 <r>要素は、文字と書式のセットです。 <t>の要素が実際の文字です。先行する<rPr>の要素は、スタイリング/書式設定です。 <vertAlign>要素で上付き文字と下付き文字の区別を区別できます。 sheet1.xmlの

    例:<row>要素内に含まれている<c>

    <?xml version="1.0" encoding="UTF-8"?> 
    <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac" mc:Ignorable="x14ac"> 
        <dimension ref="A1:A3" /> 
        <sheetViews> 
        <sheetView tabSelected="1" workbookViewId="0"> 
         <selection activeCell="A4" sqref="A4" /> 
        </sheetView> 
        </sheetViews> 
        <sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25" /> 
        <sheetData> 
        <row r="1" spans="1:1" ht="18.75" x14ac:dyDescent="0.35"> 
         <c r="A1" t="s"> 
         <v>0</v> 
         </c> 
        </row> 
        <row r="2" spans="1:1" ht="18" x14ac:dyDescent="0.35"> 
         <c r="A2" t="s"> 
         <v>1</v> 
         </c> 
        </row> 
        <row r="3" spans="1:1" ht="17.25" x14ac:dyDescent="0.25"> 
         <c r="A3" t="s"> 
         <v>2</v> 
         </c> 
        </row> 
        </sheetData> 
        <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3" /> 
        <pageSetup orientation="portrait" r:id="rId1" /> 
    </worksheet> 
    

    電池素子。 <v>の値は、共有文字列の順序/インデックスへの参照です。そのため、セルA1は0番目のsharedStringの値を持ち、0に続いて添え字付き2と続き、上付きの+が続きます。:Excelファイルを解析を開始するには

    <si> 
    <r> 
        <t>O</t> 
    </r> 
    <r> 
        <rPr> 
        <vertAlign val="subscript"/><sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
        </rPr> 
        <t>2</t> 
    </r> 
    <r> 
        <rPr> 
        <vertAlign val="superscript"/><sz val="11"/><color theme="1"/><rFont val="Calibri"/><family val="2"/><scheme val="minor" /> 
        </rPr> 
        <t>+</t> 
    </r> 
    </si> 
    

    、あなたが使用することができます。

    import zipfile 
    from lxml import etree 
    
    z = zipfile.ZipFile('file.xlsx') 
    
    with z.open('xl/sharedStrings.xml') as fp: 
        ss = etree.fromstring(fp.read()) 
    
    with z.open('xl/worksheets/sheet1.xml') as fp: 
        sh1 = etree.fromstring(fp.read()) 
    
    z.close() 
    
    # get the namespaces 
    ssns = ss.nsmap 
    if None in ssns: 
        ssns['none'] = ssns.pop(None) 
    
    sh1ns = sh1.nsmap 
    if None in sh1ns: 
        sh1ns['none'] = sh1ns.pop(None) 
    
    text_list = ss.xpath('//none:si', namespaces=ssns) 
    cell_list = sh1.xpath('//none:c', namespaces=sh1ns) 
    

    あなたが望む形式にフォーマットを変換するパーサを記述する必要があります。

+0

'xls'としてファイルを保存してopenpyxlを使用する方が簡単でしょうか? – rahulv88

+0

実際に私がそれをしたときにエラーが出る、openpyxlはxls形式をサポートしていない – rahulv88

関連する問題