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
# Copyright (c) 2010-2024 openpyxl
 
from openpyxl.cell.text import Text
 
from openpyxl.xml.functions import iterparse
from openpyxl.xml.constants import SHEET_MAIN_NS
from openpyxl.cell.rich_text import CellRichText
 
 
def read_string_table(xml_source):
    """Read in all shared strings in the table"""
 
    strings = []
    STRING_TAG = '{%s}si' % SHEET_MAIN_NS
 
    for _, node in iterparse(xml_source):
        if node.tag == STRING_TAG:
            text = Text.from_tree(node).content
            text = text.replace('x005F_', '')
            node.clear()
 
            strings.append(text)
 
    return strings
 
 
def read_rich_text(xml_source):
    """Read in all shared strings in the table"""
 
    strings = []
    STRING_TAG = '{%s}si' % SHEET_MAIN_NS
 
    for _, node in iterparse(xml_source):
        if node.tag == STRING_TAG:
            text = CellRichText.from_tree(node)
            if len(text) == 0:
                text = ''
            elif len(text) == 1 and isinstance(text[0], str):
                text = text[0]
            node.clear()
 
            strings.append(text)
 
    return strings