【问题标题】:How to read excel cell and retain or detect its format in Python如何在 Python 中读取 excel 单元格并保留或检测其格式
【发布时间】:2016-08-13 01:02:54
【问题描述】:

我得到了一个包含一些文本格式的 excel 文件。有些可以是粗体,有些可以是斜体,有些可以是大写1,还有一些其他格式(但没有上述三种格式那么多)。

例子:

  • Ku'lah 2ku.lah v; 定义:一些定义; 用法: 一些用法;
  • He'lahsa 2he.lah.sa n; 定义:一些定义; 用法:一些用法;
  • 等等

现在,由于这个单元格将作为字典(real,human,dictionary)数据库条目,我想保留单元格的格式,因为告诉单词的用法(如上述情况中的bold表示单词类型:v(动词)和italic表示新部分)。

但它都在excel单元格中。

当我尝试使用 Toad for Oracle 等数据库工具直接读取 excel 文件时,格式消失了!

  1. 有什么方法可以读取excel文件并保留格式吗?
  2. 或者,有没有办法检测格式?只要我们可以检测到格式,我就可以简单地将文本替换为一些 HTML 格式,例如 <b>v</b>,这将是我的工作。我只想知道我们如何在 Python 中保留或检测 excel 单元格文本格式。 (特别是这三种格式:粗体、斜体和大写)

编辑:

我尝试使用 xlrd 包获取文本格式,但我似乎无法找到获取文本格式样式的方法,因为 cell 对象仅包含:ctypevalue 和 @ 987654327@。它没有关于文本格式的信息,当我使用formatting_info=True 创建实例时:

book = xlrd.open_workbook("HuluHalaDict.xlsx", sys.stdout, 0, xlrd.USE_MMAP, None, None, \
                          formatting_info=True, on_demand=False, ragged_rows=False)

我收到以下错误:

NotImplementedError:formatting_info=True 尚未实现

xlrd 包的xlsx.py 文件中的这一行引发:

if formatting_info:
    raise NotImplementedError("formatting_info=True not yet implemented")

我觉得很奇怪,因为我使用的是 0.9.4 xlrd(最新)版本,而documentation 表示,自 0.6.1 以上版本开始,格式信息已包含在内:

默认格式

默认格式应用于所有空单元格(未描述的单元格) 通过细胞记录)。首先是行默认信息(ROW 记录, 如果可用,则使用 Rowinfo 类。做不到这一点,列默认 如果可用,则使用信息(COLINFO 记录,Colinfo 类)。作为一个 最后的手段将使用工作表/工作簿默认单元格格式; 这应该始终存在于 Excel 文件中,由 XF 描述 使用固定索引 15(从 0 开始)记录。默认情况下,它使用 工作表/工作簿默认单元格样式,由第一个 XF 描述 记录(索引 0)。 xlrd 版本中不包含格式化功能 0.6.1

富文本,即包含部分粗斜体和下划线的字符串 文本、字符串内字体的更改等。请参阅 OOo 文档 s3.4 和 s3.2 亚洲注音文字(称为“红宝石”),用于日语假名。看 OOo docs s3.4.2 (p15) 条件格式。请参阅 OOo 文档 s5.12, s6.21(CONDFMT 记录)、s6.16(CF 记录)杂项表级 和书籍级别的项目,例如打印布局,屏幕窗格。现代 Excel 文件版本不保留大多数内置的“数字格式” 文件; Excel 根据用户的区域设置加载格式。现在 xlrd 对此的模拟仅限于适用的硬连线表 到美国英语语言环境。这可能意味着货币符号、日期 顺序、千位分隔符、小数分隔符等不合适。 请注意,这不会影响正在复制 XLS 文件的用户,仅 那些在视觉上渲染单元格的人。

我在这里犯了什么错误吗?我的代码如图所示:

book = xlrd.open_workbook("HuluHalaDict.xlsx", sys.stdout, 0, xlrd.USE_MMAP, None, None, \
                          formatting_info=True, on_demand=False, ragged_rows=False)

编辑 2:

post 中显示的示例表明它使用formatting_info=True 创建了类实例 (book)。但我在我的实现中检查它。它引发了上面的错误。有什么想法吗?

【问题讨论】:

  • 关于xlrd:没有比源码更大的权限了。如果它没有在源代码中实现,那么它就没有实现,句号。为时间机器编写文档并不能使时间机器工作。您需要了解的是 .xls 文件与 .xlsx 非常不同,xlrd 最初是作为 .xls 的阅读器开始的。事实上,在创建 xlrd 时,.xlsx 甚至还不存在。在 xlrd 0.6.1(2007 年 6 月)发布时,.xlsx 仍然很新,几乎没有使用。所以当它说它支持从 0.6.1 开始读取格式时,这意味着它支持读取 .xls 中的格式。
  • xlrd 仅从 0.8.0(2012 年 8 月)正式支持读取 .xlsx。 xlrd 的一些功能仍然只适用于 .xls。
  • 另一件需要理解的事情是“格式化”涵盖了很多不同的东西。例如,能够阅读数字格式(例如是否有千位分隔符或固定的小数位数)与能够判断文本是否居中是不同的。您正在谈论的那种格式,在一个单元格中有多种样式,被称为“丰富”格式,它是最复杂的格式之一。即使某些包说它可以读取格式,它也可能无法读取丰富的格式。
  • @JohnY 啊,是的,formatting 上有很多东西。因此,我的关注仅限于带有粗体、斜体和上标的 excel 单元格。由于源代码是在xlrd的情况下打开的,所以我只想知道我是否犯了任何错误(比如在安装/下载时),尽管formatting_info=True在其他帖子中是可以接受的,但我不能为我的情况做 - 虽然我的 xlrd 版本是 0.9.4。如果 0.8.0 版支持 xlsx,那么我希望我的代码能够工作 - 但它没有。感谢您的宝贵意见。

标签: python excel text-formatting


【解决方案1】:

我建议你图书馆 xlrd https://secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/xlrd.html?p=4966

在 GitHub 上 https://github.com/python-excel/xlrd

您可以在Using XLRD module and Python to determine cell font style (italics or not)Using XLRD module and Python to determine cell font style (italics or not)找到一个关于如何使用 xlrd 确定字体样式的简单示例

这里是一个实际的例子:

from xlrd import open_workbook

path = '/Users/.../Desktop/Workbook1.xls'
wb = open_workbook(path, formatting_info=True)
sheet = wb.sheet_by_name("Sheet1")
cell = sheet.cell(0, 0) # The first cell
print("cell.xf_index is", cell.xf_index)
fmt = wb.xf_list[cell.xf_index]
print("type(fmt) is", type(fmt))
print("Dumped Info:")
fmt.dump()

它输出以下内容:

cell.xf_index is 62
type(fmt) is <class 'xlrd.formatting.XF'>
Dumped Info:
_alignment_flag: 0
_background_flag: 0
_border_flag: 0
_font_flag: 1
_format_flag: 0
_protection_flag: 0
alignment (XFAlignment object):
    hor_align: 0
    indent_level: 0
    rotation: 0
    shrink_to_fit: 0
    text_direction: 0
    text_wrapped: 0
    vert_align: 2
background (XFBackground object):
    background_colour_index: 65
    fill_pattern: 0
    pattern_colour_index: 64
border (XFBorder object):
    bottom_colour_index: 0
    bottom_line_style: 0
    diag_colour_index: 0
    diag_down: 0
    diag_line_style: 0
    diag_up: 0
    left_colour_index: 0
    left_line_style: 0
    right_colour_index: 0
    right_line_style: 0
    top_colour_index: 0
    top_line_style: 0
font_index: 6
format_key: 0
is_style: 0
lotus_123_prefix: 0
parent_style_index: 0
protection (XFProtection object):
    cell_locked: 1
    formula_hidden: 0
xf_index: 62

_font_flag: 1 表示粗体

【讨论】:

  • 好的,给我一些时间,我会试着玩一会儿! ;)
  • 包没有任何办法获取单元格文本格式。有什么想法吗?
  • 确实如此,通过使用字体类:secure.simplistix.co.uk/svn/xlrd/trunk/xlrd/doc/…
  • 你有任何使用它的例子吗?我试过了,但失败了——但可能是我试错了
  • 最后,我选择使用C#Microsoft.Office.Interop.Excel来解决我的问题。但我仍然将您的答案标记为已接受,因为我认为这可能对未来的访客有用 - 除了向您表示感谢。尽管如此,就我的实际问题而言,可能是由于安装版本错误(无意中)导致formatting_info=True 无法正常工作。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
  • 2022-07-12
相关资源
最近更新 更多