【发布时间】: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 文件时,格式消失了!
- 有什么方法可以读取excel文件并保留格式吗?
- 或者,有没有办法检测格式?只要我们可以检测到格式,我就可以简单地将文本替换为一些 HTML 格式,例如
<b>v</b>,这将是我的工作。我只想知道我们如何在 Python 中保留或检测 excel 单元格文本格式。 (特别是这三种格式:粗体、斜体和大写)
编辑:
我尝试使用 xlrd 包获取文本格式,但我似乎无法找到获取文本格式样式的方法,因为 cell 对象仅包含:ctype、value 和 @ 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