主頁 > 後端開發 > Python辦公自動化之Excel轉Word

Python辦公自動化之Excel轉Word

2021-03-02 06:21:31 後端開發

在日常作業中,Python在辦公自動化領域應用非常廣泛,如批量將多個Excel中的資料進行計算并生成圖表,批量將多個Excel按固定格式轉換成Word,或者定時生成檔案并發送郵件等場景,本文主要以一個簡單的小例子,簡述Python在Excel和Word方面進行相互轉換的相關知識點,謹供學習分享使用,如有不足之處,還請指正,

相關知識點

本文主要是將Excel檔案通過一定規則轉換成Word檔案,涉及知識點如下所示:

  • xlrd模塊:主要用于Excel檔案的讀取,相關內容如下:
    • xlrd.open_workbook(self.excel_file) 打開Excel檔案并回傳檔案物件,引數為Excel的完整路徑
    • book.sheet_by_name(self.sheet_name) 通過名稱獲取對應的sheet頁,并回傳sheet物件
    • sheet.nrows sheet頁的有效行數
    • sheet.ncols sheet頁的有效列數
    • sheet.row_values(0) 回傳Excel中對應sheet頁的第一行的值,以陣列回傳
    • sheet.cell_value(row, col) 回傳某一個單元格的值
  • python-docx模塊:主要操作Word檔案,如:表格,段落等相關,相關內容如下所示:
    • Document word的檔案物件,代表整個word檔案
    • doc.sections[0] 獲取章節
    • doc.add_section(start_type=WD_SECTION_START.CONTINUOUS) 添加連續章節
    • doc.add_heading(third, level=2) 增加標題,level表示級別,如二級標題,回傳標題物件
    • doc.add_paragraph(text='', style=None) 增加段落,回傳段落物件
    • doc.add_table(rows=4, cols=5) 增加表格,并回傳表格物件
    • doc_table.style = "Table Grid" 設定表格樣式
    • doc_table.rows[0].cells[1].merge(doc_table.rows[0].cells[4]) 合并單元格
    • doc_table.rows[3].cells 獲取表格某一行所有單元格,以陣列形式回傳
    • head_cells[0].width = Cm(1.9) 設定列寬,單位cm
    • doc_table.rows[i].cells[j].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER 表格內容垂直居中
    • doc_table.add_row() 新增行,并回傳行物件

插件安裝

插件可以在pycharm的terminal面板下進行安裝,python-docx安裝命令為:pip install python-docx

xlrd安裝命令為:pip install xlrd  如下所示:

資料源檔案

資料源是一系列格式相同的Excel檔案,共七列,其中第1列要按【/】進行截取拆分,格式如下:

 核心代碼

本文核心原始碼,主要分三部分:

匯入相關模塊包,如下所示:

1 import xlrd
2 from docx import Document
3 from docx.enum.section import WD_ORIENTATION
4 from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
5 from docx.shared import Pt, Cm, RGBColor
6 from docx.oxml.ns import qn
7 from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT
View Code

讀取Excel,如下所示:

 1     def read_excel(self):
 2         """讀取Excel"""
 3         book = xlrd.open_workbook(self.excel_file)
 4         sheet = book.sheet_by_name(self.sheet_name)
 5         nrows = sheet.nrows  # 行數
 6         ncols = sheet.ncols  # 列數
 7         datas = []  # 存放資料
 8         # 第一列 標題
 9         keys = sheet.row_values(0)
10         for row in range(1, nrows):
11             data = https://www.cnblogs.com/hsiang/archive/2021/03/01/{}  # 每一行資料
12             for col in range(0, ncols):
13                 value = https://www.cnblogs.com/hsiang/archive/2021/03/01/sheet.cell_value(row, col)  # 取出每一個單元格的資料
14                 # 替換到特殊字符
15                 value = https://www.cnblogs.com/hsiang/archive/2021/03/01/value.replace('<', '').replace('>', '').replace('$', '')
16                 data[keys[col]] = value
17                 # 截取第一列元素
18                 if col == 0:
19                     first = ''  # 截取元素 第1
20                     second = ''  # 截取元素 第2
21                     third = ''  # 截取元素 第3
22                     arrs = value.lstrip('/').split('/')  # 去掉第一個/ 然后再以/分組
23                     if len(arrs) > 0:
24                         if len(arrs) == 1:
25                             first = arrs[0]
26                             second = first
27                             third = second
28                         elif len(arrs) == 2:
29                             first = arrs[0]
30                             second = arrs[1]
31                             third = second
32                         elif len(arrs) == 3:
33                             first = arrs[0]
34                             second = arrs[1]
35                             third = arrs[2]
36                         else:
37                             first = arrs[0]
38                             second = arrs[1]
39                             third = arrs[2]
40                     else:
41                         first = value.ltrip('/')
42                         second = first
43                         third = second
44                     data['first'] = first
45                     data['second'] = second
46                     data['third'] = third
47                 # 截取第一列結束
48             datas.append(data)
49         return datas
View Code

生成Word部分:

  1     def write_word(self, datas):
  2         """生成word檔案"""
  3         if len(datas) < 1:
  4             print('Excel沒有內容')
  5             return
  6         # 定義word檔案物件
  7         doc = Document()
  8         # 添加橫向
  9         section = doc.sections[0]  # doc.add_section(start_type=WD_SECTION_START.CONTINUOUS)  # 添加橫向頁的連續節
 10         section.orientation = WD_ORIENTATION.LANDSCAPE
 11         page_h, page_w = section.page_width, section.page_height
 12         section.page_width = page_w  # 設定橫向紙的寬度
 13         section.page_height = page_h  # 設定橫向紙的高度
 14         # 設定字體
 15         doc.styles['Normal'].font.name = u'宋體'
 16         doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋體')
 17         # 獲取第3部分(部門) 并去重
 18         data_third = []
 19         for data in datas:
 20             third = data['third']
 21             if data_third.count(third) == 0:
 22                 data_third.append(third)
 23         for third in data_third:
 24             h2 = doc.add_heading(third, level=2)  # 寫入部門,二級標題
 25             run = h2.runs[0]  # 可以通過add_run來設定文字,也可以通過陣列來獲取
 26             run.font.color.rgb = RGBColor(0, 0, 0)
 27             run.font.name = u'宋體'
 28             doc.add_paragraph(text='', style=None)  # 增加空白行 換行
 29             # 開始獲取模板
 30             data_template = []
 31             for data in datas:
 32                 if data['third'] == third:
 33                     template = {'first': data['first'], '模板名稱': data['模板名稱']}
 34                     if data_template.count(template) == 0:
 35                         data_template.append(template)
 36             # 獲取模板完成
 37             # 遍歷模板
 38             for template in data_template:
 39                 h3 = doc.add_heading(template['模板名稱'], level=3)  # 插入模板名稱,三級標題
 40                 run = h3.runs[0]  # 可以通過add_run來設定文字,也可以通過陣列來獲取
 41                 run.font.color.rgb = RGBColor(0, 0, 0)
 42                 run.font.name = u'宋體'
 43                 doc.add_paragraph(text='', style=None)  # 換行
 44                 data_table = filter(
 45                     lambda data: data['third'] == third and data['模板名稱'] == template['模板名稱'] and data['first'] ==
 46                                  template['first'], datas)
 47                 data_table = list(data_table)
 48                 # 新增表格 4行5列
 49                 doc_table = doc.add_table(rows=4, cols=5)
 50                 doc_table.style = "Table Grid"
 51                 doc_table.style.font.size = Pt(9)
 52                 doc_table.style.font.name = '宋體'
 53 
 54                 # 合并單元格 賦值
 55                 doc_table.rows[0].cells[1].merge(doc_table.rows[0].cells[4])
 56                 doc_table.rows[1].cells[1].merge(doc_table.rows[1].cells[4])
 57                 doc_table.rows[2].cells[1].merge(doc_table.rows[2].cells[4])
 58                 doc_table.rows[0].cells[0].text = '流程名稱:'
 59                 doc_table.rows[0].cells[1].text = data_table[0]['模板名稱']
 60                 doc_table.rows[1].cells[0].text = '使用人:'
 61                 doc_table.rows[1].cells[1].text = data_table[0]['first']
 62                 doc_table.rows[2].cells[0].text = '流程說明:'
 63                 doc_table.rows[2].cells[1].text = data_table[0]['流程說明']
 64 
 65                 # 設定標題
 66                 head_cells = doc_table.rows[3].cells  # 前面還有三行,特殊處理
 67                 head_cells[0].text = '節點'
 68                 head_cells[1].text = '節點名'
 69                 head_cells[2].text = '處理人員'
 70                 head_cells[3].text = '處理方式'
 71                 head_cells[4].text = '跳轉資訊'
 72                 # 設定列寬
 73                 head_cells[0].width = Cm(1.9)
 74                 head_cells[1].width = Cm(4.83)
 75                 head_cells[2].width = Cm(8.25)
 76                 head_cells[3].width = Cm(2.54)
 77                 head_cells[4].width = Cm(5.64)
 78                 # 第1 列水平居中,并設定行高,所有單元格內容垂直居中
 79                 for i in range(0, 4):
 80                     # 水平居中
 81                     p = doc_table.rows[i].cells[0].paragraphs[0]
 82                     p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
 83                     doc_table.rows[i].height = Cm(0.6)  # 行高
 84                     # 垂直居中
 85                     for j in range(0, 5):
 86                         doc_table.rows[i].cells[j].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
 87 
 88                 # 生成表格并填充內容
 89                 row_num = 0
 90                 for data in data_table:
 91                     row = doc_table.add_row()
 92                     row_cells = row.cells
 93                     row_cells[0].text = str(row_num + 1) # 序號,需要轉換成字串
 94                     row_cells[1].text = data['節點名稱']
 95                     row_cells[2].text = data['審批人員']
 96                     row_cells[3].text = data['審批方式']
 97                     row_cells[4].text = ''
 98                     # 水平居中
 99                     p = row_cells[0].paragraphs[0]
100                     p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
101                     row.height = Cm(0.6)  # 行高
102                     # 垂直居中
103                     for j in range(0, 5):
104                         row_cells[j].vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER
105                     row_num = row_num + 1
106 
107                 doc.add_paragraph(text='', style=None)  # 換行
108         doc.save(self.word_file)
View Code

備注

子曰:“不患無位,患所以立,不患莫己知,求為可知也,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/265050.html

標籤:其他

上一篇:Java注解學習

下一篇:Java例外機制

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more