使用 Python 和 pyuno 将 SpreadSheets 转换为 CSV 文件

作者:Mitch Frazier

使用我们上周开发的 OORunner 类,我们现在将创建一个 Python 类,用于将电子表格转换为 CSV 文件。 该转换器支持 OpenOffice 支持的任何类型的输入电子表格。

运行时,该程序会接收成对的输入和输出文件,例如

$ python ssconverter.py file1.xls file1.csv file2.ods file2.csv

每个输入文件都是一个电子表格,它被转换为相应的输出文件作为 CSV 文件。

操作的核心发生在convert来自SSConverter类的函数中。 它首先使用 OORunner 类启动 OpenOffice 运行。 然后,它将输入和输出文件名转换为 URL,并使用 OORunner 返回的桌面对象来创建和加载文档对象。 将电子表格转换为 CSV 文件仅仅是将文档保存到输出 URL。 SSConverter 类的源代码如下

#!/usr/bin/python
#
# Convert spreadsheet to CSV file.
#
# Based on:
#   PyODConverter (Python OpenDocument Converter) v1.0.0 - 2008-05-05
#   Copyright (C) 2008 Mirko Nasato <mirko@artofsolving.com>
#   Licensed under the GNU LGPL v2.1 - or any later version.
#   https://gnu.ac.cn/licenses/lgpl-2.1.html
#

import os
import ooutils

import uno
from com.sun.star.task import ErrorCodeIOException



class SSConverter:
    """
    Spreadsheet converter class.
    Converts spreadsheets to CSV files.
    """

    def __init__(self, oorunner=None):
        self.desktop  = None
        self.oorunner = None


    def convert(self, inputFile, outputFile):
        """
        Convert the input file (a spreadsheet) to a CSV file.
        """

        # Start openoffice if needed.
        if not self.desktop:
            if not self.oorunner:
                self.oorunner = ooutils.OORunner()

            self.desktop = self.oorunner.connect()

        inputUrl  = uno.systemPathToFileUrl(os.path.abspath(inputFile))
        outputUrl = uno.systemPathToFileUrl(os.path.abspath(outputFile))
        document  = self.desktop.loadComponentFromURL(inputUrl, "_blank", 0, ooutils.oo_properties(Hidden=True))

        try:
            # Additional property option:
            #   FilterOptions="59,34,0,1"
            #     59 - Field separator (semicolon), this is the ascii value.
            #     34 - Text delimiter (double quote), this is the ascii value.
            #      0 - Character set (system).
            #      1 - First line number to export.
            #
            # For more information see:
            #   http://wiki.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options
            #
            document.storeToURL(outputUrl, ooutils.oo_properties(FilterName="Text - txt - csv (StarCalc)"))
        finally:
            document.close(True)


if __name__ == "__main__":
    from sys import argv
    from os.path import isfile

    if len(argv) == 2  and  argv[1] == '--shutdown':
        ooutils.oo_shutdown_if_running()
    else:
        if len(argv) < 3  or  len(argv) % 2 != 1:
            print "USAGE:"
            print "  python %s INPUT-FILE OUTPUT-FILE INPUT-FILE OUTPUT-FILE..." % argv[0]
            print "OR"
            print "  python %s --shutdown" % argv[0]
            exit(255)
        if not isfile(argv[1]):
            print "File not found: %s" % argv[1]
            exit(1)

        try:
            i = 1
            converter = SSConverter()

            while i+1 < len(argv):
                print '%s => %s' % (argv[i], argv[i+1])
                converter.convert(argv[i], argv[i+1])
                i += 2

        except ErrorCodeIOException, exception:
            print "ERROR! ErrorCodeIOException %d" % exception.ErrCode
            exit(1)

OORunner 一样,此代码基于 PyODConverter。 下周,我们将编写一个转换器函数,如果 CSV 文件不存在,则自动从相应的电子表格创建 CSV 文件。 此外,如果电子表格比 CSV 文件更新,它将重新创建 CSV 文件。 这样,您就可以在代码中交替使用电子表格和 CSV 文件。

Mitch Frazier 是 Emerson Electric Co. 的嵌入式系统程序员。自 2000 年代初以来,Mitch 一直是Linux Journal 的撰稿人和朋友。

加载 Disqus 评论