原创答案来自stackflow
import pandas as pd from xml.sax import ContentHandler,parse # Reference https://goo.gl/KaOBG3 class ExcelHandler(ContentHandler): def __init__(self): self.chars = [ ] self.cells = [ ] self.rows = [ ] self.tables = [ ] def characters(self,content): self.chars.append(content) def startElement(self,name,atts): if name=="Cell": self.chars = [ ] elif name=="Row": self.cells=[ ] elif name=="Table": self.rows = [ ] def endElement(self,name): if name=="Cell": self.cells.append(''.join(self.chars)) elif name=="Row": self.rows.append(self.cells) elif name=="Table": self.tables.append(self.rows) excelHandler = ExcelHandler() parse('coalpublic2012.xls',excelHandler)#文件名 df1 = pd.DataFrame(excelHandler.tables[0][1:],columns=excelHandler.tables[0][0])
另外还有不同情况。
在我使用的过程中,发现有些xml的格式不一样,导致上面的excelHandler用不了,如开头和结尾是这样的,是可以用的:
开头
<Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="151" x:FullColumns="1" x:FullRows="1" ss:DefaultColumnWidth="48" ss:DefaultRowHeight="12.75"><Row><Cell ss:StyleID="s50"><Data ss:Type="String">\xe5\x9f\x8e\xe5\xb8\x82</Data></Cell><Cell ss:StyleID="s51">
结尾
</Data></Cell></Row></Table><WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
但是开头和结尾是这样的,需要修改,将excelHandler的Cell/Row/Table修改为对应的ss:Cell/ss:Row/ss:Table就可以了:
开头
<ss:Table>\n',
' <ss:Row>\n',
' <ss:Cell ss:StyleID="s27"><Data ss:Type="String">
' </ss:Row>\n',
' < /ss:Table>\n',
' </Worksheet>\n',
'</Workbook>']