Python win32com word table

Русские Блоги

Как Python управляет офисом для автоматизации? — приложение win32com.client

Фон приложения

В работе, из-за необходимости регулярно отчитываться, нужен офис. В основном используется форма Excel, а затем отчеты по электронной почте отправляются каждой команде или руководителю. Здесь много повторяющейся работы. Часто существует фиксированный шаблон для отчета о работе, и каждый раз вам нужно только вручную импортировать соответствующие данные. Если эти повторяющиеся действия автоматизированы, вы, несомненно, можете сохранить Сделай много усилий. Поэтому я подумал об использовании Python для достижения автоматической генерации форм. Сегодняшнее введение — это только часть, в основном автоматическое изменение и генерация форм Excel.

Кажется, это очень простая задача. Вы можете вызывать часто используемые модули Python, связанные с Excel, xlrd, xlwd или openpyxl. Да, эти простые операции над таблицами Excel — 666, но в моей таблице есть сводная таблица. Это сделало меня очень болезненным, и внезапно обнаружил, что три вышеупомянутых модуля были не просты в использовании, и они использовались. Я также обнаружил, что openpyxl, похоже, не имеет функции для непосредственного удаления строк. Когда вы копируете предыдущую таблицу в качестве базовой таблицы, вы меняете некоторые После того, как содержимое было сохранено, сводная таблица исчезла, и мое сердце было очень разбито. Я видел много постов в Google и Baidu, и не было никакого хорошего пути. Наконец, я увидел пост в stackoverflow и использовал win32com.client. Сначала я этого не понимал, многие функции внутри не знали, откуда он взялся, и документации не было.

Читайте также:  Работа с фреймворками php

Наконец, я обнаружил, что win32com.client может напрямую вызывать библиотеку VBA, которая является очень мощной. VBA включает в себя функцию записи макросов. Вручную напрямую работает Excel для записи, вы можете найти соответствующую функцию и затем вызвать ее. Функции реализованы.

примеров

Сначала посмотрите на таблицу случаев:

Здесь представлена ​​только часть реализации функции, которая также является основной частью. Остальные операции с листовой страницей аналогичны. Здесь мы представим методы, используемые некоторыми модулями.

Первая таблица, которая в основном должна загружать требуемые Случаи из внутренней общей папки, является файлом типа документа, и их нужно записать в столбец AllCases в Таблице 1. Здесь относительно просто, нам нужно использовать только open и readlines (), это может быть записано в таблицу Excel путем обхода. Затем в таблице 2 обновите сводную таблицу. Ниже, я перехватываю часть кода, путь может сам вводить ввод, я буду представлять его в блоках.

class AutomationReport(object): def __init__(self, excel, win32c, folder_src, folder_dst, src, src_G, src_failed, src_flip, filepath): self.excel = excel self.win32c = win32c self.folder_src = folder_src self.folder_dst = folder_dst self.src = src self.src_G = src_G self.src_failed = src_failed self.src_flip = src_flip self.filepath = filepath def write_AllCases(self): # open one file and write it into excel AllCases sheet with open(self.src, 'r') as f: wb = self.excel.Workbooks.Open(self.filepath) sheet_AllCases = wb.Worksheets('AllCases') i = 2 for case in f.readlines(): cel = 'K%d' % i sheet_AllCases.Range(cel).Value = case.strip() i = i + 1 # open second file and write it into excel AllCases sheet with open(self.src_G, 'r') as fg: for case in fg.readlines(): cel = 'K%d' % i sheet_AllCases.Range(cel).Value = case.strip() i = i + 1 # copy format or delete redundant content cel = 'K%d' % i if sheet_AllCases.Range(cel).Value is None: rg = "A%s:J%s" % (i-1, i-1) selection = sheet_AllCases.Range("A29000:J29000").Select selection.AutoFill(Destination=sheet_AllCases.Range(rg), Type=xlFillDefault) else: # delete redundant content while sheet_AllCases.Range(cel).Value is not None: sheet_AllCases.Rows(i).Delete() wb.Save() if __name__ == "__main__": excel = win32com.client.Dispatch('Excel.Application') win32c = win32com.client.constants # input your path folder_src = . . # Excel table file path filepath = . # Object instance and invoke functions t = AutomationReport(excel, win32c, folder_src, folder_dst, src, src_G, src_failed, src_flip, filepath) t.copyFile() t.write_AllCases() t.write_ReportRaw()

Перебор содержимого файла

Пройдите по файлу и запишите случаи. Код выглядит следующим образом. Используйте модуль win32com.client (self.excel), чтобы открыть файл формы (self.filepath), который нам нужно изменить. Используйте wb.Worksheets («AllCases»), чтобы открыть страницу листа «AllCases». Примечание W of Worksheets — это прописные буквы. Не забудьте добавить s, прочитать каждую строку с помощью f.readlines () и записать каждую строку в таблицу с помощью for in. Здесь Range (‘A1’) представляет ячейку A1. Плюс. Значение это его стоимость.

with open(self.src, 'r') as f: wb = self.excel.Workbooks.Open(self.filepath) sheet_AllCases = wb.Worksheets('AllCases') i = 2 for case in f.readlines(): cel = 'K%d' % i sheet_AllCases.Range(cel).Value = case.strip() i = i + 1

Мощный win32com.client

Функциональный модуль VBA можно вызвать следующим образом: если вы хотите использовать слово, измените его на «Word.Applicaiton». Первый — включить Excel, а второй — вызвать некоторые специфичные для VBA переменные, например, вызвать свойство и добавить его непосредственно перед ним.

excel = win32com.client.Dispatch('Excel.Application') win32c = win32com.client.constants

Используя это, мы можем вызывать некоторые функциональные модули VBA, например функцию удаления строк.В openpyxl я не нашел функцию непосредственного удаления строк, а win32com может удалять строки следующими способами:

sheet_AllCases.Rows(i).Delete()

Здесь следует отметить, что Delete или многие функции в VBA вызываются без скобок, для их использования нам нужно добавить скобки в Python.

Ниже приведен формат для заполнения предыдущей строки, которая является нашей обычной выпадающей копией:

rg = "A%s:J%s" % (i-1, i-1) selection = sheet_AllCases.Range("A29000:J29000").Select selection.AutoFill(Destination=sheet_AllCases.Range(rg), Type=xlFillDefault)
 def write_ReportRaw(self): # open excel and active sheet wb = self.excel.Workbooks.Open(self.filepath) sheet_ReportRaw = wb.Worksheets('ReportRaw') # refresh Pivot table for All cases and Failed Cases sheet_ReportRaw.PivotTables("PivotTable3").PivotCache().Refresh() sheet_ReportRaw.PivotTables("PivotTable4").PivotCache().Refresh() wb.Save()

Эти функции, вам не нужно идти в Интернет, чтобы найти их, вы можете непосредственно открыть форму Excel, есть макрос под видом, используя макрос записи, а затем вручную обновить сводную таблицу, остановить запись, просмотреть макрос вы можете увидеть код для обновления сводной таблицы, вы можете Скопируйте его напрямую, измените соответствующие параметры и не забудьте добавить скобки.В приведенном выше примере PivotCache () нельзя использовать без скобок.

Другие функции могут быть вызваны в соответствии с вашими потребностями.

Обратите внимание

Использование win32com.client позволяет более плавно обрабатывать различные сложные ситуации Excel или Word. По сравнению с openpyxl, xlrd, xlwd это будет более полным. Тем не менее, есть некоторые моменты, которые следует отметить во время использования:

  1. Как упоминалось ранее, вам нужно заключить в скобки функцию
  2. Хотя python не заботится о капитализации, вы должны обратить внимание на использование заглавных букв при использовании win32com.client. Многие функции не могут быть вызваны, если они не чувствительны к регистру. Например, функция Open для открытия таблицы excel должна иметь заглавные буквы «O» и wb. .Save (), ‘S’ также должны быть в верхнем регистре, и мы используем строчные для openpyxl.
  3. Openpyxl использует save () при сохранении. Многие исходные диаграммы формата не могут быть сохранены. Например, для изменения Excel исходная сводная таблица внутри не может быть сохранена с помощью openpyxl save (), но используется win32com.client Wb.Save () может сохранить эти диаграммы, что является более удобным местом.
  4. Что касается вызовов функциональных модулей VBA, то их можно получить напрямую путем записи макросов без необходимости поиска документов, что также является более удобным и гибким местом.

Интеллектуальная рекомендация

Фабричный метод режим

Значимость режима фабрики метода заключается в определении заводского интерфейса, который создает объект продукта, и задержать фактическую работу создания на подкласс. Основная категория фабрики больш.

Эта функция указателя/постоянной, нормальный объект

Этот указатель представляет Переменные элемента объекта в классе и функции элемента хранятся отдельно. Sizeof (пустой класс) = 1. Кроме того, вопрос о выравнивании байта участвует в примере. INT также.

JavaScript садоводство

Тип преобразования JavaScript этоСлабый типЯзык, так будетЛюбыеГде возможноТип преобразования。 Советы ES5:С0Числовые литералы в начале будут интерпретироваться как восьмеричные цифры. В строгом режиме.

Чтение заметок «Microsoft Sql server 2008 Internals» — глава 6 «Индексы и управление» (1)

Директория индекса «Microsoft Sql server 2008 Internals»: «Microsoft Sql server 2008 Internals», читающий указатель к каталогу заметок В пятой главе я в основном изучал внутрен.

Источник

Python win32com word table

Download win32 module

Connect mysql

import mysqldb db_host="" db_port=3306 db_name="" db_user="" db_pwd="" db=mysqldb.connect (host=db_host, port=db_port, user=db_user, passwd=db_pwd, db=db_name, charset="utf8") cursor=db.cursor () 

Get all table structures

#Get all tables and notes in the table database def get_tables (cursor, db_name): sql="select table_name, table_comment from information_schema.tables where table_schema =" "+ db_name +" "" cursor.execute (sql) result=cursor.fetchall () tables=() for r in result: tables [r [0]]=r [1] return tables #Get table structure def get_table_desc (cursor, db_name, table_name): sql="select column_name, column_type, column_default, is_nullable, column_comment from information_schema.columns where table_schema =" "+ db_name +" "and table_name =" "+ table_name +" "" cursor.execute (sql) result=cursor.fetchall () return result 

win32com operation

from win32com.client import dispatch, constants word=dispatch ("word.application") word.visible=1 #Whether word is running in the background word.displayalerts=0 #Whether to display warning messages doc=word.documents.add () #Add a document r=doc.range (0,0) #Get a range r.style.font.name=u "verdana" #Set the font r.style.font.size="9" #Set the font size r.insertbefore ("\ n" + table description + "" + table name) #Insert text before this range table=r.tables.add (doc.range (r.end, r.end), number of fields + 1,5) #Build a table table.rows [0] .cells [0] .range.text=u "columns" table.rows [0] .cells [1] .range.text=u "type" table.rows [0] .cells [2] .range.text=u "default" table.rows [0] .cells [3] .range.text=u "is empty" table.rows [0] .cells [4] .range.text=u "Column Notes" 

Complete code

#coding:utf-8 #Export the table structure in the database to the table of word,Complete design document #Will not use word style with win32com import mysqldb, config from win32com.client import dispatch, constants db_name="crawlerdb_update" db=mysqldb.connect (host=config.db_host, port=config.db_port, user=config.db_user, passwd=config.db_pwd, db=db_name, charset="utf8") cursor=db.cursor () def get_tables (cursor, db_name): sql="select table_name, table_comment from information_schema.tables where table_schema =" "+ db_name +" "" cursor.execute (sql) result=cursor.fetchall () tables=() for r in result: tables [r [0]]=r [1] return tables def get_table_desc (cursor, db_name, table_name): sql="select column_name, column_type, column_default, is_nullable, column_comment from information_schema.columns where table_schema =" "+ db_name +" "and table_name =" "+ table_name +" "" cursor.execute (sql) result=cursor.fetchall () return result tables=get_tables (cursor, db_name) word=dispatch ("word.application") word.visible=1 word.displayalerts=0 doc=word.documents.add () r=doc.range (0,0) r.style.font.name=u "verdana" r.style.font.size="9" for k, table_name in enumerate (tables): tables_desc=get_table_desc (cursor, db_name, table_name) print r.start r.insertbefore ("\ n" + tables [table_name] + "" + table_name) table=r.tables.add (doc.range (r.end, r.end), len (tables_desc) + 1,5) table.rows [0] .cells [0] .range.text=u "columns" table.rows [0] .cells [1] .range.text=u "type" table.rows [0] .cells [2] .range.text=u "default" table.rows [0] .cells [3] .range.text=u "is empty" table.rows [0] .cells [4] .range.text=u "Column Notes" for i, column in enumerate (tables_desc): for j, col in enumerate (column): if col == none: col="(null)" table.rows [i + 1] .cells [j] .range.text=col r=doc.range (table.range.end, table.range.end) break 

Источник

Оцените статью