2017-02-17 8 views
0

Я беру несколько CSV-файлов с разделителями-запятыми и используя их для создания электронной таблицы XLS, в которой имена файлов становятся отдельными вкладками в электронной таблице. Код, который у меня есть, дает результаты, которые я хочу, за исключением случаев, когда открывается электронная таблица. Я получаю следующее предупреждение: «Некоторое форматирование текста может быть изменено в этом файле, поскольку максимальное количество шрифтов было превышено. Это может помочь закрыть другие документы и повторить попытку «. Я уверен, что проблема возникает из кода, пытающегося изменить формат ячеек за пределом строки 65536, но я не уверен, как ограничить изменения строк. Мне нужно не более нескольких сотен строк по четыре столбца.Как не превышать максимальное количество шрифтов при создании таблиц XLS

import csv, glob, xlwt, sys, os 
csvFiles = os.path.join(LogFileFolder, "*") 
wb = xlwt.Workbook() 
colNames = ['iNFADS_FAC','CAT','Crosswalk_FAC','FAC'] 
for filename in glob.glob(csvFiles): 
    (f_path, f_name) = os.path.split(filename) 
    (f_short_name, f_extension) = os.path.splitext(f_name) 
    ws = wb.add_sheet(f_short_name) 
    with open(filename, 'rb') as csvf: 
     csvReader = csv.reader(csvf) 
     for rowx, row in enumerate(csvReader): 
      for colx, value in enumerate(row): 
       if value in colNames: 
        ws.write(rowx, colx, value, xlwt.easyxf(
         "border: top medium, right medium, bottom double, left medium; 
         font: bold on; pattern: pattern solid, fore_color pale_blue; 
         align: vert centre, horiz centre")) 
       elif value not in colNames: 
        ws.write(rowx, colx, float(value), 
         xlwt.easyxf("align: vert centre, horiz centre")) 
##This second "xlwt.easyxf(align...)" part is the offending section of the code, if 
##I remove just that part then the problem goes away. Is there a way to keep 
##it within the 65536 limit here? 
       else: 
        pass 
wb.set_active_sheet = 1  
outXLS = os.path.join(LogFileFolder, "FAC-CAT Code Changes.xls") 
wb.save(outXLS) 

ответ

0

Я хочу поблагодарить Джона Мачина из «python-excel» группы Google для ответа на мой вопрос. По-видимому, решение состоит в том, чтобы переместить часть easyxf в переменную раньше в скрипте, а затем просто вызвать ее, когда это необходимо. Поэтому сценарий должен выглядеть следующим образом:

csvFiles = os.path.join(LogFileFolder, "*") 
wb = xlwt.Workbook() 
headerStyle = xlwt.easyxf("border: top medium, right medium, bottom double," \ 
    "left medium; font: bold on; pattern: pattern solid, fore_color pale_blue;" \ 
    "align: vert centre, horiz centre") 
valueStyle = xlwt.easyxf("align: vert centre, horiz centre") 
colNames = ['iNFADS_FAC','CAT','Crosswalk_FAC','FAC'] 
for filename in glob.glob(csvFiles): 
    (f_path, f_name) = os.path.split(filename) 
    (f_short_name, f_extension) = os.path.splitext(f_name) 
    ws = wb.add_sheet(f_short_name) 
    with open(filename, 'rb') as csvf: 
     csvReader = csv.reader(csvf) 
     for rowx, row in enumerate(csvReader): 
      for colx, value in enumerate(row): 
       if value in colNames: 
        ws.col(colx).width = 256 * 15 
        ws.write(rowx, colx, value, headerStyle) 
       elif value not in colNames: 
        ws.write(rowx, colx, float(value), valueStyle) 
       else: 
        pass 
wb.set_active_sheet = 1  
outXLS = os.path.join(LogFileFolder, "FAC-CAT Code Changes.xls") 
wb.save(outXLS)