# -*- tab-width: 4; indent-tabs-mode: nil; py-indent-offset: 4 -*- # # This file is part of the LibreOffice project. # # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. #
import sys import traceback
import officehelper from com.sun.star.lang import Locale from com.sun.star.util import NumberFormat from com.sun.star.sheet import CellFlags
def get_desktop():
desktop = None try:
remote_context = officehelper.bootstrap()
srv_mgr = remote_context.getServiceManager() if srv_mgr isNone:
print("Can't create a desktop. No connection, no remote office servicemanager available!") else:
desktop = srv_mgr.createInstanceWithContext("com.sun.star.frame.Desktop", remote_context) except Exception as e:
print(f"Failed to get desktop: {e}")
traceback.print_exc()
sys.exit(1) return desktop
def get_number_format_key(number_formats, format: str, language) -> int: """Get number format key, create one if not exist yet.
:param number_formats: object managing number formats. It implements XNumberFormats interface.
:param str format: the number format.
:param language: language locale.
:type language: com.sun.star.lang.Locale
:return: key of the number format specific to the given language and format. """
key = 0 try: # Try to query the existing number format if (key := number_formats.queryKey(format, language, True)) == -1: # If not exist, create a new one if (key := number_formats.addNew(format, language)) == -1:
key == 0 except Exception as e:
print(f"Failed to get key: {e}")
traceback.print_exc() return key
def create_example_data(sheet, number_formats): """Create example data with specific number format.
:param sheet: spreadsheet object. It implements XSpreadsheet interface.
:param number_formats: object managing number formats. It implements XNumberFormats interface. """ try:
language = Locale()
language.Country = "de"# Germany -> DM
language.Language = "de"# German
:param sheet: spreadsheet object. It implements XSpreadsheet interface.
:param number_formats: object managing number formats. It implements XNumberFormats interface.
:param str old_symbol: the old number format symbol.
:param str new_symbol: convert to this the new one.
:param float factor: conversion factor. """ try:
language = Locale()
language.Country = "de"# Germany -> DM
language.Language = "de"# German
for cell_range in sheet.CellFormatRanges:
format = number_formats.getByKey(cell_range.NumberFormat)
format_type = format.Type
currency_symbol = format.CurrencySymbol if format_type & NumberFormat.CURRENCY and currency_symbol == old_symbol:
thousands_sep = format.ThousandsSeparator
negative_red = format.NegativeRed
decimals = format.Decimals
leading_zeros = format.LeadingZeros
locale = format.Locale # create a new numberformat string
new_number_format = number_formats.generateFormat(
simple_key, locale, thousands_sep, negative_red, decimals, leading_zeros
) # get the NumberKey from the numberformat
new_number_format_key = get_number_format_key(number_formats, new_number_format, locale) # set the new numberformat to the cellrange DM->EUR
cell_range.NumberFormat = new_number_format_key
# iterate over all cells from the cellrange with a # content and use the DM/EUR factor
sheet_cell_ranges = cell_range.queryContentCells(CellFlags.VALUE) if sheet_cell_ranges.getCount() > 0: for cell in sheet_cell_ranges.getCells():
cell.Value = cell.Value / factor except Exception as e:
print(f"Failed to convert currency: {e}")
traceback.print_exc()
def main():
desktop = get_desktop() if desktop isNone: return
try:
doc = desktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, tuple())
print("Create a new Spreadsheet") except Exception as e:
print(f"Failed to load component from URL: {e}")
traceback.print_exc() return
# the Action Interface provides methods to hide actions, # like inserting data, on a sheet, that increase the performance
doc.addActionLock()
try:
sheet = doc.Sheets[0] except Exception as e:
print(f"Failed to get sheet: {e}")
traceback.print_exc() return
# insert some example data in a sheet
create_example_data(sheet, doc.NumberFormats)
print("Insert example data and use the number format with the currency 'DM'")
# Change the currency from the cells from DM to Euro
convert(sheet, doc.NumberFormats, "DM", "EUR", 1.95583)
print("Change the number format to EUR and divide the values with the factor 1.95583")
# remove all locks, the user see all changes
doc.removeActionLock()
print("done")
if __name__ == "__main__":
main()
# vim: set shiftwidth=4 softtabstop=4 expandtab:
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.