OpenPyXL富文本含空白字符生成Excel文件打开报错求助
OpenPyXL生成富文本Excel打开报错的原因及解决办法
问题现象
使用以下OpenPyXL代码生成的Excel文件打开时会报错,但将代码中的c_r_text.append("\n \n")替换为c_r_text.append("\n...\n")后,文件可正常打开:
from openpyxl.cell.text import InlineFont from openpyxl.cell.rich_text import TextBlock, CellRichText from openpyxl.styles.colors import Color as OpxlColor from openpyxl import Workbook from openpyxl.styles import Alignment c_r_text=CellRichText() c_r_text.append("\n \n") c_r_text.append(TextBlock(InlineFont(sz=22),"Text22")) c_r_text.append("\n \n") c_r_text.append(TextBlock(InlineFont(sz=16),"Text16")) wb = Workbook() ws = wb.active ws['A1'] = c_r_text ws['A1'].alignment = Alignment(wrapText=True) ws.column_dimensions['A'].width = 80 wb.save(r"C:\tmp\testrich2_text.xlsx")
报错原因
Excel对富文本的XML格式有严格要求:纯文本节点不能仅包含空白字符(换行、空格的组合)。当OpenPyXL向CellRichText中添加仅含"\n \n"的纯文本块时,生成的XML会出现不含有效内容的空白文本节点,Excel解析这类节点时会判定文件损坏,触发打开报错。而添加含可见字符(如...)的文本块时,文本节点有有效内容,符合Excel的格式规范,因此可正常打开。
解决办法
1. 将空白内容整合到相邻的TextBlock中
把需要的换行、空格直接加到TextBlock的文本内容里,避免单独添加纯空白的文本块:
from openpyxl.cell.text import InlineFont from openpyxl.cell.rich_text import TextBlock, CellRichText from openpyxl import Workbook from openpyxl.styles import Alignment c_r_text = CellRichText() # 把换行和空格整合到TextBlock的文本前后 c_r_text.append(TextBlock(InlineFont(sz=22), "\n \nText22")) c_r_text.append(TextBlock(InlineFont(sz=16), "\n \nText16")) wb = Workbook() ws = wb.active ws['A1'] = c_r_text ws['A1'].alignment = Alignment(wrapText=True) ws.column_dimensions['A'].width = 80 wb.save(r"C:\tmp\testrich2_text.xlsx")
2. 给空白文本块添加不可见占位符
在空白内容中加入零宽空格(\u200B),既保留原有的换行缩进格式,又让文本节点拥有有效内容,避免触发Excel的解析错误:
from openpyxl.cell.text import InlineFont from openpyxl.cell.rich_text import TextBlock, CellRichText from openpyxl import Workbook from openpyxl.styles import Alignment c_r_text=CellRichText() # 添加零宽空格作为占位符 c_r_text.append("\n \u200B\n") c_r_text.append(TextBlock(InlineFont(sz=22),"Text22")) c_r_text.append("\n \u200B\n") c_r_text.append(TextBlock(InlineFont(sz=16),"Text16")) wb = Workbook() ws = wb.active ws['A1'] = c_r_text ws['A1'].alignment = Alignment(wrapText=True) ws.column_dimensions['A'].width = 80 wb.save(r"C:\tmp\testrich2_text.xlsx")
3. 使用单元格样式实现缩进
如果仅需要缩进效果,可通过设置单元格的indent对齐属性代替手动添加空格,避免空白文本块的问题:
from openpyxl.cell.text import InlineFont from openpyxl.cell.rich_text import TextBlock, CellRichText from openpyxl import Workbook from openpyxl.styles import Alignment c_r_text=CellRichText() c_r_text.append("\n") c_r_text.append(TextBlock(InlineFont(sz=22),"Text22")) c_r_text.append("\n") c_r_text.append(TextBlock(InlineFont(sz=16),"Text16")) wb = Workbook() ws = wb.active ws['A1'] = c_r_text # 设置缩进2级,代替手动空格 ws['A1'].alignment = Alignment(wrapText=True, indent=2) ws.column_dimensions['A'].width = 80 wb.save(r"C:\tmp\testrich2_text.xlsx")
内容的提问来源于stack exchange,提问作者PatriceC
相关产品推荐
相关产品推荐

