В настоящее время я делаю некоторую автоматизацию Python для Excel с помощью com. Он полностью функционален и делает то, что я хочу, но я обнаружил нечто удивительное. Иногда некоторые из команд Excel, которые я использую, завершаются с ошибкой без видимой причины. В других случаях они будут работать.
В VB-эквивалентном коде того, что я делаю, эта проблема, по-видимому, считается нормальной и оштукатурена с помощью выражения On Error Resume Next
. Python, конечно, не сказал этого утверждения.
Я не могу обернуть весь набор в цикл try except
, потому что он мог «провалиться» на полпути и не завершиться должным образом. Итак, каков будет питонный способ заключить несколько независимых операторов в попытку, кроме блока? В частности, что-то чище, чем:
try:
statement
except:
pass
try:
statement
except:
pass
Соответствующим кодом является бит excel.Selection.Borders
.
def addGridlines(self, infile, outfile):
"""convert csv to excel, and add gridlines"""
# set constants for excel
xlDiagonalDown = 5
xlDiagonalUp = 6
xlNone = -4142
xlContinuous = 1
xlThin = 2
xlAutomatic = -4105
xlEdgeLeft = 7
xlEdgeTop = 8
xlEdgeBottom = 9
xlEdgeRight = 10
xlInsideVertical = 11
xlInsideHorizontal = 12
# open file
excel = win32com.client.Dispatch('Excel.Application')
workbook = excel.Workbooks.Open(infile)
worksheet = workbook.Worksheets(1)
# select all cells
worksheet.Range("A1").CurrentRegion.Select()
# add gridlines, sometimes some of these fail, so we have to wrap each in a try catch block
excel.Selection.Borders(xlDiagonalDown).LineStyle = xlNone
excel.Selection.Borders(xlDiagonalUp).LineStyle = xlNone
excel.Selection.Borders(xlDiagonalUp).LineStyle = xlNone
excel.Selection.Borders(xlEdgeLeft).LineStyle = xlContinuous
excel.Selection.Borders(xlEdgeLeft).Weight = xlThin
excel.Selection.Borders(xlEdgeLeft).ColorIndex = xlAutomatic
excel.Selection.Borders(xlEdgeTop).LineStyle = xlContinuous
excel.Selection.Borders(xlEdgeTop).Weight = xlThin
excel.Selection.Borders(xlEdgeTop).ColorIndex = xlAutomatic
excel.Selection.Borders(xlEdgeBottom).LineStyle = xlContinuous
excel.Selection.Borders(xlEdgeBottom).Weight = xlThin
excel.Selection.Borders(xlEdgeBottom).ColorIndex = xlAutomatic
excel.Selection.Borders(xlEdgeRight).LineStyle = xlContinuous
excel.Selection.Borders(xlEdgeRight).Weight = xlThin
excel.Selection.Borders(xlEdgeRight).ColorIndex = xlAutomatic
excel.Selection.Borders(xlInsideVertical).LineStyle = xlContinuous
excel.Selection.Borders(xlInsideVertical).Weight = xlThin
excel.Selection.Borders(xlInsideVertical).ColorIndex = xlAutomatic
excel.Selection.Borders(xlInsideHorizontal).LineStyle = xlContinuous
excel.Selection.Borders(xlInsideHorizontal).Weight = xlThin
excel.Selection.Borders(xlInsideHorizontal).ColorIndex = xlAutomatic
# refit data into columns
excel.Cells.Select()
excel.Cells.EntireColumn.AutoFit()
# save new file in excel format
workbook.SaveAs(outfile, FileFormat=1)
workbook.Close(False)
excel.Quit()
del excel
Обновление :
Возможно, потребуется немного пояснений к биту ошибки. Два идентичных запуска на моей тестовой машине с одинаковым кодом в одном и том же файле дают одинаковый результат. Один прогон создает исключения для каждой строки xlInsideVertical
. Другой бросает исключения для каждого xlInsideHorizontal
. Наконец, третий прогон завершается без каких-либо исключений.
Насколько я могу судить , Excel считает это нормальным поведением, потому что я клонирую код VB, созданный генератором макроса Excel, а не код VB, созданный человеком. Конечно, это может быть ошибочным предположением.
Он будет работать с каждой строкой, заключенной в блок try, за исключением того, что я просто хотел что-то более короткое и более очевидное, потому что 20 строк, обернутых в их собственные циклы try catch, просто позже вызывают проблемы.
Update2 :
Это очищенный CSV-файл для тестирования: gist-файл
Заключение :
Ответ, предоставленный Всехаром, идеален. Он абстрагирует от подавления исключений, так что позже, если и когда у меня будет время, я смогу справиться с исключениями по мере их возникновения. Он также позволяет регистрировать исключения, чтобы они не исчезали, не останавливая другие исключения , и достаточно мал, чтобы легко управлять через шесть месяцев.