Excel单元格部分字体颜色Python实现

效果图

xlsxwriter

from xlsxwriter.workbook import Workbook
import re

# 创建Excel对象
workbook = Workbook('a.xlsx')
worksheet = workbook.add_worksheet()
color = workbook.add_format({'color': 'red', 'bold': True})

# 日期高亮
rc = re.compile('([0-9年月日]{2,})')
sentence = '小洪和小黄2020年1月12日母校初见。1月26日长烟落日孤城闭,2月9日神仙眷侣云比心'
format_ls = rc.split(sentence)
for i in range(len(format_ls)-1, -1, -1):
    if rc.fullmatch(format_ls[i]):
        format_ls.insert(i, color)  # Prefix the word with the format
print(format_ls)

# 写入单元格
row, col = 2, 1
worksheet.write_rich_string(row, col, *format_ls)
workbook.close()

中间产物打印

['小洪和小黄', <xlsxwriter.format.Format object at 0x00000225C39CE588>, '2020年1月12日', '母校初见。', <xlsxwriter.format.Format object at 0x00000225C39CE588>, '1月26日', '长烟落日孤城闭,', <xlsxwriter.format.Format object at 0x00000225C39CE588>, '2月9日', '神仙眷侣云比心']

报错场景

from xlsxwriter.workbook import Workbook

# 创建Excel对象
workbook = Workbook('a.xlsx')
worksheet = workbook.add_worksheet()
color = workbook.add_format({'color': 'red'})

col = 1
for row, string_parts in enumerate([
    [color, 'a', ''],  # Excel doesn't allow empty strings in rich strings.
    [color, 'a'],  # You must specify more then 2 format/fragments for rich strings.
    [color, 'a', 'b'],  # 不报错
    ['b', 'b', 'b'],  # 不报错
]):
    print(string_parts)
    worksheet.write_rich_string(row, col, *string_parts)
workbook.close()

总结

  1. 不允许空字符串
  2. format/fragments数量≥3

xlsxwriter其它接口

from jieba import tokenize
from xlsxwriter.workbook import Workbook

# 创建Excel对象
workbook = Workbook(filename='phone.xlsx')
worksheet = workbook.add_worksheet()
color = workbook.add_format({'bold': True, 'color': 'red'})


def ner(text):
    for clause in text.split(','):  # 切句
        for word, head, tail in tokenize(clause):  # 分词+位置
            if word in {'小米', '苹果'}:  # NER
                yield (
                    [i for i in(clause[:head], color, word, clause[tail:])if i],
                    word,
                )


texts = ['买小米机,送了袋小米和苹果', '诺基亚', '买华为送苹果']
row = 0
for e, t in enumerate(texts):
    first_row = row
    for w, c in ner(t):
        worksheet.write_rich_string(row, 1, *w)
        worksheet.write_string(row, 2, c)
        row += 1
    print(first_row, row)
    if row == first_row+1:
        worksheet.write_string(row-1, 0, t)
    elif row > first_row+1:  # 合并单元格
        worksheet.merge_range(first_row, first_col=0, last_row=row-1, last_col=0, data=t)
# 列宽
linefeed = workbook.add_format({
    'align': 'center',  # 居中对齐(align: vi. 排列)
    'valign': 'top',  # 上对齐
    'text_wrap': 1,  # 换行
    'font_size': 9,  # 字体大小
    # 'bg_color': 'gray',  # 背景色
})
worksheet.set_column(first_col=0, last_col=1, width=11, cell_format=linefeed)
workbook.close()
  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值