Home > Software engineering >  Convert XLS to XLSX using python
Convert XLS to XLSX using python

Time:04-01

I am trying to convert xls file to xlsx using the following code

import pandas as pd
from bs4 import BeautifulSoup

def convert_to_xlsx():
    with open('2356.xls') as xml_file:
        soup = BeautifulSoup(xml_file.read(), 'xml')
        writer = pd.ExcelWriter('sample.xlsx')
        for sheet in soup.findAll('Worksheet'):
            sheet_as_list = []
            for row in sheet.findAll('Row'):
                sheet_as_list.append([cell.Data.text if cell.Data else '' for cell in row.findAll('Cell')])
            pd.DataFrame(sheet_as_list).to_excel(writer, sheet_name=sheet.attrs['ss:Name'], index=False, header=False)

        writer.save()
        
convert_to_xlsx()

The code works with no errors but the output xlsx is blank with no data inside Any ideas?

When opening the file with notepad I noticed the contents like that

<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet"?>
<ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">
  <ss:Styles>
    <ss:Style ss:ID="General" />
    <ss:Style ss:ID="Number">
      <ss:NumberFormat ss:Format="General Number" />
    </ss:Style>
    <ss:Style ss:ID="DateTime">
      <ss:NumberFormat ss:Format="General Date" />
    </ss:Style>
    <ss:Style ss:ID="Currency">
      <ss:NumberFormat ss:Format="Currency" />
    </ss:Style>
    <ss:Style ss:ID="ShortDate">
      <ss:NumberFormat ss:Format="Short Date" />
    </ss:Style>
  </ss:Styles>
  <ss:Worksheet ss:Name="Sheet1">
    <ss:Table>
      <ss:Row>
        <ss:Cell>
          <ss:Data ss:Type="String">إسم الخصم</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">رقم العقد</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">سبب المديونية</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">قيمة المطالبة</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">تاريخ الورود</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">جنسية العميل</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">تاريخ الإنذار</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">قيمة المصروف</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">تاريخ المصروف</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">نوع المصروف</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">رقم أمر الأداء</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">الرقم الآلي</ss:Data>
        </ss:Cell>
      </ss:Row>
      <ss:Row>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">ميثم عبدالله حسين اشكناني</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">700000045332</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">بيع مرابحة محلي</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="Number">
          <ss:Data ss:Type="Number">48948.176</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="ShortDate">
          <ss:Data ss:Type="DateTime">2020-10-28T00:00:00</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">كويتي</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String"></ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="Number">
          <ss:Data ss:Type="Number">50</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="ShortDate">
          <ss:Data ss:Type="DateTime">2022-03-23T00:00:00</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">مصروفات حجز سيارة</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">2021/500969</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">211856060</ss:Data>
        </ss:Cell>
      </ss:Row>
      <ss:Row>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">ميثم عبدالله حسين اشكناني</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">700000045332</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">بيع مرابحة محلي</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="Number">
          <ss:Data ss:Type="Number">48948.176</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="ShortDate">
          <ss:Data ss:Type="DateTime">2020-10-28T00:00:00</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">كويتي</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String"></ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="Number">
          <ss:Data ss:Type="Number">50</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="ShortDate">
          <ss:Data ss:Type="DateTime">2022-03-23T00:00:00</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">مصروفات حجز سيارة</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">2021/500969</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">211856060</ss:Data>
        </ss:Cell>
      </ss:Row>
      <ss:Row>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">ميثم عبدالله حسين اشكناني</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">700000045332</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">بيع مرابحة محلي</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="Number">
          <ss:Data ss:Type="Number">48948.176</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="ShortDate">
          <ss:Data ss:Type="DateTime">2020-10-28T00:00:00</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">كويتي</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String"></ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="Number">
          <ss:Data ss:Type="Number">50</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="ShortDate">
          <ss:Data ss:Type="DateTime">2022-03-23T00:00:00</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">مصروفات حجز سيارة</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">2021/500969</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">211856060</ss:Data>
        </ss:Cell>
      </ss:Row>
      <ss:Row>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">ميثم عبدالله حسين اشكناني</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">700000045332</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">بيع مرابحة محلي</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="Number">
          <ss:Data ss:Type="Number">48948.176</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="ShortDate">
          <ss:Data ss:Type="DateTime">2020-10-28T00:00:00</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">كويتي</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String"></ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="Number">
          <ss:Data ss:Type="Number">50</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="ShortDate">
          <ss:Data ss:Type="DateTime">2022-03-23T00:00:00</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">مصروفات حجز سيارة</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">2021/500969</ss:Data>
        </ss:Cell>
        <ss:Cell ss:StyleID="General">
          <ss:Data ss:Type="String">211856060</ss:Data>
        </ss:Cell>
      </ss:Row>
    </ss:Table>
  </ss:Worksheet>
</ss:Workbook>

CodePudding user response:

I've just opened the original xls with excel and it works ok, did you try pd.read_excel?

xls file

CodePudding user response:

After many hours of search, I could create a code that enables me to convert those files (It was not acceptable to do that manually as I have more than 200 files in a folder) and this is a weekly task

import os
from glob import glob
from win32com.client import Dispatch

def convert_xls_to_xlsx(oldName:str, newName:str):
    oldName = os.path.abspath(oldName)
    newName = os.path.abspath(newName)
    xlApp = Dispatch('Excel.Application')
    wb = xlApp.Workbooks.Open(oldName)
    wb.SaveAs(newName,51)
    wb.Close(True)

allFiles = [a for a in glob("XML\*.xls")]
for file in allFiles:
    print(file)
    new_path = '.\\XLS\\'   str(file.split('\\')[-1][:-4])   '.xlsx'
    convert_xls_to_xlsx(file, new_path)
  • Related