- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只是想简单地检查 .xlsx 文件中是否存在工作表,如果不存在,我想添加它。
book = load_workbook('test.xlsx')
writer = pd.ExcelWriter('test.xlsx', engine = 'openpyxl')
writer.book = book
if 'testSheet' in book.sheetnames:
pass
else:
book.add_sheet(book['testSheet'])
关于为什么这不起作用的任何想法?
最佳答案
如果您只使用扩展名为 *.xlsx
的 Excel 文件, 然后 openpyxl 具有有用的功能,允许您创建、访问、重命名、向 Excel 工作表添加/删除数据。虽然使用 openpyxl 访问工作簿的工作表似乎相当简单,但使用 Python 的异常处理可以帮助在工作表一开始不存在时捕获错误。考虑下面的示例,如果工作簿“test.xlsx”不存在名为“invalidSheet”的工作表,则会引发 KeyError。 try/except block 的工作是在工作表不存在时引发异常。这个简单示例的目的是仅识别 openpyxl 引发的异常的类型。
In [1]: import openpyxl
In [2]: book = openpyxl.load_workbook("test.xlsx")
In [3]: try:
...: ws = book["invalidSheet"] #try to access a non-existent worksheet
...: except:
...: raise
...:
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-3-4f4ac71a4f19> in <module>
1 try:
----> 2 ws = book["invalidSheet"]
3 except:
4 raise
5
~\Anaconda3\lib\site-packages\openpyxl\workbook\workbook.py in __getitem__(self, key)
275 if sheet.title == key:
276 return sheet
--> 277 raise KeyError("Worksheet {0} does not exist.".format(key))
278
279 def __delitem__(self, key):
KeyError: 'Worksheet invalidSheet does not exist.'
这有助于我们形成一个更明确的 try/except block 来捕获不存在的工作表。稍后,我们将改进此示例,但首先让我们找出此 Excel 电子表格中的工作表名称。我们使用 sheetnames
Workbook 对象的属性 book
我们之前创建的:
In [15]: book.sheetnames
Out[15]: ['testSheet1', 'testSheet2']
In [16]: type(book.sheetnames)
Out[16]: list
这将返回工作表名称列表。稍后我们将使用此信息来验证工作表名称。回到上面的例子,下面的改进版本捕获了 KeyError
对于不存在的工作表,如果不存在则创建一个新工作表。然而,工作表不会出现在实际的 Excel 电子表格中,除非我们 save()
它。另一方面,工作表名称仍将为该对象更新。您可以在执行代码段后验证这一点:
In [20]: try:
...: filename = "test.xlsx"
...: sheet_name = "invalidSheet"
...: ws = book[sheet_name]
...: except KeyError:
...: print("The worksheet '{}' does not exist for workbook '{}'. Creating one...".format(
...: sheet_name,
...: filename))
...: book.create_sheet(sheet_name)
...: print("Worksheet '{}' created successfully for workbook '{}'.".format(sheet_name, filename))
...:
The worksheet 'invalidSheet' does not exist for workbook 'test.xlsx'. Creating one...
Worksheet 'invalidSheet' created successfully for workbook 'test.xlsx'.
In [21]: book.sheetnames
Out[21]: ['testSheet1', 'testSheet2', 'invalidSheet']
现在我们已经添加了工作表“invalidSheet”,让我们添加一些数据并用更有意义的名称保存它。 Openpyxl 还提供了 Pandas dataframe support .我们将首先创建一个数据框,然后使用 dataframe_to_rows()
将数据框中的每一行(包括标题)附加到工作表中。方法,然后重命名工作表,最后保存。
In [23]: import pandas as pd
In [24]: df = pd.DataFrame({"Name": ["John", "Val", "Katie"],
"Favorite Pet":["dog", "cat", "guinea pig"]}) #create dataframe
In [25]: df
Out[25]:
Name Favorite Pet
0 John dog
1 Val cat
2 Katie guinea pig
In [26]: from openpyxl.utils.dataframe import dataframe_to_rows #import method
In [27]: ws = book["invalidSheet"] #create a worksheet object for the existing sheet "invalidSheet"
In [29]: for r in dataframe_to_rows(df, index=False, header=True):
...: ws.append(r) #append each df row to the worksheet
...:
In [31]: ws['A2'].value #verify value at cell 'A2'. Remember, the first row will be the header
Out[31]: 'John'
In [32]: ws.title = "favPetSheet" #rename the worksheet
In [33]: book.sheetnames #verify whether the sheet was added & renamed
Out[33]: ['testSheet1', 'testSheet2', 'favPetSheet']
In [35]: book.save("test.xlsx") #save the workbook
在理想情况下,单个函数应该为工作簿和数据框的特定工作簿和工作表执行所有这些任务。
In [45]: def check_sheet_add_data(filename, sheetname, df):
...: """Check if sheet exists for an xlsx spreadsheet and add data from dataframe to the sheet
...: :param: filename - The filename of the xlsx spreadsheet
...: :param: sheetname - Name of the worksheet to search for
...: :param: df - A Pandas dataframe object"""
...:
...: wb = openpyxl.load_workbook(filename)
...: try:
...: ws = wb[sheetname]
...: print("Sheet '{}' found in workbook '{}'".format(sheetname, filename))
...: except KeyError:
...: print("Worksheet '{}' not found for workbook '{}'.Adding...".format(sheetname, filename))
...: wb.create_sheet(sheetname)
...: ws = wb[sheetname]
...: print()
...: print("Current sheetnames: {}".format(wb.sheetnames))
...: print()
...: print("Worksheet '{}' added successfully for workbook '{}'".format(sheetname, filename))
...: finally:
...: print()
...: print("Adding data to worksheet '{}'...".format(sheetname))
...: print()
...: for r in dataframe_to_rows(df, index=False, header=True):
...: ws.append(r)
...: wb.save(filename)
...: print("Workbook '{}' saved successfully.".format(filename))
...: print()
...: print("***End***")
准备好这个函数后,让我们测试所有条件。首先让我们添加一些新数据,比如为我们的老 friend John、Val 和 Katie 说“最喜欢的专辑”。
In [39]: df2 = pd.DataFrame({"Name":["John", "Val", "Katie"],
"Favorite Album": ["Thriller", "Stairway to Heaven", "Abbey Road"]})
In [40]: df2
Out[40]:
Name Favorite Album
0 John Thriller
1 Val Stairway to Heaven
2 Katie Abbey Road
我们的工作簿将是相同的“test.xlsx”,我们的新工作表将称为“favAlbumSheet”。测试现有和不存在的工作表的所有条件:
#Condition 1: Worksheet does not exist
In [44]: check_sheet_add_data(filename="test.xlsx", sheetname="favAlbumSheet", df=df2)
Worksheet 'favAlbumSheet' not found for workbook 'test.xlsx'.Adding...
Current sheetnames: ['testSheet1', 'testSheet2', 'favPetSheet', 'favAlbumSheet']
Worksheet 'favAlbumSheet' added successfully for workbook 'test.xlsx'
Adding data to worksheet 'favAlbumSheet'...
Workbook 'test.xlsx' saved successfully.
***End***
#Condition 2: Worksheet exists
In [46]: check_sheet_add_data(filename="test.xlsx", sheetname="favAlbumSheet", df=df2)
Sheet 'favAlbumSheet' found in workbook 'test.xlsx'
Adding data to worksheet 'favAlbumSheet'...
Workbook 'test.xlsx' saved successfully.
***End***
我们利用 Openpyxl 易于使用的功能来访问有效 Excel 工作簿中的工作表,并将数据帧中的数据添加到工作表。通过 Python 的异常处理,我们能够清楚地识别工作表(对于有效工作簿)的存在并在必要时添加一个。该功能可以进一步扩展以捕获其他错误,如无效文件名(FileNotFoundError
),无效数据框对象等。如果您不想每次都添加数据并且只检查工作表是否存在,请制作df
可选参数:df=None
并且只保存工作簿而不将任何数据附加到工作表,在 finally
block 。
关于python - 检查工作簿中的工作表并在缺少时添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55922153/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!