2012-09-11 14 views
5

में पाठ के उप-समूह के लिए स्वरूपण कैसे मिल सकता है पाइथन का उपयोग करके, मुझे किसी दिए गए एक्सेल शीट सेल में सभी सबस्ट्रिंग्स को खोजने की आवश्यकता है जो या तो बोल्ड या इटैलिक हैं।मुझे एक्सेल दस्तावेज़ सेल

मेरे समस्या इस के समान है: के रूप में मैं कल्पना नहीं कर सकते कि एक ही स्वरूपण के लिए रखती है सेल में सभी सामग्री

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

समाधान ..लेकिन मेरे लिए लागू नहीं है। कुछ बोल्ड पाठ कुछ सामान्य पाठ


1.: किसी एकल कक्ष में मूल्य इस तरह देख सकते हैं। कुछ इटालिक पाठ


वहाँ xlrd का उपयोग कर एक सेल में पात्रों की एक सीमा के स्वरूपण (या किसी अन्य अजगर एक्सेल मॉड्यूल) को खोजने के लिए एक तरीका है?

उत्तर

3

सभी सही पॉइंटर्स के लिए @ व्यासा के लिए धन्यवाद, मैं निम्नलिखित कोड लिखने में सक्षम हूं जो एक्सएलएस फ़ाइल और आउटपुट शैली में पंक्तियों पर पुनरावृत्त करता है "एकल" शैली की जानकारी वाले कोशिकाओं के लिए जानकारी (उदाहरण के लिए, संपूर्ण सेल इटालिक है) या शैली "सेगमेंट" (उदाहरण के लिए, सेल का हिस्सा इटैलिक है, इसका हिस्सा नहीं है)।

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

मैं आप ऐसा कर सकते अगर xlrd साथ पता नहीं है, लेकिन जब से आप किसी भी अन्य अजगर एक्सेल मॉड्यूल के बारे में पूछते हैं: openpyxlसंस्करण 1.6.1 में ऐसा नहीं कर सकते हैं।

समृद्ध पाठ में openpyxl/reader/strings.py में फ़ंक्शन में पुनर्निर्मित हो जाता है। उस मॉड्यूल में 'कच्चे' तारों के साथ दूसरी तालिका सेट करना अपेक्षाकृत आसान होगा।

4

xlrd ऐसा कर सकते हैं। आपको load_workbook() को kwarg formatting_info=True के साथ कॉल करना होगा, फिर शीट ऑब्जेक्ट्स में rich_text_runlist_map एक विशेषता होगी जो उस सेल के लिए रनलिस्ट पर एक शब्दकोश मैपिंग सेल निर्देशांक ((row, col) टुपल्स) है। एक runlist (offset, font_index) जोड़े का एक दृश्य है, जो आप एक Font object के गुणों का वर्णन करने देता है जहां offset आपको बताता है जहां सेल फॉन्ट शुरू होता है, और कार्यपुस्तिका वस्तु की font_list विशेषता में font_index सूचकांकों में (कार्यपुस्तिका वस्तु क्या load_workbook() द्वारा लौटाई गई है) है बोल्ड, इटालिक्स, टाइपफेस, आकार इत्यादि सहित फ़ॉन्ट

+0

यह थोड़ा सा मैनुअल है लेकिन मुझे लगता है कि यह एकमात्र चीज है जो काम करती है –