PyUNO-Pythonからのxlsレポートの簡単なマイナー編集

早くて簡単



少し前まで、私はソフトウェアの変更のリストを記録する必要に直面していました。 顧客からフォームが送られてきたので、社内のドキュメント要件に従ってフォームに入力する必要がありました。 私は手紙に添付されたファイル「 1.xls



」を開き、少し落ち込んでいた。 より正確には、解雇の考え、そして自殺の考えが頭に浮かんだ。 フォームは14列で構成されていました。 列の数と、私たちが行ったアトミックな変更の数(約500)をすばやく思い浮かべて、喫煙に行きました。

私は手でそのような仕事をすることはできません。 ほとんどのデータ(新しいバージョンの数、変更の説明など)私は、もちろん、別の場所で最も奇妙な形式で入手できました。 しかし、700のコピー&ペースト-却下。 それで少しピューノを学ばなければなりませんでした 。 念のために-誰かが便利になったら、PythonバインディングからOOo



ドキュメントを管理するプロセスを簡単に説明します。



Open Office



python



、そして実際にはバインダーが必要です。

 $ sudo yum search pyuno ure
      
      





OOo



を開始します(スプレッドシートが必要ですが、この方法はすべてのアプリケーションで機能します-例2を参照)。「listen to socket」オプションをオンにします。

 $ oocalc "-accept=socket,host=localhost,port=8100;urp;" & $ soffice "-accept=socket,host=localhost,port=8100;urp;" -writer -headless &
      
      





...そしてコードを書くために出発します。 開始するには、ドキュメントインスタンスを取得します。

 import uno from os.path import abspath, isfile, splitext def getDocument(inputFile) : localContext = uno.getComponentContext() resolver = localContext.ServiceManager.createInstanceWithContext( \ "com.sun.star.bridge.UnoUrlResolver", localContext) try: context = resolver.resolve( \ "uno:socket,host=localhost,port=%s;urp;StarOffice.ComponentContext" % 8100) except NoConnectException: raise Exception, "failed to connect to OpenOffice.org on port %s" % 8100 desktop = context.ServiceManager.createInstanceWithContext( \ "com.sun.star.frame.Desktop", context) document = desktop.loadComponentFromURL( \ uno.systemPathToFileUrl(abspath(inputFile)), "_blank", 0, tuple([]))
      
      





このメモの範囲を超えて、テキストファイルと変更ログから最終ドキュメントに記入するためのデータの受信はそのままにします。 それらを魔法の杖の波でdata



疑似data



単純に表示させdata



。 それでは、ドキュメントの記入を始めましょう(列番号2を記入):

 from com.sun.star.beans import PropertyValue def fillDocument(inputFile, col, data) : try: sheet = getDocument(inputFile).getSheets().getByIndex(0) row = 2 while True: row = row + 1 val = sheet.getCellByPosition(col, row).getFormula() if val != '' : sheet.getCellByPosition(col, row).setFormula(val.replace(%VERSION%, data)) else : break; ''' All the rows are now filled, It's time to save our modified document ''' props = [] prop = PropertyValue() prop.Name = "FilterName" prop.Value = "MS Excel 97" props.append(prop) document.storeToURL(uno.systemPathToFileUrl(abspath(inputFile)) + ".out.xls", tuple(props)) finally: document.close(True)
      
      





同様に、他の列でも実行できます。 あなたは、翻訳のために道路 Google翻訳に行くことさえできます。

より便利な機能



別のドキュメントを挿入



 ''' Required for Ctrl+G :-) ''' from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER def addAtTheEnd(inputFile) : cursor.gotoEnd(False) cursor.BreakType = PAGE_BEFORE cursor.insertDocumentFromURL(uno.systemPathToFileUrl(abspath(inputFile)), ())
      
      





検索と置換



 def findAndReplace(pattern, substTo, replaceAll, caseSensitive) : search = document.createSearchDescriptor() search.SearchRegularExpression = True search.SearchString = pattern search.SearchCaseSensitive = caseSensitive result = document.findFirst(search) while found: result.String = string.replace(result.String, pattern, substTo) if not replaceAll : break result = document.findNext(result.End, pattern)
      
      





PDFにエクスポート



 def exportToPDF(outputFile) props = [] prop = PropertyValue() prop.Name = "FilterName" prop.Value = "writer_pdf_Export" props.append(prop) document.storeToURL(uno.systemPathToFileUrl(abspath(outputFile)), tuple(props))
      
      





免責事項



私はすぐに予約をしたい:コードはかつてニーハイのgovnokodであると主張している。 しかし、「レポートファイルをすぐに更新しましょう」-個人的にはすでに多くの時間を節約できました。



-ここと周辺では、さらにいくつかの情報を収集できます: http : //wiki.services.openoffice.org/wiki/Uno/FAQ

-OOo用のPythonテンプレートエンジン: appyframework.org

-同じ、C ++のみ: habrahabr.ru/blogs/cpp/116228



Upd:コメントは別の方法を示唆しています: xlwt

Upd2:より「新しい」xlsx形式で生成するには、次のような便利なlib: xlsx.dowski.comがあります。

両方の追加について-tanennに感謝します



All Articles