2015-12-15 6 views
0

У меня есть большое количество файлов .xlsx, загружаемых из внешней базы данных, с которой я хочу работать. Он имеет два листа, на первом рабочем листе есть только некоторые комментарии к данным, а во втором - данные.Ошибка при загрузке Excel несколькими листами

Я пробовал открыть таблицу Excel, используя следующие два варианта, но они оба дают мне ошибку. Ошибка исчезнет, ​​когда я удалю первый лист. Но поскольку у меня есть> 350 файлов, я не хочу удалять все эти рабочие листы вручную.

Код я попытался

from openpyxl import load_workbook 
    wb = load_workbook('/Users/user/Desktop/Data_14.xlsx') 

Что дает ошибку:

InvalidFileException: "There is no item named 'xl/styles.xml' in the archive" 

И:

from xlrd import open_workbook 
    book = open_workbook('/Users/user/Desktop/Data_14.xlsx') 

, который дает сообщение очень долго об ошибке (KeyError: 9)

Я думаю, что t он является ошибкой формулы на первом листе excel. Одна ячейка на рабочем листе говорит

- minimum percentage that must characterise the path from a subject Company up to its Ultimate owner: 50.01%      

но не отформатирован как текст. Выполнение ячейки дает сообщение об ошибке в Excel. Вставка «'», чтобы сделать текст, позволяет мне открыть файл с помощью python, который я хочу сделать.

Любые идеи о том, как я могу автоматически открыть файлы excel для решения этой проблемы?

ответ

0

Пробуйте эту надстройку для объединения всех 2-х листов.

http://www.rondebruin.nl/win/addins/rdbmerge.htm

Или запустить этот сценарий, чтобы удалить все первые листы во всех книгах. , ,

Sub Example() 
    Dim MyPath As String, FilesInPath As String 
    Dim MyFiles() As String, Fnum As Long 
    Dim mybook As Workbook 
    Dim CalcMode As Long 
    Dim sh As Worksheet 
    Dim ErrorYes As Boolean 

    Application.DisplayAlerts = False 
    'Fill in the path\folder where the files are 
    MyPath = "C:\Users\rshuell001\Desktop\excel\" 

    'Add a slash at the end if the user forget it 
    If Right(MyPath, 1) <> "\" Then 
     MyPath = MyPath & "\" 
    End If 

    'If there are no Excel files in the folder exit the sub 
    FilesInPath = Dir(MyPath & "*.xl*") 
    If FilesInPath = "" Then 
     MsgBox "No files found" 
     Exit Sub 
    End If 

    'Fill the array(myFiles)with the list of Excel files in the folder 
    Fnum = 0 
    Do While FilesInPath <> "" 
     Fnum = Fnum + 1 
     ReDim Preserve MyFiles(1 To Fnum) 
     MyFiles(Fnum) = FilesInPath 
     FilesInPath = Dir() 
    Loop 

    'Change ScreenUpdating, Calculation and EnableEvents 
    With Application 
     CalcMode = .Calculation 
     .Calculation = xlCalculationManual 
     .ScreenUpdating = False 
     .EnableEvents = False 
    End With 

    'Loop through all files in the array(myFiles) 
    If Fnum > 0 Then 
     For Fnum = LBound(MyFiles) To UBound(MyFiles) 
      Set mybook = Nothing 
      On Error Resume Next 
      Set mybook = Workbooks.Open(MyPath & MyFiles(Fnum)) 
      On Error GoTo 0 

      If Not mybook Is Nothing Then 


       'Change cell value(s) in one worksheet in mybook 
       On Error Resume Next 
       With mybook.Worksheets(1) 
        ActiveSheet.Delete 
       End With 


       If Err.Number > 0 Then 
        ErrorYes = True 
        Err.Clear 
        'Close mybook without saving 
        mybook.Close savechanges:=False 
       Else 
        'Save and close mybook 
        mybook.Close savechanges:=True 
       End If 
       On Error GoTo 0 
      Else 
       'Not possible to open the workbook 
       ErrorYes = True 
      End If 

     Next Fnum 
    End If 

    If ErrorYes = True Then 
     MsgBox "There are problems in one or more files, possible problem:" _ 
      & vbNewLine & "protected workbook/sheet or a sheet/range that not exist" 
    End If 

    'Restore ScreenUpdating, Calculation and EnableEvents 
    With Application 
     .ScreenUpdating = True 
     .EnableEvents = True 
     .Calculation = CalcMode 
    End With 
    Application.DisplayAlerts = True 
End Sub 
1

Решение:

Я назвал delsheet.py сценарий и поставил его в директории, содержащей также файлы Excel.

  • Я использую Python 3.4.3 и 2.3.0 Openpyxl, но это должно работать для Openpyxl 2.0+
  • Я на Mac OS X работает Йосемити.

  • Знание ваших версий и настроек было бы полезно, поскольку openpyxl может быть непостоянным с синтаксисом в зависимости от версии.

  • Имена рабочих листов, которые я просмотрел, или вы не указали, имеет ли первый рабочий лист в файлах Excel уникальные имена или все они одинаковые.
  • Если они все одинаковые, то это удобно, и если все первые листы называются «Sheet1», тогда этот скрипт будет работать так, как есть, и именно так вы сформулировали вопрос, так вот как я написал решение; если отличается, уточните пожалуйста. Благодарю.

  • Понимание сценария:

    1. Первый сценарий сохраняет путь к папке сценария, чтобы знать, в каком каталоге она вызывается из и поэтому находится.

    2. С этого места скрипт перечисляет файлы в той же директории с расширением файла .xlsx добавлением их в список «» spreadsheet_list

    3. Используя цикл и получить количество элементов в списке ' spreadsheet_list 'позволяет скрипту знать, как долго проходить через элементы в списке.

      • нагрузки петли в файле первенствовать из списка
      • удаляет «Лист1»
      • сохраняет таблицу с тем же исходным именем файла.

delsheet.py

#!/usr/bin/env python3 
# Using python 3.4.3 and openpyxl 2.3.0 
# Remove the first worksheet from a batch of excel sheets 

# Import Modules 
import sys, os, re 
from openpyxl import Workbook, load_workbook 

# Create List 
spreadsheet_list = [] 

# Script path to the directory it is located. 
pcwd=os.path.dirname(os.path.abspath(__file__)) 

# List files in directory by file extension 
# Specify directory 
items = os.listdir(pcwd) 

# Specify extension in "if" loop and append the files in the directory to the "spreadsheet_list" list. 
for names in items: 
    if names.endswith(".xlsx"): 
     spreadsheet_list.append(names) 

# Debugging purposes: print out the list of appended excel files in script directory 
# print(spreadsheet_list) 

# For loop, using the number of elements in the spreadsheet_list we can determine how long the loop should go 
for i in range(len(spreadsheet_list)): 
    # print(i) to see that i is = to the number of excel files located in the directory 
    # Load workbook into memory (Opening the Excel file automatically...) 
    wb = load_workbook(spreadsheet_list[int(i)]) 
    ## Store Sheet1 in the workbook as 'ws' 
    ws = wb['Sheet1'] 
    ## Remove the worksheet 'ws' 
    wb.remove_sheet(ws) 
    ## Save the edited excel sheets (with the original name) 
    wb.save(spreadsheet_list[int(i)])