2016-06-25 2 views
1

Я пытаюсь преобразовать файл excel xlm в формат csv (или excel), может ли кто-нибудь предложить, как это сделать с помощью python? Я попытался найти в этой сети ответ, но все отвечают с помощью xlst, но я новый человек для python, не могли бы вы продемонстрировать это подробно?Python конвертировать Excel 2004 xml в csv (или excel)

спасибо. Вот файл открыт Textpad инструментов:

<?xml version="1.0" encoding="UTF-8"?> 
<?mso-application progid="Excel.Sheet"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:o="urn:schemas-microsoft-com:office:office" 
xmlns:x="urn:schemas-microsoft-com:office:excel" 
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" 
xmlns:html="http://www.w3.org/TR/REC-html40"> 
    <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"> 
     <DownloadComponents/> 
     <LocationOfComponents HRef="file:///\"/> 
    </OfficeDocumentSettings> 
    <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> 
     <WindowHeight>12525</WindowHeight> 
     <WindowWidth>15195</WindowWidth> 
     <WindowTopX>480</WindowTopX> 
     <WindowTopY>120</WindowTopY> 
     <ActiveSheet>0</ActiveSheet> 
     <ProtectStructure>False</ProtectStructure> 
     <ProtectWindows>False</ProtectWindows> 
    </ExcelWorkbook> 
    <Styles> 
     <Style ss:ID="Default" ss:Name="Normal"> 
      <Alignment ss:Vertical="Bottom"/> 
      <Borders/> 
      <Font/> 
      <Interior/> 
      <NumberFormat/> 
      <Protection/> 
     </Style> 
     <Style ss:ID="bold"> 
      <Font ss:Bold="1" /> 
     </Style> 
     <Style ss:ID="percent"> 
      <NumberFormat ss:Format="Percent" /> 
     </Style> 
     <Style ss:ID="currency"> 
      <NumberFormat ss:Format="Currency" /> 
     </Style> 

     <Style ss:ID="header"> 
      <Font ss:Color="#000000" ss:Bold="1" /> 
<Alignment ss:WrapText="1" ss:Horizontal="Center" ss:Vertical="Center" /> 

     </Style> 
    </Styles> 
<Worksheet ss:Name="SABR Data"><Table ss:ExpandedColumnCount="33" ss:ExpandedRowCount="1265" x:FullColumns="1" x:FullRows="1"> 
<Column ss:Index="1" ss:Width="150" /> 
<Column ss:Index="2" ss:Width="150" /> 
<Column ss:Index="3" ss:Width="150" /> 
<Column ss:Index="4" ss:Width="150" /> 
<Column ss:Index="5" ss:Width="150" /> 
<Column ss:Index="6" ss:Width="150" /> 
<Column ss:Index="7" ss:Width="150" /> 
<Column ss:Index="8" ss:Width="150" /> 
<Column ss:Index="9" ss:Width="150" /> 
<Column ss:Index="10" ss:Width="150" /> 
<Column ss:Index="11" ss:Width="150" /> 
<Column ss:Index="12" ss:Width="150" /> 
<Column ss:Index="13" ss:Width="150" /> 
<Column ss:Index="14" ss:Width="150" /> 
<Column ss:Index="15" ss:Width="150" /> 
<Column ss:Index="16" ss:Width="150" /> 
<Column ss:Index="17" ss:Width="150" /> 
<Column ss:Index="18" ss:Width="150" /> 
<Column ss:Index="19" ss:Width="150" /> 
<Column ss:Index="20" ss:Width="150" /> 
<Column ss:Index="21" ss:Width="150" /> 
<Column ss:Index="22" ss:Width="150" /> 
<Column ss:Index="23" ss:Width="150" /> 
<Column ss:Index="24" ss:Width="150" /> 
<Column ss:Index="25" ss:Width="150" /> 
<Column ss:Index="26" ss:Width="150" /> 
<Column ss:Index="27" ss:Width="150" /> 
<Column ss:Index="28" ss:Width="150" /> 
<Column ss:Index="29" ss:Width="150" /> 
<Column ss:Index="30" ss:Width="150" /> 
<Column ss:Index="31" ss:Width="150" /> 
<Column ss:Index="32" ss:Width="150" /> 
<Column ss:Index="33" ss:Width="150" /> 
<Row> 
<Cell ss:StyleID="header"><Data ss:Type="String">Site</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Segment</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Country</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Day</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Week</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Month</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Quarter</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Finance Region</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Booked Order USD</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Sales Calls - Total</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Booked Orders</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Close Rate</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">AOV</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Revenue Per Call</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Price Match Order %</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Deal Closer Order %</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Price Match USD %</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">CPU Hero USD</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">BTB True Attach CPU USD</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">iPad Hero USD</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Sales Calls - Queue</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Watch Hero USD</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">BTB True Attach Watch USD</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">CPU CTO %</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Personalized iPad %</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Sales Calls - RETAIL</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Close Rate CPU Hero Orders</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Close Rate iPad Hero Orders</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Close Rate iPhone Hero Orders</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Close Rate Watch Hero Orders</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">BTB True Attach USD</Data></Cell> 
<Cell ss:StyleID="header"><Data ss:Type="String">Booked Hero Orders</Data></Cell> 
</Row> 


</Table> 
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> 
     <ProtectObjects>False</ProtectObjects> 
     <ProtectScenarios>False</ProtectScenarios> 
     </WorksheetOptions> 
     </Worksheet> 
<Worksheet ss:Name="SABR Settings"><Table ss:ExpandedColumnCount="5" ss:ExpandedRowCount="21" x:FullColumns="1" x:FullRows="1"> 
<Column ss:Index="1" ss:Width="150" /> 
<Column ss:Index="2" ss:Width="150" /> 
<Column ss:Index="3" ss:Width="150" /> 
<Column ss:Index="4" ss:Width="150" /> 
<Column ss:Index="5" ss:Width="150" /> 
<Row> 
<Cell ss:StyleID="header"><Data ss:Type="String">Report URL</Data></Cell> 
</Row> 

</Table> 
<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel"> 
     <ProtectObjects>False</ProtectObjects> 
     <ProtectScenarios>False</ProtectScenarios> 
     </WorksheetOptions> 
     </Worksheet> 
</Workbook> 
+0

Отправленный XML содержит заголовки столбцов. Где данные? Кроме того, что такое * xlst *? Вы имели в виду XSLT, язык для преобразования XML-файлов? – Parfait

+0

Привет, Parfait, если добавить данные, код будет слишком длинным. Забудьте XSLT. Все, что я хочу, - это преобразовать файл excel формата xlm (если вы откроете файл excel, затем «Сохранить как», вы можете найти опцию «Excel 2004 XML Spreadsheet (.xml)») в формате csv. –

+0

@Parfait, \t Привет, Parfait, если добавить данные, код будет слишком длинным. Забудьте XSLT. Все, что я хочу, - это преобразовать файл excel формата xlm (если вы откроете файл excel, затем «Сохранить как», вы можете найти опцию «Excel 2004 XML Spreadsheet (.xml)») в формате csv. –

ответ

2

Для начала, формат XML Excel 2014, ну, XML. Чтобы разобрать это, вам нужно прочитать, как process XML with Python.

Чтобы записать файл CSV, вы можете использовать Python's CSV module.

Я не собираюсь делать всю программу для вас - StackOverflow не то, что вид сайта - но чтобы вы начали:

  1. Загрузка данных XML в Python с помощью:

    import xml.etree.ElementTree as ET 
    tree = ET.parse('SABR_Download.xls') # the downloaded file's name 
    root = tree.getroot() 
    
  2. Данные приведены на листе «Данные SABR». Есть еще один, называемый «Настройки SABR», с которым я не буду беспокоиться. Обратите внимание, что при поиске любого узла необходимо добавить префикс namespace. Вы можете сделать это более легко со словарем, see this example. Поэтому первое, давайте узел на листе мы хотим:

    for node in root.iter('{urn:schemas-microsoft-com:office:spreadsheet}Worksheet'): 
        if node.attrib['{urn:schemas-microsoft-com:office:spreadsheet}Name'] == 'SABR Data': 
         ws_node = node 
         break # we found the worksheet node, break out of for loop 
    

    Вы можете использовать XPATH, чтобы найти его легко с findall.

  3. Заголовки столбцов явно находятся на узлах XML <Cell ss:StyleID="header">...</Cell>. Вы можете получить каждый из них, выполнив что-то подобное с .iter, используемым для поиска рабочего листа, а затем вложенными петлями на правильных узлах. СОВЕТ: посмотрите имя тега и используйте атрибут .text узла, чтобы получить текст в элементах <Data>.

  4. Затем повторите аналогично для реальных строк данных.

  5. Затем выпишите заголовки и данные в файл CSV.

Кроме того, если вы новичок в Python, я настоятельно рекомендую вам прочитать несколько руководств, прежде чем попробовать что-то такое сложное.

+0

@aneriod, большое спасибо! –

+0

@GeorgeWang См. [Как работает прием ответа?] (Http://meta.stackexchange.com/a/5235/193893) & [Что делать, если кто-то отвечает на мой вопрос?] (Http: // stackoverflow. com/help/some-answers) И, [что голосование?] (Http://stackoverflow.com/help/privileges/vote-up) – aneroid

Смежные вопросы