1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
   | #   exemple de macro python pour libreoffice
#   macro en : C:\Users\<nom du user>\AppData\Roaming\LibreOffice\4\user\Scripts\python\testIban.py
#   Outils/Macros/Gérer les Macros/Python  Mes Macros/testIBan   exécuter test_valid_iban
#   testé avec Libreoffice 4.3 sous WINDOWS 7
#   J.P  décembre
#
import re
 
_country2length = dict(
    AL=28, AD=24, AT=20, AZ=28, BE=16, BH=22, BA=20, BR=29,
    BG=22, CR=21, HR=21, CY=28, CZ=24, DK=18, DO=28, EE=20,
    FO=18, FI=18, FR=27, GE=22, DE=22, GI=23, GR=27, GL=18,
    GT=28, HU=28, IS=26, IE=22, IL=23, IT=27, KZ=20, KW=30,
    LV=21, LB=28, LI=21, LT=20, LU=20, MK=19, MT=31, MR=27,
    MU=30, MC=27, MD=24, ME=22, NL=18, NO=15, PK=24, PS=29,
    PL=28, PT=25, RO=24, SM=27, SA=24, RS=22, SK=24, SI=19,
    ES=24, SE=24, CH=21, TN=24, TR=26, AE=23, GB=22, VG=24 )
 
def valid_iban(iban):
    # Ensure upper alphanumeric input.
    iban = iban.replace(' ','').replace('\t','')
    if not re.match(r'^[\dA-Z]+$', iban): 
        return False
    # Validate country code against expected length.
    if len(iban) != _country2length[iban[:2]]:
        return False
    # Shift and convert.
    iban = iban[4:] + iban[:4]
    digits = int(''.join(str(int(ch, 36)) for ch in iban)) #BASE 36: 0..9,A..Z -> 0..35
    return digits % 97 == 1
 
def test_valid_iban( ):
    """on ecrit des IBAN en cellules A:1 et A:2 on les teste si non valide on le met en rouge"""
#get the doc from the scripting context which is made available to all scripts
    desktop = XSCRIPTCONTEXT.getDesktop()
    calc = desktop.getCurrentComponent()
    sheet = calc.getSheets().getByIndex(0) #1ere feuille du classeur
    sheet.getCellByPosition(0, 0).setString("GB82 WEST 1234 5698 7654 32") # On écrit un IBAN valide en cellule A:1
    sheet.getCellByPosition(0, 1).setString("GB82 TEST 1234 5698 7654 32") # On écrit un IBAN non valide en cellule A:2
    # on balaie les lignes pour tester les IBAN
    for i in range(0,2):
         ibanIsValid = valid_iban(sheet.getCellByPosition(0, i).getString())
         if ibanIsValid:
            sheet.getCellByPosition(0, i).setPropertyValue( "CharColor", 0x000000 ) # Police en noir
         else:
            sheet.getCellByPosition(0, i).setPropertyValue( "CharColor", 0xff0000 ) # Police en rouge
    return None | 
Partager