我试图从.xlsx worbook生成一个PDF文件。首先,我用另一个工作簿的数据创建一个新的工作簿(带有一些额外的数据转换)。然后,我将新工作簿保存到临时路径。然后,我想打开创建的.xlsx并将其保存为PDF文件。
但当我试图保存它时,我收到了这样的信息:
Błąd: (-2147352567, 'Wystąpił wyjątek.', (0, 'Microsoft Excel', 'Nie zapisano dokumentu. Być może jest on otwarty lub przy zapisywaniu napotkano błąd.', 'xlmain11.chm', 0, -2146827284), None)
(it为波兰语)The document was not saved. Perhaps it is open or an error was encountered when saving it
没有代码,这是应该保存.pdf文件,.xlsx文件是正确创建。
我的程序代码:
import sys
import openpyxl
from openpyxl import Workbook
from openpyxl.drawing.image import Image
from openpyxl.utils import get_column_letter
from tkinter.filedialog import asksaveasfile
import os
from win32com import client
initialFile = sys.argv[1]
initialCatalog = sys.argv[2]
assetsCatalog = f"{initialCatalog}\\api\\assets"
def codeToPictogram(code):
for files in os.walk(assetsCatalog):
if f'{code}.png' in files[2]:
return 1
else:
return 0
try:
wb = openpyxl.load_workbook(initialFile)
ws = wb.active
ws.title = "Stan techniczny nawierzchni"
for row in ws.iter_cols(min_row=2, min_col=2, max_row=ws.max_row, max_col=ws.max_column):
for cell in row:
if(cell.value is None):
continue
if (codeToPictogram(cell.value) == 1):
img = Image(f"{assetsCatalog}\\{cell.value}.png")
img.height = 100
img.width = 100
ws.add_image(img, f"{get_column_letter(cell.column)}{cell.row}")
file = asksaveasfile(defaultextension='.pdf',title = 'Zapisz stan techniczny', filetypes=[("Plik PDF", "*.pdf")])
if file is not None:
wb.save(f'{initialCatalog}\\api\\temp\\temp.xlsx')
# wb.close()
excel = client.Dispatch("Excel.Application")
sheets = excel.Workbooks.Open(f'{initialCatalog}\\api\\temp\\temp.xlsx')
work_sheets = sheets.Worksheets[0]
work_sheets.ExportAsFixedFormat(0, file.name)
print("Gotowe!")
input("Wciśnij Enter, aby zamknąć...")
except Exception as e:
print(f"Błąd: {e}")
input("Wciśnij Enter, aby zamknąć...")
我尝试使用wb.close()
,但没有任何成功。我正在查看openpyxl文档,但我没有找到任何方法将新工作簿保存为.pdf而不首先将其保存为.xlsx。
这是我第一次尝试做Python应用程序,所以也许有一些愚蠢的简单,我不知道。我试图适应C#:)
我会很感激任何帮助
2条答案
按热度按时间mw3dktmi1#
我认为你有两个主要问题
asksaveasfile
创建了一个textIowrapper
,pdf文件是由命令创建的,不能被覆盖,从而导致错误。1.您可能没有阅读正确的工作表转换为pdf
无论哪种方式,我相信你的代码炸弹时,试图写的pdf,因为命名的pdf在当时是一个打开文件。
您需要一个字符串作为文件名,因此尝试将
asksaveasfile
更改为asksaveasfilename
,这将不会创建文件并返回字符串。下面的代码示例修改您的代码;
1.将文件名请求更改为使用win32 com
GetSaveAsFilename
1.将
work_sheets
设置为命名工作表"Stan techniczny nawierzchni"
1.关闭win32客户端
1.删除临时xlsx文件(可选)
此代码示例成功地创建了pdf并删除了临时xlsx文件,没有留下僵尸Excel进程。
ecfsfe2w2#
问题是temp.xlsx没有关闭Excel。Excel仍然处于活动状态,并且有一个文件锁定。因此,当您尝试写入Excel时,该文件被锁定。
我不确定这个问题的解决方案,但是你可以尝试使用pandas,而不是保存到临时文件。