libreoffice python_libreoffice python 操作word及excel文档的方法

本文介绍了如何使用Python的libreoffice库来操作Word和Excel文档。通过初始化Office进程,启动和停止服务,初始化服务管理器,以及导入、读取和写入数据等步骤,详细讲解了读取和写入doc文档及excel数据的方法,包括读取文档中的数据,解析文本和表格,并生成二进制数据,以及将数据转换为PDF格式。这是一份完整的实战教程,帮助开发者实现文档处理自动化。
摘要由CSDN通过智能技术生成

1、开始、关闭libreoffice服务;

开始之前同步字体文件时间,是因为创建soffice服务时,服务会检查所需加载的文件的时间,如果其认为时间不符,则其可能会重新加载,耗时较长,因此需事先统一时间。

使用时如果需要多次调用,最后每次调用均开启后关闭,否则libreoffice会创建一个缓存文档并越用越大,处理时间会增加。

class OfficeProcess(object):

def __init__(self):

self.p = 0

subprocess.Popen('find /usr/share/fonts | xargs touch -m -t 201801010000.00', shell=True)

def start_office(self):

self.p = subprocess.Popen('soffice --pidfile=sof.pid --invisible --accept="socket,host=localhost,port=2002;urp;"', shell=True)

while True:

try:

local_context = uno.getComponentContext()

resolver = local_context.getServiceManager().createInstanceWithContext('com.sun.star.bridge.UnoUrlResolver', local_context)

resolver.resolve('uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext')

return

except:

print(ts(), "wait for connecting soffice...")

time.sleep(1)

continue

def stop_office(self):

with open("sof.pid", "rb") as f:

try:

os.kill(int(f.read()), signal.SIGTERM)

self.p.wait()

except:

pass

2、init service manager

local_context = uno.getComponentContext()

service_manager = local_context.getServiceManager()

resolver = service_manager.createInstanceWithContext('com.sun.star.bridge.UnoUrlResolver', local_context)

self.ctx = resolver.resolve('uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext')

self.smgr = self.ctx.ServiceManager

self.desktop = self.smgr.createInstanceWithContext('com.sun.star.frame.Desktop', self.ctx)

3、从二进制数据中读取doc文档

def ImportFromMemory(self, data):

istream = self.smgr.createInstanceWithContext('com.sun.star.io.SequenceInputStream', self.ctx)

istream.initialize((uno.ByteSequence(data), ))

pv = PropertyValue()

pv.Name = 'InputStream'

pv.Value = istream

self.doc = {'doc': []}

try:

self.document = self.desktop.loadComponentFromURL('private:stream/swriter', '_blank', 0, (pv, ))

self.text = self.document.getText()

except:

self.text = None

4、读取doc文档中的数据

def ExportToJson(self):

try:

l = self.__ParseText(self.text, self.__Callback(self.doc['doc']))

self.doc['length'] = l

except:

self.doc = {'doc': [], 'length': 0}

return json.dumps(self.doc)

@staticmethod

def __Callback(alist):

def Append(sth):

alist.append(sth)

return Append

def __ParseText(self, text, func):

l = 0

text_it = text.createEnumeration()

while text_it.hasMoreElements():

element = text_it.nextElement()

if element.supportsService('com.sun.star.text.Paragraph'):

l += self.__ParseParagraph(element, func)

elif element.supportsService('com.sun.star.text.TextTable'):

l += self.__ParseTable(element, func)

else:

pass

return l

def __ParseParagraph(self, paragraph, func):

p = {'paragraph': []}

l = 0

paragraph_it = paragraph.createEnumeration()

while paragraph_it.hasMoreElements():

portion = paragraph_it.nextElement()

if portion.TextPortionType == 'Text':

l += self.__ParsePortionText(portion, self.__Callback(p['paragraph']))

elif portion.TextPortionType == 'SoftPageBreak':

pass

elif portion.TextPortionType == 'TextField':

l += self.__ParsePortionText(portion, self.__Callback(p['paragraph']))

else:

l += self.__ParseTextContent(portion, self.__Callback(p['paragraph']))

if hasattr(paragraph, 'createContentEnumeration'):

l +=

LibreOffice可以通过Python UNO API与Python进行交互,可以使用Python编写脚本来控制LibreOffice的各种功能,包括创建、读取和修改Excel文件。 下面是一个简单的Python脚本,可以使用LibreOfficePython UNO API创建一个新的Excel文档,并向其中添加一些数据: ```python import uno import os # 启动LibreOffice localContext = uno.getComponentContext() resolver = localContext.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver", localContext) context = resolver.resolve("uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext") desktop = context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", context) # 创建一个新的Excel文档 calc = desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, ()) # 获取文档的第一个表格 sheets = calc.getSheets() sheet = sheets.getByIndex(0) # 向表格中添加一些数据 cell = sheet.getCellByPosition(0, 0) cell.setValue(1) cell = sheet.getCellByPosition(1, 0) cell.setValue(2) cell = sheet.getCellByPosition(2, 0) cell.setFormula("=sum(A1:B1)") # 保存文档 filename = os.path.join(os.getcwd(), "example.xlsx") calc.storeToURL("file://" + filename.replace("\\", "/"), ()) # 关闭文档 calc.close(True) ``` 这个脚本的作用是创建一个新的Excel文档,向其中添加一些数据,然后将其保存到指定的文件中。你可以根据自己的需求修改这个脚本,添加更多的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值