python पायथन का उपयोग कर xlsx फ़ाइलों को पढ़ना




xlrd openpyxl (6)

import openpyxl as px
import numpy as np

W = px.load_workbook('filename.xlsx', use_iterators = True)
p = W.get_sheet_by_name(name = 'Sheet1')

a=[]

for row in p.iter_rows():
    for k in row:
        a.append(k.internal_value)

# convert list a to matrix (for example 5*6)
aa= np.resize(a, [5, 6])

# save matrix aa as xlsx file
WW=px.Workbook()
pp=WW.get_active_sheet()
pp.title='NEW_DATA'

f={'A':0,'B':1,'C':2,'D':3,'E':4,'F':5}

#insert values in six columns
for (i,j) in f.items():
    for k in np.arange(1,len(aa)+1):
        pp.cell('%s%d'%(i,k)).value=aa[k-1][j]

WW.save('newfilname.xlsx')

मैंने पिछले साल पढ़ा था कि xlrd को xlsx फ़ाइलों (एक्सेल 2007, 2010) को पढ़ने में सक्षम होने के लिए अद्यतन किया जा रहा था। क्या इस विकास पर कोई अन्य खबर है, या अन्य पायथन उपयोगिता का उपयोग है?


मानक पुस्तकालय का उपयोग करके यहां एक बहुत ही कठिन कार्यान्वयन है।

def xlsx(fname):
    import zipfile
    from xml.etree.ElementTree import iterparse
    z = zipfile.ZipFile(fname)
    strings = [el.text for e, el in iterparse(z.open('xl/sharedStrings.xml')) if el.tag.endswith('}t')]
    rows = []
    row = {}
    value = ''
    for e, el in iterparse(z.open('xl/worksheets/sheet1.xml')):
        if el.tag.endswith('}v'): # <v>84</v>
            value = el.text
        if el.tag.endswith('}c'): # <c r="A3" t="s"><v>84</v></c>
            if el.attrib.get('t') == 's':
                value = strings[int(value)]
            letter = el.attrib['r'] # AZ22
            while letter[-1].isdigit():
                letter = letter[:-1]
            row[letter] = value
            value = ''
        if el.tag.endswith('}row'):
            rows.append(row)
            row = {}
    return rows

एरिक गाज़ोनी ने ओपनपीएक्सएल लिखा है जो xlsx फ़ाइलों को पढ़ता / लिखता है और अधिक जानकारी उनके ब्लॉग से उपलब्ध है और किसी भी पायथन कोडर के लिए कोड रिपोजिटरी इसे आजमाने की इच्छा रखते हैं


Excel 2007 .xlsx और .xlsm फ़ाइलों से मूल डेटा (open_workbook (..., formatting_info = गलत)) पढ़ने के लिए समर्थन इस समय अल्फा परीक्षण में है। इस समूह में पिछली पोस्टिंग देखें ("एक्सेल 2007 xlsx" के लिए खोजें)।

एक्सेल के लिए xlrd समर्थन के संबंध में मंच से


पार्टी के लिए थोड़ा देर हो चुकी है, लेकिन xlrd अब मूल रूप से xlsx का समर्थन करता है। मैंने pip install xlrd --upgrade कमांड प्रॉम्प्ट ( WindowsKey + R तब cmd ) में pip install xlrd --upgrade का उपयोग करके 0.6.0 से 0.8.0 तक अपडेट किया और अब यह बिना किसी समस्या के xlsx को पढ़ता है।

xlrd


हाँ महान subroutine के लिए धन्यवाद!

यदि मैंने हेडर पंक्ति निर्दिष्ट की है, तो मैंने पंक्तियों के बजाय सूचकांक के रूप में कॉलम नामों का उपयोग करने के लिए पंक्तियों हैश को अपडेट करने की अनुमति दी है।

readXlsx( "mysheet.xlsx", sheet = 1, header = True )

def readXlsx( fileName, **args ):

    import zipfile
    from xml.etree.ElementTree import iterparse

    if "sheet" in args:
       sheet=args["sheet"]
    else:
       sheet=1
    if "header" in args:
       isHeader=args["header"]
    else:
       isHeader=False

    rows   = []
    row    = {}
    header = {}
    z      = zipfile.ZipFile( fileName )

    # Get shared strings
    strings = [ el.text for e, el
                        in  iterparse( z.open( 'xl/sharedStrings.xml' ) )
                        if el.tag.endswith( '}t' )
                        ]
    value = '' 

    # Open specified worksheet
    for e, el in iterparse( z.open( 'xl/worksheets/sheet%d.xml'%( sheet ) ) ):
       # get value or index to shared strings
       if el.tag.endswith( '}v' ):                                   # <v>84</v>
           value = el.text
       if el.tag.endswith( '}c' ):                                   # <c r="A3" t="s"><v>84</v></c>

           # If value is a shared string, use value as an index
           if el.attrib.get( 't' ) == 's':
               value = strings[int( value )]

           # split the row/col information so that the row leter(s) can be separate
           letter = el.attrib['r']                                   # AZ22
           while letter[-1].isdigit():
               letter = letter[:-1]

           # if it is the first row, then create a header hash for the names
           # that COULD be used
           if rows ==[]:
               header[letter]=value
           else:
               if value != '':

                   # if there is a header row, use the first row's names as the row hash index
                   if isHeader == True and letter in header:
                       row[header[letter]] = value
                   else:
                       row[letter] = value

           value = ''
       if el.tag.endswith('}row'):
           rows.append(row)
           row = {}
    z.close()
    return rows




openpyxl