如何将xls转换为xlsx

时间:2012-03-29 03:20:08

标签: python excel xls xlsx uno

我有一些* .xls(excel 2003)文件,我想将这些文件转换为xlsx(excel 2007)。

当我保存文档时,我使用uno python包, 我可以设置过滤器名称:MS Excel 97 但是没有像'MS Excel 2007'这样的过滤器名称,

请帮助我,如何设置过滤器名称以将xls转换为xlsx?

17 个答案:

答案 0 :(得分:17)

我以前必须这样做。主要思想是使用 xlrd 模块打开并解析xls文件并编写 使用 openpyxl 模块将内容添加到 xlsx 文件中。

这是我的代码。 注意! 它无法处理复杂的xls文件,如果要使用它,应该添加自己的解析逻辑。

import xlrd
from openpyxl.workbook import Workbook
from openpyxl.reader.excel import load_workbook, InvalidFileException

def open_xls_as_xlsx(filename):
    # first open using xlrd
    book = xlrd.open_workbook(filename)
    index = 0
    nrows, ncols = 0, 0
    while nrows * ncols == 0:
        sheet = book.sheet_by_index(index)
        nrows = sheet.nrows
        ncols = sheet.ncols
        index += 1

    # prepare a xlsx sheet
    book1 = Workbook()
    sheet1 = book1.get_active_sheet()

    for row in xrange(0, nrows):
        for col in xrange(0, ncols):
            sheet1.cell(row=row, column=col).value = sheet.cell_value(row, col)

    return book1

答案 1 :(得分:11)

您需要在计算机上安装win32com。这是我的代码:

import win32com.client as win32
fname = "full+path+to+xls_file"
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(fname)

wb.SaveAs(fname+"x", FileFormat = 51)    #FileFormat = 51 is for .xlsx extension
wb.Close()                               #FileFormat = 56 is for .xls extension
excel.Application.Quit()

答案 2 :(得分:11)

这是我的解决方案,不考虑字体,图表和图像:

Map<String, Element> newElements = new HashMap<>(elements);

newElements.keySet().removeIf(key -> !key.startsWith("W"));

然后执行此操作::

$ pip install pyexcel pyexcel-xls pyexcel-xlsx

如果您不需要程序,可以安装一个附加软件包pyexcel-cli ::

import pyexcel as p

p.save_book_as(file_name='your-file-in.xls',
               dest_file_name='your-new-file-out.xlsx')

上面的转码程序使用xlrd和openpyxl。

答案 3 :(得分:9)

我发现这里没有任何答案100%正确。所以我在这里发布我的代码:

import xlrd
from openpyxl.workbook import Workbook

def cvt_xls_to_xlsx(src_file_path, dst_file_path):
    book_xls = xlrd.open_workbook(src_file_path)
    book_xlsx = Workbook()

    sheet_names = book_xls.sheet_names()
    for sheet_index in range(0,len(sheet_names)):
        sheet_xls = book_xls.sheet_by_name(sheet_names[sheet_index])
        if sheet_index == 0:
            sheet_xlsx = book_xlsx.active()
            sheet_xlsx.title = sheet_names[sheet_index]
        else:
            sheet_xlsx = book_xlsx.create_sheet(title=sheet_names[sheet_index])

        for row in range(0, sheet_xls.nrows):
            for col in range(0, sheet_xls.ncols):
                sheet_xlsx.cell(row = row+1 , column = col+1).value = sheet_xls.cell_value(row, col)

    book_xlsx.save(dst_file_path)

答案 4 :(得分:6)

Ray的回答给了我很多帮助,但对于那些搜索简单方法将所有工作表从xls转换为xlsx的人,我做了Gist

var calc = 
    { 
        sum : function(a,b){ return a + b; }
    };

您可以找到xlrd lib here和openpyxl here(例如,您必须在项目中为Google App Engine下载xlrd)。

答案 5 :(得分:4)

提高@Jackypengyu方法的效果

合并的单元格也将被转换。

结果

以相同的顺序转换相同的12个文件:

<强>原始

ragged_rows=True

<强>提高

0:00:01.958159
0:00:02.115891
0:00:02.018643
0:00:02.057803
0:00:01.267079
0:00:01.308073
0:00:01.245989
0:00:01.289295
0:00:01.273805
0:00:01.276003
0:00:01.293834
0:00:01.261401

解决方案

0:00:00.774101
0:00:00.734749
0:00:00.741434
0:00:00.744491
0:00:00.320796
0:00:00.279045
0:00:00.315829
0:00:00.280769
0:00:00.316380
0:00:00.289196
0:00:00.347819
0:00:00.284242

答案 6 :(得分:2)

简单解决方案

我需要一个简单的解决方案来将xlx转换为xlsx格式。这里有很多答案,但他们正在做一些我并不完全理解的“魔术”。

chfw给出了一个简单的解决方案,但并不完全。

安装依赖项

使用pip安装

pip install pyexcel-cli pyexcel-xls pyexcel-xlsx

执行

所有样式和宏都将消失,但信息完好无损。

对于单个文件

pyexcel transcode your-file-in.xls your-new-file-out.xlsx

对于文件夹中的所有文件,一个

for file in *.xls; do; echo "Transcoding $file"; pyexcel transcode "$file" "${file}x"; done;

答案 7 :(得分:1)

我尝试了@Jhon Anderson的解决方案,效果很好,但是当时间格式的单元格如HH:mm:ss没有日期时,会出现“年度超出范围”错误。因为我再次改进了算法:

def xls_to_xlsx(*args, **kw):
"""
    open and convert an XLS file to openpyxl.workbook.Workbook
    ----------
    @param args: args for xlrd.open_workbook
    @param kw: kwargs for xlrd.open_workbook
    @return: openpyxl.workbook.Workbook对象
    """
    book_xls = xlrd.open_workbook(*args, formatting_info=True, ragged_rows=True, **kw)
    book_xlsx = openpyxl.workbook.Workbook()

    sheet_names = book_xls.sheet_names()
    for sheet_index in range(len(sheet_names)):
        sheet_xls = book_xls.sheet_by_name(sheet_names[sheet_index])
        if sheet_index == 0:
            sheet_xlsx = book_xlsx.active
            sheet_xlsx.title = sheet_names[sheet_index]
        else:
            sheet_xlsx = book_xlsx.create_sheet(title=sheet_names[sheet_index])
        for crange in sheet_xls.merged_cells:
            rlo, rhi, clo, chi = crange
            sheet_xlsx.merge_cells(start_row=rlo + 1, end_row=rhi,
            start_column=clo + 1, end_column=chi,)

        def _get_xlrd_cell_value(cell):
            value = cell.value
            if cell.ctype == xlrd.XL_CELL_DATE:
                datetime_tup = xlrd.xldate_as_tuple(value,0)    
                if datetime_tup[0:3] == (0, 0, 0):   # time format without date
                    value = datetime.time(*datetime_tup[3:])
                else:
                    value = datetime.datetime(*datetime_tup)
            return value

        for row in range(sheet_xls.nrows):
            sheet_xlsx.append((
                _get_xlrd_cell_value(cell)
                for cell in sheet_xls.row_slice(row, end_colx=sheet_xls.row_len(row))
            ))
    return book_xlsx

然后工作完美!

答案 8 :(得分:1)

好让我保持简单,并尝试使用Pandas:

import pandas as pd

df = pd.read_excel (r'Path_of_your_file\\name_of_your_file.xls')

df.to_excel(r'Output_path\\new_file_name.xlsx', index = False)

答案 9 :(得分:1)

您可以使用熊猫IO功能:

import pandas as pd

df = pd.read_excel('file_2003.xls', header=None)
df.to_excel('file_2003.xlsx', index=False, header=False)

答案 10 :(得分:0)

Ray的回答是剪切数据的第一行和最后一列。这是我修改过的解决方案(对于python3):

def open_xls_as_xlsx(filename):
# first open using xlrd
book = xlrd.open_workbook(filename)
index = 0
nrows, ncols = 0, 0
while nrows * ncols == 0:
    sheet = book.sheet_by_index(index)
    nrows = sheet.nrows+1   #bm added +1
    ncols = sheet.ncols+1   #bm added +1
    index += 1

# prepare a xlsx sheet
book1 = Workbook()
sheet1 = book1.get_active_sheet()

for row in range(1, nrows):
    for col in range(1, ncols):
        sheet1.cell(row=row, column=col).value = sheet.cell_value(row-1, col-1) #bm added -1's

return book1

答案 11 :(得分:0)

将XLS文件转换为XLSX

使用python3.6 我刚刚遇到同样的问题,经过几个小时的努力,我通过做ff来解决它,你可能不需要所有的包:(我会尽可能清楚)

确保在继续

之前安装以下软件包

pip install pyexcel, pip install pyexcel-xls, pip install pyexcel-xlsx,

pip install pyexcel-cli

第1步:

import pyexcel

第2步:&#34; example.xls&#34;,&#34; example.xlsx&#34;,&#34; example.xlsm&#34;

sheet0 = pyexcel.get_sheet(file_name="your_file_path.xls", name_columns_by_row=0)

第3步:从内容创建数组

xlsarray = sheet.to_array() 

第4步:检查变量内容以验证

xlsarray

step5:将名为(xlsarray)的变量中的数组传递给名为(sheet1)的新工作簿变量

sheet1 = pyexcel.Sheet(xlsarray)

第6步:保存以.xlsx结尾的新工作表(在我的情况下,我想要xlsx)

sheet1.save_as("test.xlsx")

答案 12 :(得分:0)

首先尝试@Jhon的解决方案,然后我将pyexcel用作解决方案

pyexcel.save_as(file_name=oldfilename, dest_file_name=newfilename)

它正常工作,直到我尝试通过PyInstaller将项目打包到单个exe文件中,然后尝试了所有隐藏的导入选项,仍然存在以下错误:

  File "utils.py", line 27, in __enter__
    pyexcel.save_as(file_name=self.filename, dest_file_name=newfilename)
  File "site-packages\pyexcel\core.py", line 77, in save_as
  File "site-packages\pyexcel\internal\core.py", line 22, in get_sheet_stream
  File "site-packages\pyexcel\plugins\sources\file_input.py", line 39, in get_da
ta
  File "site-packages\pyexcel\plugins\parsers\excel.py", line 19, in parse_file
  File "site-packages\pyexcel\plugins\parsers\excel.py", line 40, in _parse_any
  File "site-packages\pyexcel_io\io.py", line 73, in get_data
  File "site-packages\pyexcel_io\io.py", line 91, in _get_data
  File "site-packages\pyexcel_io\io.py", line 188, in load_data
  File "site-packages\pyexcel_io\plugins.py", line 90, in get_a_plugin
  File "site-packages\lml\plugin.py", line 290, in load_me_now
  File "site-packages\pyexcel_io\plugins.py", line 107, in raise_exception
pyexcel_io.exceptions.SupportingPluginAvailableButNotInstalled: Please install p
yexcel-xls
[3192] Failed to execute script

然后,我跳到了熊猫上

pd.read_excel(oldfilename).to_excel(newfilename, sheet_name=self.sheetname,index=False)

答案 13 :(得分:0)

@CaKel和@Jhon Anderson解决方案:

def _get_xlrd_cell_value(cell):
    value = cell.value
        if cell.ctype == xlrd.XL_CELL_DATE:
            # Start: if time is 00:00 this fix is necessary
            if value == 1.0:
                datetime_tup = (0, 0, 0)
            else:
            # end
                datetime_tup = xlrd.xldate_as_tuple(value, 0)

            if datetime_tup[0:3] == (0, 0, 0):
                value = datetime.time(*datetime_tup[3:])
            else:
                value = datetime.datetime(*datetime_tup)
    return value

现在这段代码对我来说是完美的!

答案 14 :(得分:0)

尝试使用win32com应用程序。将其安装到您的计算机中。

<?php

header('Access-Control-Allow-Orgin: *');

header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: Origin,Content-Type,Authorization,Accept,X-Requested-With,x-xsrf-token");
header("Content-Type: application/json;charset=utf-8");
include "config.php";
$postjson=json_decode(file_get_contents('php://input'),true);

if($postjson['aksi']=="process_register"){

          $checkmail=mysqli_fetch_array(mysqli_query($mysqli,"SELECT email_address FROM register WHERE email_address='$postjson[email_address]'"));

          if($checkmail['email_address']==$postjson['email_address']){
            $result=json_encode(array('success'=>false,'msg'=>'Email Already Registered'));
          }else{

                $password=md5($postjson['password']);

                $insert = mysqli_query($mysqli,"INSERT INTO register SET 
                your_name ='$postjson[your_name]',
                email_address ='$postjson[email_address]', 
                password ='$password', 
                confirm_pass ='$postjson[confirm_pass]'

                ");
                if($insert){
                    $result=json_encode(array('success'=>true,'msg'=>'Register Successfully'));
                }else{
                    $result=json_encode(array('success'=>false,'msg'=>'Register error'));
                }

          }
          echo $result;
}
?>

谢谢。

答案 15 :(得分:0)

这是适用于带有旧 xls 文件(例如 Excel 97 2004)的 MacOS 的解决方案。

我发现处理这种格式的最佳方法(如果 excel 不是一个选项)是在 openoffice 中打开文件并将其另存为另一种格式作为 csv 文件。

答案 16 :(得分:0)

使用win32com(pywin32),作为@kvdogan的回答主要是完美的方法。一些必要条件:

  1. 使用 Windows(显然);
  2. 已安装 MSExcel;
  3. 确保文件路径是完整路径;

此外,Pywin32 项目在 SourceForge 上不是最新的。而是使用 github:https://github.com/mhammond/pywin32 有一个.chm文件,你可以用SumatraPDF阅读,例如,在安装后的项目文件夹中。

#My answer contains no code at all.

编辑:我没有足够的声誉来发表评论。对于实际的洪水,我很抱歉。