xlsxwriter:是否有一种方法可以打开工作簿中的现有工作表?

49

我可以打开已有的工作簿,但是我没有看到任何打开该工作簿内部现有工作表的方法。是否有任何方法可以做到这一点?


6
xlsxwriter库用于编写Excel文件,但不能读取它们。 - alecxe
1
请查看以下链接:https://dev59.com/22Mk5IYBdhLWcg3w7CGX - shellbye
4个回答

49

使用 xlsxwriter 无法向现有的 xlsx 文件追加内容。

有一个名为 openpyxl 的模块,可以让你读取和写入预先存在的 Excel 文件,但我相信这样做的方法涉及从 Excel 文件中读取信息,以某种方式存储所有信息(数据库或数组),然后在调用 workbook.close() 时重新编写,这将把所有信息都写入你的 xlsx 文件。

同样地,你也可以使用自己的方法来“追加”到 xlsx 文档。我最近必须追加到一个 xlsx 文件中,因为我有很多不同的测试,其中 GPS 数据进入主工作表,然后每次开始测试时我都必须追加一个新的工作表。如果没有 openpyxl,我唯一能解决这个问题的方法是使用 xlrd 读取 Excel 文件,然后运行行和列...

例如:

cells = []
for row in range(sheet.nrows):
    cells.append([])
    for col in range(sheet.ncols):
        cells[row].append(workbook.cell(row, col).value)

你不需要使用数组。例如,以下方法也可以完美地工作:

import xlrd
import xlsxwriter

from os.path import expanduser
home = expanduser("~")

# this writes test data to an excel file
wb = xlsxwriter.Workbook("{}/Desktop/test.xlsx".format(home))
sheet1 = wb.add_worksheet()
for row in range(10):
    for col in range(20):
        sheet1.write(row, col, "test ({}, {})".format(row, col))
wb.close()

# open the file for reading
wbRD = xlrd.open_workbook("{}/Desktop/test.xlsx".format(home))
sheets = wbRD.sheets()

# open the same file for writing (just don't write yet)
wb = xlsxwriter.Workbook("{}/Desktop/test.xlsx".format(home))

# run through the sheets and store sheets in workbook
# this still doesn't write to the file yet
for sheet in sheets: # write data from old file
    newSheet = wb.add_worksheet(sheet.name)
    for row in range(sheet.nrows):
        for col in range(sheet.ncols):
            newSheet.write(row, col, sheet.cell(row, col).value)

for row in range(10, 20): # write NEW data
    for col in range(20):
        newSheet.write(row, col, "test ({}, {})".format(row, col))
wb.close() # THIS writes

然而,我发现将数据读入并存储到二维数组中更容易,因为我需要多次操作数据并不断接收输入,但我不想在测试结束之前写入Excel文件(你可以使用xlsxwriter轻松实现这一点,直到调用.close()方法为止)。


2
我真的不会说“非常复杂的结构”。该结构只是一个zipfile归档,其中每个工作表都是一个带有单元格内容的XML文件。它很容易访问、阅读和编辑,只是XlsxWriter旨在成为一个写入器。而不是一个读取器 - Alex Huszagh
4
@AlexanderHuszagh:我认为它看起来有多么复杂,取决于你想从中获取什么。如果你只需要单元格的值,那么读取数据确实非常简单。但是,如果你想提取公式、格式等内容,就不那么简单了。也许还不至于"非常复杂",但足够复杂,以至于没有人急着填补xlrd和OpenPyXL中的功能缺口。(即使是用Java编写的Apache POI也有一些缺口)此外,我认为它足够复杂,以至于如果你不知道自己在做什么而尝试写入文件,就会破坏预先存在的文件。 - John Y
xlrd==1.2.0 -- 这个版本可以读取 .xlsx 扩展名的文件。最新版的 xlrd 报错了。 - Mohamed Jaleel Nazir
看起来你现在可以在我的实例中安装和使用xlrd2了。import xlrd2 as xlrd这样剩下的代码就能正常运行了。 - that_roy

7

在搜索了一些关于在xlxs中打开现有表格的方法后,我发现

existingWorksheet = wb.get_worksheet_by_name('Your Worksheet name goes here...')
existingWorksheet.write_row(0,0,'xyz')

现在您可以将任何数据附加/写入到打开的工作表中。

8
你好,如何打开工作簿进行读写?当我尝试使用这个函数时,它只能在你的脚本创建了工作表之后才能获取。根据文档,你无法读取或修改(https://xlsxwriter.readthedocs.io/introduction.html)。 - Jean-Francois T.
5
我仍然不确定你是如何打开已存在的 Excel 文件的,因为这并没有回答原来的问题。 - MattiH
为什么这个回答会有任何赞同?问题是***"xlsxwriter:有没有办法在我的工作簿中打开现有的工作表"***。答案是Xlsxwriter只能从头开始创建新的工作簿,无法打开和编辑现有的Excel文件,所以这个回答是错误的。 - moken

5
尽管在前两个答案中提到了相应的文档链接,并且从文档中似乎确实有新方法来处理“工作表”,但我无法在最新的“xlsxwriter == 3.0.3”软件包中找到这些方法。
“xlrd”现已删除对除xls文件之外的所有内容的支持。因此,我可以使用“openpyxl”进行操作,它可以提供如上面第一个答案中提到的所期望的功能。

4
您可以使用 workbook.get_worksheet_by_name() 功能: https://xlsxwriter.readthedocs.io/workbook.html#get_worksheet_by_name 根据 https://xlsxwriter.readthedocs.io/changes.html,该功能已于2016年5月13日添加。
“发布0.8.7-2016年5月13日
- 修复了在 Windows 上插入只读图像的问题。 问题#352。 - 添加了 get_worksheet_by_name() 方法,以允许通过名称从工作簿检索工作表。 - 修复了内部文件创建和修改日期在本地时区而不是UTC的问题。”

11
这只适用于使用XlsxWriter创建的工作簿/工作表。XlsxWriter无法读取现有文件。 - jmcnamara
1
很高兴知道这个信息,@jmcnamara!我刚刚一直在努力尝试访问一个已存在的虚拟文件,但是却遇到了Nonetype错误,这解释了这个错误。 - jeppoo1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接