2012-09-11 16 views
5

Python'u kullanarak, belirli bir Excel sayfa hücresindeki tüm alt dizeleri kalın veya italik olarak bulmam gerekir.Bir Excel belge hücresindeki bir metin alt kümesinin biçimlendirmesini nasıl bulabilirim

Benim sorunum bu benzer: Ben aynı biçimlendirme için hücredeki tüm içeriğini bulundurur kabul edemeyiz olarak çözümü ..fakat

Using XLRD module and Python to determine cell font style (italics or not)

benim için geçerli değildir. tek bir hücrede değer şöyle olabilir:


1. Bazı kalın yazı Bazı normal bir metin. Bazı italik metinler.


xlrd kullanarak bir hücrede karakterlerin bir dizi biçimlendirme (veya başka bir Python Excel modülü) bulmak için bir yol var mı?

cevap

3

Tüm doğru işaretçiler için @Vyassa'ya teşekkürler, bir XLS dosyasındaki satırlar üzerinde yinelenen aşağıdaki kodu yazabildim ve çıktılar stili "tek" stil bilgisi olan hücreler (örneğin, tüm hücre italiktir) veya stil "bölümler" (örneğin, hücrenin bir kısmı italiktir, bunun bir kısmı değildir) ile ilgili bilgi.

import xlrd 

# accessing Column 'C' in this example 
COL_IDX = 2 

book = xlrd.open_workbook('your-file.xls', formatting_info=True) 
first_sheet = book.sheet_by_index(0) 

for row_idx in range(first_sheet.nrows): 
    text_cell = first_sheet.cell_value(row_idx, COL_IDX) 
    text_cell_xf = book.xf_list[first_sheet.cell_xf_index(row_idx, COL_IDX)] 

    # skip rows where cell is empty 
    if not text_cell: 
    continue 
    print text_cell, 

    text_cell_runlist = first_sheet.rich_text_runlist_map.get((row_idx, COL_IDX)) 
    if text_cell_runlist: 
    print '(cell multi style) SEGMENTS:' 
    segments = [] 
    for segment_idx in range(len(text_cell_runlist)): 
     start = text_cell_runlist[segment_idx][0] 
     # the last segment starts at given 'start' and ends at the end of the string 
     end = None 
     if segment_idx != len(text_cell_runlist) - 1: 
     end = text_cell_runlist[segment_idx + 1][0] 
     segment_text = text_cell[start:end] 
     segments.append({ 
     'text': segment_text, 
     'font': book.font_list[text_cell_runlist[segment_idx][1]] 
     }) 
    # segments did not start at beginning, assume cell starts with text styled as the cell 
    if text_cell_runlist[0][0] != 0: 
     segments.insert(0, { 
     'text': text_cell[:text_cell_runlist[0][0]], 
     'font': book.font_list[text_cell_xf.font_index] 
     }) 

    for segment in segments: 
     print segment['text'], 
     print 'italic:', segment['font'].italic, 
     print 'bold:', segment['font'].bold 

    else: 
    print '(cell single style)', 
    print 'italic:', book.font_list[text_cell_xf.font_index].italic, 
    print 'bold:', book.font_list[text_cell_xf.font_index].bold 
2
Eğer xlrd ile yapabilirsiniz eğer bilmiyorum

, ancak herhangi bir diğer Python Excel modülü hakkında sormak tarihi: openpyxlsürümü 1.6.1 de bunu yapabilirsiniz.

Zengin metin, openpyxl/reader/strings.py numaralı telefondan get_string() işlevinde yeniden oluşturulur. Bu modülde 'ham' dizelerle ikinci bir tablo ayarlamak nispeten kolay olacaktır.

4

xlrd bunu yapabilir. load_workbook() kwarg ile formatting_info=True numaralı telefonu aramanız gerekir; daha sonra, bu nesneler için rich_text_runlist_map numaralı bir öznitelik eşleme hücresi koordinatlarına ((row, col) tuple) çalıştırma listesi bu hücreye sahip olacaktır. Bir Çalışma Listesine özelliklerini açıklayan size Font object verir yazı başlar hücreye ve çalışma kitabı nesnenin font_list niteliğine font_index indekslerde (çalışma kitabı nesnesi load_workbook() döndürdüklerine budur) nerede offset anlatır (offset, font_index) çiftleri dizisi olan kalın, italik, yazı tipi, boyut, vb. dahil olmak üzere yazı tipi

+0

Bu biraz el ile ancak bence işe yarar tek şey –

İlgili konular