@@ -856,6 +856,17 @@ def __call__(self, value: str) -> Union[str, Date, Time]:
856
856
if t : return t
857
857
return value
858
858
859
+ def tabtotext (data : Iterable [Dict [str , CellValue ]], # ..
860
+ headers : List [str ] = [], selected : List [str ] = [],
861
+ * , fmt : str = "" , tab : Optional [str ] = None , padding : Optional [str ] = None , minwidth : int = 0 , section : str = NIX ,
862
+ noheaders : bool = False , unique : bool = False , defaultformat : str = "" ) -> str :
863
+ stream = StringIO ()
864
+ print_tabtotext (stream , data , headers , selected , # ..
865
+ tab = tab , padding = padding ,
866
+ minwidth = minwidth , section = section ,
867
+ noheaders = noheaders , unique = unique , defaultformat = (fmt or defaultformat ))
868
+ return stream .getvalue ()
869
+
859
870
def print_tabtotext (output : Union [TextIO , str ], data : Iterable [Dict [str , CellValue ]], # ..
860
871
headers : List [str ] = [], selected : List [str ] = [],
861
872
* , tab : Optional [str ] = None , padding : Optional [str ] = None , minwidth : int = 0 , section : str = NIX ,
@@ -1343,49 +1354,79 @@ def extension(filename: str) -> Optional[str]:
1343
1354
tabs .append (TabSheet (data , headers , title ))
1344
1355
return tabs
1345
1356
1346
- def print_tablist (output : Union [TextIO , str ], tablist : List [TabSheet ], selected : List [str ] = [],
1347
- * , tab : Optional [str ] = None , padding : Optional [str ] = None , minwidth : int = 0 ,
1348
- noheaders : bool = False , unique : bool = False ,
1349
- loglevel : int = ERROR , section : Union [None , int , str ] = None , defaultformat : str = "" ) -> str :
1350
- if len (tablist ) == 0 :
1351
- logg .log (loglevel , "no data in file %s" , filename )
1352
- elif len (tablist ) == 1 :
1353
- tabsheet1 = tablist [0 ]
1354
- return print_tabtotext (output , tabsheet1 .data , tabsheet1 .headers , selected , padding = padding , tab = tab ,
1355
- noheaders = noheaders , unique = unique , minwidth = minwidth ,
1356
- defaultformat = defaultformat )
1357
- elif section :
1358
- tabsheet2 : Optional [TabSheet ] = None
1357
+ def print_tablist (output : Union [TextIO , str ], tablist : List [TabSheet ] = [], selected : List [str ] = [], # ..
1358
+ * , tab : Optional [str ] = None , padding : Optional [str ] = None ,
1359
+ minwidth : int = 0 , section : Union [str , int ] = NIX ,
1360
+ noheaders : bool = False , unique : bool = False , defaultformat : str = "" ) -> str :
1361
+ def extension (filename : str ) -> Optional [str ]:
1362
+ _ , ext = fs .splitext (filename .lower ())
1363
+ if ext : return ext [1 :]
1364
+ return None
1365
+ if section :
1359
1366
if isinstance (section , int ):
1360
1367
if section > len (tablist ):
1361
1368
logg .error ("selected -%i page, but input has only %s pages" , section , len (tablist ))
1369
+ tabsheets = []
1362
1370
else :
1363
- tabsheet2 = tablist [section - 1 ]
1371
+ tabsheets = [ tablist [section - 1 ] ]
1364
1372
else :
1373
+ tabsheets = []
1365
1374
tabsheetnames = []
1366
1375
for tabsheet in tablist :
1367
1376
tabsheetnames += [tabsheet .title ]
1368
1377
if tabsheet .title == section :
1369
- tabsheet2 = tabsheet
1370
- if not tabsheet2 :
1378
+ tabsheets += [ tabsheet ]
1379
+ if not tabsheets :
1371
1380
logg .error ("selected '-: %s' page, but input has only -: %s" , section , " " .join (tabsheetnames ))
1372
- if tabsheet2 :
1373
- return print_tabtotext (output , tabsheet2 .data , tabsheet2 .headers , selected , padding = padding , tab = tab ,
1374
- noheaders = noheaders , unique = unique , minwidth = minwidth , section = tabsheet2 .title ,
1375
- defaultformat = defaultformat )
1376
- elif isinstance (output , str ) and (defaultformat == "xlsx" and output or output .endswith (".xlsx" )):
1377
- workbook3 = tablistmake_workbook (tablist , selected , minwidth )
1378
- if workbook3 :
1379
- workbook3 .save (output )
1380
- return "SAVED"
1381
1381
else :
1382
- for tabsheet3 in tablist :
1383
- logg .debug ("headers = %s" , tabsheet3 .headers )
1384
- logg .debug ("data = %s" , tabsheet3 .data )
1385
- return print_tabtotext (output , tabsheet3 .data , tabsheet3 .headers , selected , padding = padding , tab = tab ,
1386
- noheaders = noheaders , unique = unique , minwidth = minwidth , section = tabsheet3 .title ,
1387
- defaultformat = defaultformat )
1388
- return NIX
1382
+ tabsheets = tablist
1383
+ if len (tabsheets ) == 1 :
1384
+ if tabsheets [0 ].title :
1385
+ logg .info (" ## %s" , tabsheets [0 ].title )
1386
+ title = section if isinstance (section , str ) else NIX
1387
+ return print_tabtotext (output , tabsheets [0 ].data , tabsheets [0 ].headers , selected ,
1388
+ tab = tab , padding = padding , minwidth = minwidth ,
1389
+ section = title , noheaders = noheaders , unique = unique , defaultformat = defaultformat )
1390
+ if isinstance (output , TextIO ) or isinstance (output , StringIO ):
1391
+ out = output
1392
+ fmt = defaultformat
1393
+ done = "stream"
1394
+ elif "." in output :
1395
+ fmt = extension (output ) or defaultformat
1396
+ if fmt in ["xls" , "xlsx" , "XLS" , "XLSX" ]:
1397
+ wb1 = tablistmake_workbook (tabsheets , selected ) # type: ignore[arg-type]
1398
+ if wb1 :
1399
+ wb1 .save (output )
1400
+ return "tabxlsx (%s tables)" % len (wb1 .worksheets )
1401
+ return "tabxlsx"
1402
+ out = open (output , "wt" , encoding = "utf-8" )
1403
+ done = output
1404
+ else :
1405
+ fmt = output
1406
+ out = sys .stdout
1407
+ done = output
1408
+ result : List [str ] = []
1409
+ for tabsheet in tabsheets :
1410
+ if tabsheet .title :
1411
+ logg .info (" ## %s" , tabsheet .title )
1412
+ text = tabtotext (tabsheet .data , tabsheet .headers , selected , fmt = fmt ,
1413
+ tab = tab , padding = padding , minwidth = minwidth ,
1414
+ section = tabsheet .title , noheaders = noheaders , unique = unique ,
1415
+ defaultformat = defaultformat )
1416
+ result .append (text )
1417
+ if fmt in ["jsn" , "json" , "JSN" , "JSON" ]:
1418
+ for part in range (len (result )- 1 ):
1419
+ if result [part ].endswith ("]}" ):
1420
+ result [part ] = result [part ][:- 1 ] + ","
1421
+ for part in range (1 , len (result )):
1422
+ if result [part ].startswith ('{"' ):
1423
+ result [part ] = result [part ][1 :]
1424
+ for lines in result :
1425
+ for line in lines :
1426
+ out .write (line )
1427
+ if noheaders or "@noheaders" in selected or "@dat" in selected :
1428
+ return ""
1429
+ return ": %s results %s (%s tables)" % (len (result ), done , len (tabsheets ))
1389
1430
1390
1431
1391
1432
if __name__ == "__main__" :
0 commit comments