Рубрики
Без рубрики

Манипулирование файлом Excel с Python

Это одна из тех вещей, которые звучат легко, но вряд ли. Есть много библиотек и решений … Помечено Python, Excel, Automation, Windows.

Это одна из тех вещей, которые звучат легко, но вряд ли. Существует много библиотек и решений, которые позволяют вам манипулировать файлами Excel через код. Некоторые из них дорого, другие – это открытый источник.

У многих языков есть библиотека, которая поможет вам манипулировать файлами Excel. Очевидный язык для выбора – C #. Он имеет много вариантов, какой-то открытый источник, некоторая оплата. Вместо того, чтобы использовать C #, я выбрал Python. В отличие от C #, Python очень легкий вес для начала и не нуждается в большом IDE, как Visual Studio для создания небольшого приложения.

В Python есть несколько вариантов использования. Пандас и xlsxwriter Может ли оба писать в файл Excel Но они оба имеют также свои ограничения. XLSXWriter может создать только новые файлы Excel, а Pandas не имеет функциональности экспортировать лист файла Excel в PDF. Так что я решил использовать Excel Com Object это корабли с Excel.

Это поставляется с некоторыми предварительными условиями, код будет работать только на Windows с установленным Excel. Есть пакет для использования COM объектов, называемых pywin32 Отказ Это немного запутано, на самом деле есть две пакеты, pywin32 и pypiwin32. . Но pypiwin32 заброшен pywin32 пакет – это путь к работе . Это установлено через Пип :

pip install pywin32

После установки пакета код довольно прост. Сначала давайте создадим приложение, это основной объект, который позволяет манипулировать файлом Excel.

from win32com import client

excelApp = client.Dispatch("Excel.Application")

Далее давайте загрузим файл Excel для манипулирования.

books = excelApp.Workbooks.Open(r"C:\\folder\\test.xlsx")

Теперь все на месте для чтения или записи в файл Excel, чтобы обнаружить возможности, вы всегда можете проверить COM объектная документация Отказ Давайте напишем значение файла Excel и сохранить его.

from win32com import client

excelApp = client.Dispatch("Excel.Application")
book = excelApp.Workbooks.open(r"C:\\folder\\test.xlsx")

workSheet = book.Worksheets('Sheet1')
workSheet.Cells(1, 1).Value = "test"

book.Save()
book.Close()

Этот код будет писать значение Тест к ячейке A1 в файле Excel. Обратите внимание, что Клетки имущество имеет 1 индекс на основе ряд, так и для столбца.

Там нет много библиотек, которые предвидеть в этой функциональности. Использование Python и Excel Com Object является одним из самых простых способов генерирования PDF из файла Excel. Я использовал это на больших файлах Excel и достигли очень хороших результатов с ним.

from win32com import client

excelApp = client.Dispatch("Excel.Application")
book = excelApp.Workbooks.open(r"C:\\folder\\test.xlsx")

sheet = book.Worksheets('Sheet1')
sheet.ExportAsFixedFormat(0, r"C:\\folder\\test.pdf")

book.Close()

ExportasfixedFormat это метод, который делает всю работу. Первый параметр – это тип формата и основан на Xlfixedformattype Enum Отказ PDF будет создан на месте назначения, который указан в качестве второго параметра.

Когда корпус на использование становится все более сложным, вы часто ударите на проблемы с производительностью. Вот несколько советов, которые могут вам помочь. Первый и наиболее очевидный совет состоит в том, чтобы избавиться от всех неиспользованных функций в вашем файле Excel, сделайте свой файл Excel максимально простым и убедитесь, что он не имеет неиспользуемых формул.

Отключить оповещения о дисплеях

Чтобы избежать заблокированного предыложения, который может быть показан пользователю, мы можем отключить оповещения о дисплеях. Если манипулирование Excel происходит на заднем плане, предупреждения в любом случае не будут видны.

import win32com.client

excelApp = win32com.client.Dispatch("Excel.Application")
excelApp.DisplayAlerts = false

Тип файла XLSB

Сохранение Excel в качестве двоичного типа XSLB вместо типа файла XLSX XML даст небольшой повышение производительности и сделает файл меньше.

Сжатие изображений

Чтобы сделать файл Excel как можно меньше, изображения, которые он содержит, может быть сжат. Перейти к Файл> Сохранить Как и откройте Компресс картинки Вариант через Инструменты Отказ Выбор более высокого сжатия приведет к меньшему файлу.

Чтение и запись значений с использованием диапазона

Вместо использования Клетки Свойство для записи значений один за другим, также можно написать целый диапазон в файл Excel. Это будет более исполнителю, чем использование Клетки Отказ Значение, которое установлено на диапазон, всегда является массивом массивов. Давайте начнем с простого случая

workSheet.Range('A1:A5').Value = [ [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ] ]

Это будет писать значения в диапазон A1: A5 Отказ

Для записи на несколько столбцов значение может быть добавлено в массивы для каждого столбца.

workSheet.Range('A1:C5').Value = [ [ 1, 10, 100 ], [ 2, 20, 200 ], [ 3, 30, 300 ], [ 4, 40, 400 ], [ 5, 50, 500 ] ]

Результат:

Отключить автоматический расчет

Если файл Excel вы используете, имеет много формул, это может значительно замедлить манипуляцию. Поскольку формулы должны быть пересчитаны каждый раз, когда значение изменяется значением в Excel. Этот автоматический пересчет может быть отключен. Это может быть удобно, если у вас есть много значений, чтобы заполнить, и если вы заинтересованы только в конечном итоге. Сначала вы отключите автоматический пересчет, вы заполняете все значения, а затем включить автоматическую пересчет. Таким образом, пересчет произойдет только один раз, даже если много ценностей заполнены.

Этот код установит расчет к руководству, возможные значения Расчет Собственность можно найти в Перечисление xlcalculation .

import win32com.client

excelApp = win32com.client.Dispatch("Excel.Application")
excelApp.Calculation = -4135

Чтобы восстановить расчет набор Расчет Свойство для автоматического:

excelApp.Calculation = -4105

Отключить обновление экрана

Отключение обновления экрана также может ускорить манипулирование Excel.

import win32com.client

excelApp = win32com.client.Dispatch("Excel.Application")
excelApp.ScreenUpdating = false

Эта ошибка иногда может появиться, она обычно происходит, когда Excel называется последовательным временем, и это недостаточно быстро, чтобы ответить на звонки. Тогда это вернет ошибку Звонок отклонен Callee . Решением является повторение вызова всякий раз, когда эта ошибка происходит, большая часть времени Excel завершится с текущим вызовом, и он сможет обрабатывать следующий.

Чтобы легко реализовать это, я использую Comwrapper класс, вдохновение, которое я получил для этого класса, исходит из нескольких Stackoverflow вопросы .

import time

from pywintypes import com_error

class ComWrapper:

    @staticmethod
    def wrap(func, *func_args, **kwargs):
        try:
            return func(*func_args, **kwargs)
        except com_error as e:

            if e.strerror == 'Call was rejected by callee.':
                print('com_error retrying ', e)
                time.sleep(0.5)
                self.wrap(func, *func_args, **kwargs)

            raise

Этот класс обернет существующий метод и когда Pywin com_Error С сообщением Звонок был отклонен Callee. Возникает, что он будет дождаться пол секунды и повторить ту же функцию с теми же аргументами.

Если мы хотим обернуть составить значение к ячейке, вот как это делается:

def writeValue(workSheet, rowNumber, columnNumber, value):
    workSheet.Cells(rowNumber, columnNumber).Value = value

ComWrapper.wrap(writeValue, workSheet, 1, 1, "test")

Сначала свойство установить определенное значение, завернуто в Написание изображений метод. Таким образом, метод может быть передан на Comwrapper Отказ Первый аргумент для класса обертки является сам метод. Обратите внимание, что мы не называем этот метод, мы передаем его к обертке, который назовет это. Затем все аргументы, которые обычно передаются на самому методу, также передаются на обертку. Обелочка будет повторить вызов метода до тех пор, пока Звонок был отклонен Callee. Ошибка брошена Excel.

Оригинал: “https://dev.to/petereysermans/manipulating-an-excel-file-with-python-1595”