- Русские Блоги
- Как Python управляет офисом для автоматизации? — приложение win32com.client
- Фон приложения
- примеров
- Перебор содержимого файла
- Мощный win32com.client
- Обратите внимание
- Интеллектуальная рекомендация
- Фабричный метод режим
- Эта функция указателя/постоянной, нормальный объект
- JavaScript садоводство
- Чтение заметок «Microsoft Sql server 2008 Internals» — глава 6 «Индексы и управление» (1)
- Python win32com word table
- Related articles
Русские Блоги
Как Python управляет офисом для автоматизации? — приложение win32com.client
Фон приложения
В работе, из-за необходимости регулярно отчитываться, нужен офис. В основном используется форма Excel, а затем отчеты по электронной почте отправляются каждой команде или руководителю. Здесь много повторяющейся работы. Часто существует фиксированный шаблон для отчета о работе, и каждый раз вам нужно только вручную импортировать соответствующие данные. Если эти повторяющиеся действия автоматизированы, вы, несомненно, можете сохранить Сделай много усилий. Поэтому я подумал об использовании Python для достижения автоматической генерации форм. Сегодняшнее введение — это только часть, в основном автоматическое изменение и генерация форм Excel.
Кажется, это очень простая задача. Вы можете вызывать часто используемые модули Python, связанные с Excel, xlrd, xlwd или openpyxl. Да, эти простые операции над таблицами Excel — 666, но в моей таблице есть сводная таблица. Это сделало меня очень болезненным, и внезапно обнаружил, что три вышеупомянутых модуля были не просты в использовании, и они использовались. Я также обнаружил, что openpyxl, похоже, не имеет функции для непосредственного удаления строк. Когда вы копируете предыдущую таблицу в качестве базовой таблицы, вы меняете некоторые После того, как содержимое было сохранено, сводная таблица исчезла, и мое сердце было очень разбито. Я видел много постов в Google и Baidu, и не было никакого хорошего пути. Наконец, я увидел пост в stackoverflow и использовал win32com.client. Сначала я этого не понимал, многие функции внутри не знали, откуда он взялся, и документации не было.
Наконец, я обнаружил, что 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 это будет более полным. Тем не менее, есть некоторые моменты, которые следует отметить во время использования:
- Как упоминалось ранее, вам нужно заключить в скобки функцию
- Хотя python не заботится о капитализации, вы должны обратить внимание на использование заглавных букв при использовании win32com.client. Многие функции не могут быть вызваны, если они не чувствительны к регистру. Например, функция Open для открытия таблицы excel должна иметь заглавные буквы «O» и wb. .Save (), ‘S’ также должны быть в верхнем регистре, и мы используем строчные для openpyxl.
- Openpyxl использует save () при сохранении. Многие исходные диаграммы формата не могут быть сохранены. Например, для изменения Excel исходная сводная таблица внутри не может быть сохранена с помощью openpyxl save (), но используется win32com.client Wb.Save () может сохранить эти диаграммы, что является более удобным местом.
- Что касается вызовов функциональных модулей 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