使用 Python 和 pyuno 将 SpreadSheets 转换为 CSV 文件
于 2009 年 1 月 6 日
使用我们上周开发的 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 文件。