python docx表格用法
- 格式:docx
- 大小:38.70 KB
- 文档页数:5
⽤python解析word⽂件(⼆):table太长了,我决定还是拆开三篇写。
(⼆)表格篇(table)(本篇)选你所需即可。
下⾯开始正⽂。
上⼀篇我们讲了⽤python-docx解析docx⽂件中的段落,也就是paragraph,不过细⼼的同学可能发现了,只有⾃然段是可以⽤paragraph处理的,如果word中有表格,根本读都读不到。
这是正常的,因为表格在docx中是另⼀个类。
⼀个word⽂档中⼤概有这么⼏种类型的内容:paragraph(段落),table(表格),character(我也不知道该怎么叫,字符?)。
我现在要解析的word⽂档中,基本都是段落和表格,所以character的具体内容我也没有特别关注。
本⽂主要来讲⼀下如何从word中解析出表格,并在html中展⽰出来。
⾸先,很简单,使⽤docx.tables可以获得⽂档中的全部表格。
跟excel中类似,word⽂档的表格也是分⾏(row)和列(column)的,读的⽅法是,对每⼀个table,先读出全部的rows,再对每⼀个row读出全部的column,这⾥的每⾏中的⼀列叫做⼀个单元格(cell),cell能做到的就跟⼀个paragraph类似了。
如果⽤不着那么⿇烦地获得表格的样式,就直接⽤cell.text获取单元格内容就好了。
那么,⼀个⼆重循环,就获取到了table中的全部⽂字内容。
但是这是不够的。
我的⽬的是要在html上展⽰出来。
所以,需要在这⼀堆内容上添加html标签。
具体的做法,我们来举个栗⼦吧。
不对,拿错了。
应该是这样:这是⼀个word中的table。
按照上⾯的⽅法,我们可以写代码如下:for t in docx.tables:# todo但其实对于word中的table,并没有这么简单。
有的时候,明明这⼀⾏只有⼀列,但是却读出多个值。
那么,对于相邻的相同内容,就需要做去重处理。
当然,这⾥的“去重”也不是list(set())这么简单的,因为⼀⾏中的所有列应当有顺序。
python-docx读取doc文件一、python-docx读取docx文件1. 安装python-docx包pip install python-docx2. python-docx读取docx文件使用python-docx需要导入docx包import docx2. 读取docx文件段落和表格内容import docximport os.pathdocxFile = 'text.docx'doc = docx.Document(docxFile)for para in doc.paragraphs:print(para.text)for table in doc.tables:for row in table.rows:for cell in row.cells:print(cell.text)二、使用office word将doc转换为docx1. 安装pypiwin32在windows操作系统上利用office word将doc文件转换为docx 文件需要用到win32com包使用win32com包需要安装pypiwin32包pip install pypiwin322. doc转docximport os.pathfrom win32com.client import Dispatch, DispatchEximport docxdocPath = 'text.doc'# wordApp = DispatchEx('Word.Application')wordApp = Dispatch('Word.Application')# 设置word不显示wordApp.Visible = 0wordApp.DisplayAlerts = 0docxPath = os.path.splitext(docPath)[0] + '.docx'doc = wordApp.Documents.Open(docPath)doc.SaveAs(docxPath, 12, False, '', True, '', False, False, False, False)doc.Close()wordApp.Quit()3. python-docx读取docx问题python-docx读取由office word转换doc得到的docx文件时,会导致部分内容得不到例如由office word转换doc得到的docx文件中包含如下一段文字使用python-docx读取的到的信息为日期:2012年,其中缺少了半段文字暂未不知其原因三、libreoffice将doc转docx1. libreoffice使用libreoffice将doc文件转换为docx文件使用如下代码libreoffice --handless --convert-to docx [file] [--outdir] [dirPath]其中docx指定转换后的文件类型file表示doc文件的路径(包含文件名)参数--outdir指定输出docx文件的路径(选填)dirPath表示输出文件路径例如libreoffice --handless --convert-to docx text.doc --outdir ./ libreoffice --handless --convert-to docx text.doc2. 问题使用libreoffice将doc转换为docx可以避免第二部分第三节中描述的问题。
⽤python来操作word⽂件(使⽤docx库)实例⼀:from docx import Documentfrom docx.enum.text import WD_ALIGN_PARAGRAPHfrom docx.oxml.ns import qn # 中⽂格式from docx.shared import Pt # 磅数from docx.shared import Inches # 图⽚尺⼨import timetoday = time.strftime("%Y{y}%m{m}%d{d}", time.localtime()).format(y="年", m="⽉", d="⽇")price = input("请输⼊今⽇价格:")company_list = ["客户1", "客户2", "客户3", "客户4", "客户5", "客户6", "客户7", "客户8", "客户9", "客户10"]for i in company_list:document = Document()document.styles["Normal"] = u"微软雅⿊"document.styles["Normal"].font.size = Pt(14)# 设置⽂档的基础字体document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅⿊')# 设置⽂档的基础样式document.add_picture("d:/⽆标题.png", width=Inches(6))# 在⽂件最上头插⼊图⽚作为⽂件红头,宽度为6英⼨p1 = document.add_paragraph()# 初始化建⽴第⼀个⾃然段p1.alignment = WD_ALIGN_PARAGRAPH.CENTER# 对齐⽅式为居中,没有这句默认左对齐run1 = p1.add_run("关于下达%s产品价格的通知" % (today))# 这⾥是第⼀段的内容 = "微软雅⿊"# 设置西⽂字体run1._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅⿊')# 设置中⽂字体run1.font.size = Pt(21)# 设置字体⼤⼩为21磅run1.font.bold = True# 设置加粗p1.space_after = Pt(5)# 设置段后距离5磅p1.space_before = Pt(5)# 设置段后距离5磅p2 = document.add_paragraph()run2 = p2.add_run(i + ": ")# 这⾥是对客户的称呼 = "仿宋_GB2312"run2._element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋_GB2312')run2.font.size = Pt(16)run2.font.bold = Truep3 = document.add_paragraph()run3 = p3.add_run(" 根据公司安排,为提供优质客户服务,我单位现将价格通知如下。
python docx 读取函数
Pythondocx读取函数是一种Python语言的函数,用于读取Microsoft Word文档的.docx文件格式。
该函数可以读取文档中的文本、图片、表格等内容,并以Python对象的形式返回。
使用Python docx 读取函数可以方便地对Word文档进行处理和分析。
例如,可以将文档中的内容提取出来,进行字符串处理、统计、分析等操作,或者将文档中的表格转化为数据框并进行数据分析。
Python docx 读取函数主要由Python-docx库提供,该库提供了一系列函数和类来读取、修改和创建.docx文件。
使用该库可以打开.docx文件,读取文件中的内容,并将其转化为Python对象,方便进行后续操作。
Python docx 读取函数通常使用以下步骤:
1. 导入Python-docx库
2. 打开.docx文件
3. 读取文件中的内容,并将其转化为Python对象
4. 对Python对象进行处理和分析
Python-docx库提供的主要读取函数包括:
1. Document:打开.docx文件,并读取其中的内容。
2. Paragraphs:读取文档中的段落,并将其转化为Python对象。
3. Tables:读取文档中的表格,并将其转化为Python对象。
4. Images:读取文档中的图片,并将其转化为Python对象。
通过以上函数,可以方便地读取文档中的内容,并进行后续处理
和分析。
在实际应用中,可以根据需要选择不同的读取函数来读取文档中的不同内容。
python操作word表格格式简介python-docx--设置表格进阶在上⾯的博客中,主要介绍了如何合并、拆分表格等,中间⽤到了⼀些表格的基本设置,⽐如,指定表格样式,内容居中等,在这篇博客中,详细介绍这⼀部分需求1. 表格样式修改2. 列宽⾼设置3. 属性设置(居中)4. 给每个单元格赋值5. 设置表格边框模板设置只需要在word中插⼊以下标签{{p mysubdoc}}实现⼀:表格样式修改1. 代码from docxtpl import DocxTemplatefrom docxtpl import Documentfrom docx.shared import Inchesimport reimport jsonimport collectionstpl = DocxTemplate('test.docx')sd = tpl.new_subdoc()sd.add_paragraph('Drug Table :')rows=3cols=4###创建表格的时候,指定style,这个style可以是docx的样式,例如'Table Grid'###style也可以是在word中⾃定义的表格样式table = sd.add_table(rows=rows, cols=cols ,style='outertable')#headercells = table.rows[0].cellscells[0].text='Gene'cells[1].text='Drug'cells[2].text='Rank'cells[3].text='Description'table.cell(1,0).text='ALK'table.cell(1,1).text='GENE1'table.cell(1,2).text='GENE2'table.cell(1,3).text='haha'## #https://python-docx.readthedocs.io/en/latest/api/table.html#docx.table.Table.style# #mergetable.cell(2,0).merge(table.cell(2,3)).text='One Drug'context = {'mysubdoc' : sd,}tpl.render(context)tpl.save('vertical_merge.docx')上⾯的add_table还可以写成下⾯的格式table = sd.add_table(rows=rows, cols=cols)table.style = 'outertable'2. 结果实现⼆:列宽⾼设置1. 代码若不特殊指定列宽,则每列会平均分配需要注意的是,Cm设置失败,不起作⽤,原因不明from docxtpl import DocxTemplatefrom docxtpl import Documentfrom docx.shared import Inchesimport reimport jsonimport collectionsfrom docx.shared import Cmfrom docx.oxml.shared import OxmlElement, qntpl = DocxTemplate('test.docx')sd = tpl.new_subdoc()sd.add_paragraph('Drug Table :')rows=3cols=4table = sd.add_table(rows=rows, cols=cols,style='outertable') width = OxmlElement('w:tblW')width.set(qn('w:type'), 'pct')width.set(qn('w:w'), '5000')table._tblPr.append(width)#headercells = table.rows[0].cellscells[0].text='Gene'cells[1].text='Drug'cells[2].text='Rank'cells[3].text='Description'table.cell(1,0).text='ALK'table.cell(1,1).text='GENE1'table.cell(1,2).text='GENE2'table.cell(1,3).text='haha'# #mergetable.cell(2,0).merge(table.cell(2,3)).text='One Drug'table.rows[0].height = Cm(2)col_width = [1,2,3,4]for col in range(4):table.cell(0,col).width = Inches(col_width[col])#需要注意的是,Cm设置失败,不起作⽤# table.cell(0,0).width = Cm(1)# table.cell(0,1).width = Cm(2)# table.cell(0,2).width = Cm(3)# table.cell(0,3).width = Cm(4)context = {'mysubdoc' : sd,}tpl.render(context)tpl.save('vertical_merge.docx')2. 结果实现三:属性设置1. 代码除了直接指定style之外,还可以对具体⼀个属性进⾏设置,⽐如常⽤的居中设置有表格的居中以及表格⽂本的居中表格的居中设置from docx.enum.table import WD_TABLE_ALIGNMENTtable = sd.add_table(rows=rows, cols=cols,style='outertable')table.alignment = WD_TABLE_ALIGNMENT.CENTER不过我们⼀般说的居中指的是表格⾥⽂本的居中⽔平居中直接设置整个表格居中 CENTER LEFT RIGHTtable.style.paragraph_format.alignment=WD_PARAGRAPH_ALIGNMENT.CENTER 或者也可以table.style.paragraph_format.alignment=WD_TABLE_ALIGNMENT.CENTERfrom docxtpl import DocxTemplatefrom docxtpl import Documentfrom docx.shared import Inchesimport reimport jsonimport collectionsfrom docx.shared import Cmfrom docx.oxml.shared import OxmlElement, qnfrom docx.enum.text import WD_PARAGRAPH_ALIGNMENTtpl = DocxTemplate('test.docx')sd = tpl.new_subdoc()sd.add_paragraph('Drug Table :')rows=3cols=4table = sd.add_table(rows=rows, cols=cols,style='outertable')width = OxmlElement('w:tblW')width.set(qn('w:type'), 'pct')width.set(qn('w:w'), '5000')table._tblPr.append(width)#headercells = table.rows[0].cellscells[0].text='Gene'cells[1].text='Drug'cells[2].text='Rank'cells[3].text='Description'table.cell(1,0).text='ALK'table.cell(1,1).text='GENE1'table.cell(1,2).text='GENE2'table.cell(1,3).text='haha'# #mergetable.cell(2,0).merge(table.cell(2,3)).text='One Drug'##设置标题⾏的⾼度table.rows[0].height = Cm(2)##设置每⼀列的宽度col_width = [1,2,3,4]for col in range(4):table.cell(0,col).width = Inches(col_width[col])#⽔平居中table.style.paragraph_format.alignment=WD_PARAGRAPH_ALIGNMENT.CENTER context = {'mysubdoc' : sd,}tpl.render(context)tpl.save('vertical_merge.docx')也可以挨个为每个cell,设置⽔平居中from docxtpl import DocxTemplatefrom docxtpl import Documentfrom docx.shared import Inchesimport reimport jsonimport collectionsfrom docx.shared import Cmfrom docx.oxml.shared import OxmlElement, qnfrom docx.enum.text import WD_ALIGN_PARAGRAPHtpl = DocxTemplate('test.docx')sd = tpl.new_subdoc()sd.add_paragraph('Drug Table :')rows=3cols=4table = sd.add_table(rows=rows, cols=cols,style='outertable')width = OxmlElement('w:tblW')width.set(qn('w:type'), 'pct')width.set(qn('w:w'), '5000')table._tblPr.append(width)#headercells = table.rows[0].cellscells[0].text='Gene'cells[1].text='Drug'cells[2].text='Rank'cells[3].text='Description'table.cell(1,0).text='ALK'table.cell(1,1).text='GENE1'table.cell(1,2).text='GENE2'table.cell(1,3).text='haha'# #mergetable.cell(2,0).merge(table.cell(2,3)).text='One Drug'##设置标题⾏的⾼度table.rows[0].height = Cm(2)##设置每⼀列的宽度col_width = [1,2,3,4]for col in range(4):table.cell(0,col).width = Inches(col_width[col])###为每⼀列设置居中for row in range(3):for col in range(4):cell = table.cell(row, col)pa = cell.paragraphs[0]pa.alignment = WD_ALIGN_PARAGRAPH.CENTER ##居中context = {'mysubdoc' : sd,}tpl.render(context)tpl.save('vertical_merge.docx')垂直居中⽬前我还不知道,如何给整个表格设置垂直居中垂直共有3种格式:CENTER TOP BOTTOMfrom docxtpl import DocxTemplatefrom docxtpl import Documentfrom docx.shared import Inchesimport reimport jsonimport collectionsfrom docx.shared import Cmfrom docx.oxml.shared import OxmlElement, qnfrom docx.enum.text import WD_PARAGRAPH_ALIGNMENT,WD_ALIGN_PARAGRAPH from docx.enum.table import WD_ALIGN_VERTICALtpl = DocxTemplate('test.docx')sd = tpl.new_subdoc()sd.add_paragraph('Drug Table :')rows=3cols=4table = sd.add_table(rows=rows, cols=cols,style='outertable')width = OxmlElement('w:tblW')width.set(qn('w:type'), 'pct')width.set(qn('w:w'), '5000')table._tblPr.append(width)#headercells = table.rows[0].cellscells[0].text='Gene'cells[1].text='Drug'cells[2].text='Rank'cells[3].text='Description'table.cell(1,0).text='ALK'table.cell(1,1).text='GENE1'table.cell(1,2).text='GENE2'table.cell(1,3).text='haha'# #mergetable.cell(2,0).merge(table.cell(2,3)).text='One Drug'##设置标题⾏的⾼度table.rows[0].height = Cm(2)##设置每⼀列的宽度col_width = [1,2,3,4]for col in range(4):table.cell(0,col).width = Inches(col_width[col])#⽔平居中#table.style.paragraph_format.alignment=WD_PARAGRAPH_ALIGNMENT.CENTER###为每⼀列设置居中for row in range(3):for col in range(4):cell = table.cell(row, col)pa = cell.paragraphs[0]pa.alignment = WD_ALIGN_PARAGRAPH.CENTER ##⽔平居中cell.vertical_alignment = WD_ALIGN_VERTICAL.CENTER ##垂直居中context = {'mysubdoc' : sd,}tpl.render(context)tpl.save('vertical_merge.docx')2. 结果⽔平居中的结果垂直居中的结果实现四:给每个单元格赋值1. 代码第⼀种如上⽅代码table.cell(1,0).text='ALK'第⼆种run是⽐paragraphs更⼩的单位cell = table.cell(i 1, col)pa = cell.paragraphs[0]pa.add_run('xxxxx')实现五:设置表格边框docx包⽐较贴近word底层结构,想要读明⽩需要花点功夫。
docx 处理库python-docx 的使⽤python-docx 的使⽤本⾝是⾮常简单的。
创建⽂档,添加标题,添加段落,添加表格,按照顺序就能够逐步完成的。
在实际使⽤过程中,主要是发现了两个问题。
1 创建⽂档创建⽂档是整个过程的开始部分。
这个地⽅很有意思的是,它的参数是⽂档模板,也就是说,默认情况下,python-docx 还是以创建⽂档为⽬的的。
能够看到,python-docx 本⾝是不带有打开⽂档的功能,但是在后⾯加上docx 模板之后,再使⽤合适的⽅法就能够认为是在读⽂档。
值得注意的是,这个地⽅新建的⽂档可以认为是放在内存中的,也就是说,在这个地⽅是可以不指定⽂件位置的,指定⽂档位置是在最后的保存⽂档这个步骤。
2 添加段落在使⽤个过程中,碰到了⼀个问题,⼀段⽂本中有\r 、\n 和\t 等特殊字符的时候,直接添加到⽂档中是识别的,也就是说会出现强制换⾏、⾃动换⾏和制表符这些转义的。
值得注意的是,出现了某个奇怪的符号,是⼀个向上的箭头,在程序中出现了ValueError: All strings must be XML compatible: Unicode or ASCII, no NULL bytes or control characters 这样的错误。
这种⽆显⽰的字符,直接过滤掉即可,具体的过滤⽅法如下所⽰:3 设置⽂字字体为宋体⽣成的⽂档字体是MS Mincho (中⽂正⽂),不是宋体,看着会很奇怪,使⽤下⾯代码可以设置字体为宋体。
4 总结docx 的使⽤本⾝是⼀个很简单的事情,但是实际在使⽤过程中,还是碰到了⼀些问题。
第⼀个问题,是⾃⼰没搞明⽩参数的函数,以为是要指定路径,结果浪费了⼀些时间;第⼆个问题,是数据库的数据本⾝存在瑕疵,我只要在程序中解决就好。
123from docx import Document document = Document(docx='')1document.save(path_or_stream)12remove_re = pile(u'[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]')etree_sub_el.text = remove_re.sub('', text)123456from docx.oxml.ns import qn run = p.add_run(graph[key]) = u "宋体"r = run._element r.rPr.rFonts.set (qn('w:eastAsia'), u "宋体")。
教你使⽤Python根据模板批量⽣成docx⽂档⽬录⼀、需求说明⼆、实验准备三、代码实现四、实验结果⼀、需求说明能够根据模板批量⽣成docx⽂档。
具体⽽⾔,读取excel中的数据,然后使⽤python批量⽣成docx⽂档。
⼆、实验准备准备excel数据:这⾥是关于学⽣语数英成绩的统计表,⽂件名为score.xls准备模板:这是给学⽣家长的成绩通知书,⽂件名为template.doc另外,在使⽤python进⾏实验之前,需要先安装第三⽅库docxtpl和xlrd,直接pip install就⾏:pip install docxtplpip install xlrd然后将xls和doc和python⽂件放在同⼀个⽬录下三、代码实现⾸先打开xls,读取数据:workbook = xlrd.open_workbook(sheet_path)然后从⽂件中获取第⼀个表格:sheet = workbook.sheet_by_index(0)然后遍历表格的每⼀⾏,将数据存⼊字典列表:tables = []for num in range(1, sheet.nrows):stu = {}stu['name'] = sheet.cell_value(num, 0)stu['class'] = sheet.cell_value(num, 1)stu['language'] = sheet.cell_value(num, 2)stu['math'] = sheet.cell_value(num, 3)stu['English'] = sheet.cell_value(num, 4)tables.append(stu)接下来将列表中的数据写⼊docx⽂档,其实这个过程可以在读数据时同时进⾏,即读完⼀⾏数据,然后⽣成⼀个⽂档。
⾸先在指定路径⽣成⼀个docx⽂档:document = Document(word_path)然后逐⾏进⾏正则表达式的替换:paragraphs = document.paragraphstext = re.sub('name', stu['name'], paragraphs[1].text)paragraphs[1].text = texttext = re.sub('name', stu['name'], paragraphs[2].text)text = re.sub('class', stu['class'], text)text = re.sub('language', str(stu['language']), text)text = re.sub('math', str(stu['math']), text)text = re.sub('English', str(stu['English']), text)paragraphs[2].text = text其实不关⼼格式问题的,到现在为⽌就已经结束了。
【最新整理,下载后即可编辑】Python对Excel操作详解文档摘要:本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd、xlwt和xlutils模块。
另外还演示了如何通过Tcl tcom 包对excel操作。
关键字:Python、Excel、xlrd、xlwt、xlutils、TCl、tcom1Python简介Python是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。
它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。
它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块。
与Scheme、Ruby、Perl、Tcl等动态语言一样,Python具备垃圾回收功能,能够自动管理存储器使用。
它经常被当作脚本语言用于处理系统管理任务和网络程序编写,然而它也非常适合完成各种高级任务。
Python虚拟机本身几乎可以在所有的作业系统中运行。
使用一些诸如py2exe、PyPy、PyInstaller之类的工具可以将Python源代码转换成可以脱离Python解释器运行的程序。
2Python安装Python目前的版本已经更新到3.4.0,本文使用的版本为2.7.5,所有的版本都可以在python官网/下载,至于2.x和3.x版本的具体区别也可以在官网查看。
从官网下载了python 2.7.5安装文件python-2.7.5.msi后,直接双击就可以安装python了,可以选择安装路径,我改为C:\Python2.7.5\了,然后一路next就完成安装了,安装完成后在C盘下就多了一个文件夹Python2.7.5。
Python也是一种实时交互语言,可以通过自带的IDLE编写python语句并反馈回显信息,可以通过图1方式调出python IDLE。
图1也可以在cmd下输入python,但默认情况下python并没有添加到windows环境变量中,导致在cmd下输入python的时候出现提示“'python' 不是内部或外部命令,也不是可运行的程序或批处理文件。
使用python-docx模块读写word文件word文档的自动化处理是一件比较头痛的事情,因为深耕于windows操作系统,对于跨平台需求的word文档编辑,是非常痛苦的一件事。
在python的生态环境中,提供了python-docx这个模块,可以方便的进行跨平台的word文档处理,但是只适合word 2007以后的文档,即后缀为docx的文档。
处理excel文件,需要先创建一个workbook,与之对应,处理word文档,首先需要创建Document对象,用法如下>>> from docx import Document>>> document = Document()Document用于表征一个具体的word文档,在此基础上,包含了常见的各种元素,常用的几个元素列表如下1.heading2.paragraph3.page break4.table5.picture1. headingheading表示标题,通过add_heading方法,可以添加标题,用法如下>>> document.add_heading('header')我们编辑word文档的时候,可以有多种不同等级的标题,在该模块中,通过level参数可以指定不同的等级,取值范围为0-9,用法如下>>> document.add_heading('header', level = 0)2. paragraphparagraph表示段落,通过add_paragraph方法添加段落,用法如下>>> document.add_paragraph("First paragraph")在段落的基础上,可以通过add_run来不断进行拼接,用法如下>>> document.add_paragraph("北京欢迎您").add_run("welcome to Beijing")add_run的用处在于针对部分文字,单独进行处理,比如设置其字体大小,颜色等,用法如下>>> paragraph = document.add_paragraph("First Paragraph")>>> text = paragraph.add_run('Bold Text')>>> text.bold = True3. page breakpage break表示分页,通过add_page_break方法进行添加,用法如下>>> document.add_page_break()4. tabletable表示表格,通过add_table函数进行添加,用法如下>>> table = document.add_table(rows=2, cols=2)创建表格之后,我们需要对单元格进行赋值,有以下两种方法# cell函数获取对应的单元格>>> cell = table.cell(0, 0)>>> cell.text = "cell">>> table.row[0].cells[0].text#通过rows和cells的结合获取对应的单元格>>> table.rows[0].cells[0].text'cell'对于一个table, 可以通过如下方式进行遍历>>> for row in table.rows:... for cell in row.cells:... print(cell.text)5, picturepicture表示图片,通过add_picture函数进行添加,用法如下>>> document.add_picture('imae.png')对于word文档而言,除了基本元素之外,还有一个重大元素就是样式。
基于python 的docx 模块处理word 和WPS 的docx 格式文件方式Python docx module for Word or WPS processing本文是通过docx 把word 中的表格中的某些已填好的内容提取出来,存入excel 表格。
首先安装docx 的python 模块:pip install python-docx由于处理的为中文和符号,改成utf-8编码格式1 2 3 4 5 import sysreload(sys)sys.setdefaultencoding('utf-8')from docx import Documentimport pandas as pd1 2 # 打开文件doc = Document(ur'test_1.docx')为了处理word 中以对勾形式勾选的项目,采用下面 的方法1、十字路口 √2、丁字路口3、环形路口4、人行立交1 2 3 4 5 # 取出对号勾选的项目print doc.tables[0].rows[3].cells[2].text print doc.tables[0].rows[3].cells[2].text.split(u'√')[1].strip().split(' ')[0][2:] '√' in doc.tables[0].rows[3].cells[2].text # 这个语句可以测试是否含有对勾,# 有的话就取出对勾后面的item ,否则直接返回填空的textTrue1 2 num_rows = len(doc.tables[0].rows)print num_rowsxls = pd.read_csv(ur'output.csv')1 2 print xls.columns[0]diction = {}1 2 3 4 5 6 7 # 找到每个excel 文档中需要被记录的键值在docx 文档表格中的位置 for xlskey in xls.columns:for row_id in range(num_rows):row = doc.tables[0].rows[row_id]for cell_id in range(len(row.cells)):if row.cells[cell_id].text.strip() == xlskey.strip(): diction[xlskey] = [row_id, cell_id]1 2 3 # 查看一下获得的键值位置for key in list(diction.keys()):print key, diction[key]楼层数 [21, 1]宗地形状 [4, 1]使用权取得时间 [14, 1]采光通风状况 [19, 1]已使用年限 [21, 4]建筑朝向 [7, 1]房屋结构 [17, 1]交叉路口形式 [3, 1]临街状况 [8, 1]建筑容积率 [10, 5]楼宇名称 [15, 5]质量等级 [18, 1]周围土地利用类型 [11, 1]总建筑面积 [20, 1]宗地位置 [0, 1]所临道路名称 [2, 1]装修标准 [16, 1]那么我们认为这些表头键值对应的填入数据就在他们的右边,也就是下一个cell ,因此我们只需要将row id 不变,cell +1,就能取出填表内容。
python读取word中指定位置的表格及表格数据1.Word⽂档如下:2.代码# -*- coding: UTF-8 -*-from docx import Documentdef readSpecTable(filename, specText):document = Document(filename)paragraphs = document.paragraphsallTables = document.tablesspecText = specText.encode('utf-8').decode('utf-8')for aPara in paragraphs:if aPara.text == specText:ele = aPara._p.getnext()while (ele.tag != '' and ele.tag[-3:] != 'tbl'):ele = ele.getnext()if ele.tag != '':for aTable in allTables:if aTable._tbl == ele:for i in range(len(aTable.rows)):for j in range(len(aTable.columns)):print(aTable.cell(i, j).text)if __name__ == '__main__':readSpecTable('test.docx', '符号约定')3.结果符号符号含义数据域取值符号M必须填写的域数据域取值符号C某条件成⽴时必须填写的域数据域取值符号O可选,⾮必须填写的域数据域取值符号←必须与先前报⽂中对应域的值相同的域数据域取值符号-必须去除的域数据域属性符号基本数据域数据域属性符号[]标识为消息组件名称数据域数据域属性符号{}标识为消息组件中重复的数据域数据域属性符号→标识为消息组件中包含的基础数据域数据域属性符号→[]标识为消息组件中的⼦消息组件数据域属性符号→{}标识为⼦消息组件中重复的数据域块数据域属性符号→→标识为⼦消息组件中包含的基础数据域PS:python读取word⽂档表格⾥的数据⾸先需要安装相应的⽀持库:直接在命令⾏执⾏pip install python-docx⽰例代码如下:import docxfrom docx import Document #导⼊库path = "E:\\python_data\\1234.docx" #⽂件路径document = Document(path) #读⼊⽂件tables = document.tables #获取⽂件中的表格集table = tables[0 ]#获取⽂件中的第⼀个表格for i in range(1,len(table.rows)):#从表格第⼆⾏开始循环读取表格数据result = table.cell(i,0).text + "" +table.cell(i,1).text+table.cell(i,2).text + table.cell(i,3).text#cell(i,0)表⽰第(i+1)⾏第1列数据,以此类推print(result)总结以上所述是⼩编给⼤家介绍的python读取word 中指定位置的表格及表格数据,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
首先想到 word 自身的替换功能,倒是能查到,但是没法动态替换,即只替换两边引号,而不换中间内容;另外一种方案是,即用 VBA,通过编程来替换,虽说做过几个项目,可好久不用,拾起费劲,再加上 VBA 中各种概念和用法,学习成本太高,放弃;还有一种方案,即用 Python 操作 word,首先对 Python 更熟悉,另外一定有别人造好的轮子。
果然,没用多久找到了 python-docxPython 库,文档齐全,功能强大,用来解决替换问题不在话下。
开始之前,先简单了解下 python-docxpython-docx 是用于创建可修改微软 Word 的一个 python 库,提供全套的 Word 操作,是最常用的 Word 工具概念使用前,先了解几个概念:•Document:是一个 Word 文档对象,不同于 VBA 中 Worksheet 的概念,Document 是独立的,打开不同的 Word 文档,就会有不同的 Document 对象,相互之间没有影响•Paragraph:是段落,一个 Word 文档由多个段落组成,当在文档中输入一个回车键,就会成为新的段落,输入 shift + 回车,不会分段•Run 表示一个节段,每个段落由多个节段组成,一个段落中具有相同样式的连续文本,组成一个节段,所以一个段落对象有个 Run 列表例如有一个 Word,内容是:word 文档内容则结构这样划分:第二个段落(paragraph),没有内容,所以节段(run)为空安装可以用 pip 来安装:命令行中运行下面语句,如果没有报错,则说明安装成功小试牛刀python-docx 安装后,测试一下:•定义一个新文档对象 document•想文档中插入一个段落(paragraph)•再在这个段落(paragraph)前插入另一个段落•最后调用文档对象 document 的 save 保存文档用 Word 打开保存的 test.docx 就可以看到:了解了 python-docx 的基本概念,开始着手解决问题,大体思路是:1.读取文档内容2.查找英文引号之间的内容3.将找到的内容的英文引号换成中文引号,并将内容替换回去4.完成处理后将文档另存查找目标首先要解决的是如何找到英文引号之间的内容?例如文档内容有这么一段:对于英文引号来说不区分前引号和后引号,怎么能保证配置到的不会是"和从"、"、"以及"以学习者为中心"和从"个性化学习"、"精准教学" 或者不会忽略两个引号出现在上下行的情况?重温正则表达式,终于得到如下表达式:•?::为了取消圆括号模式配置过程的缓存,即不需要遇到一个符合的就结束匹配•[^"]:表示匹配的内容不能是",以避免贪婪匹配,即避免匹配成从第一个" 开始一直到最后一个"结束•整体的意思是配置两个" 之间的内容,且内容中不包括"后来整理过程中,还发现另一种写法:不过. 不能匹配换行符\n,坚持要用,需要使用可选修饰符re.S:•引入正则表达式模块re•re.S 为可选标识修饰符,使 . 匹配包括换行在内的所有字符•利用findAll 查找所有匹配内容关于 Python 正在表达式的更多用法参考文后参考链接实现查找问题解决了,做替换就方便多了:•引入 Document 类,和正则表达式模块•打开目标文档,字符串前的r 表示取消字符串转义,即按原始字符产来解释•循环文档的段落(paragraph),对每个段落,用正则表达式进行匹配•循环对于匹配到的结果,将前后引号,换成中文引号,并替换段落(paragraph)的text;其中r[1:-1] 表示截取从第二个位置(第一个位置是 0)到倒数第二个位置截取字符串,刚好去掉前后引号•最后另存文档注意:python-docx 保存文档时不会给出任何提示,会瞬间完成,所以另存是个稳妥的做法在上面小试牛刀中,介绍了插入段落(paragraph)的用法,下面在介绍一些 python-docx 的其他功能为了简洁,下面例子中省略了 Document 类的引入和实例化代码,document 为 Document 的实例添加标题默认情况下添加的标题是最高一级的,即一级标题,通过参数level 设定,范围是 1 ~ 9,也有 0 级别,表示的是段落标题:添加换页如果一个段落不满一页,需要分页时,可以插入一个分页符,直接调用会将分页符插入到最后一个段落之后:表格操作Word 文档中经常会用到表格,python-docx 如何添加和操作表格呢?更复杂点的例子:添加图片添加图片,即,为 Word 里菜单中插入 > 图片插入的功能,插入图片为原始大小:插入时设置图片大小:除了厘米,python-docx 还提供了英寸(Inches),如设置 1英寸: Inches(1.0)样式样式可以针对整体文档(document)、段落(paragraph)、节段(run),月具体,样式优先级越高python-docx 样式功能配置多样,功能丰富,这里对段落样式和文字样式做简单介绍段落样式段落样式包括:对齐、列表样式、行间距、缩进、背景色等,可以在添加段落时设定,也可以在添加之后设置:文字样式在前面 python-docx 文档结构图可以看到,段落中,不同样式的内容,被划分成多个节段(Run),文字样式是通过节段(Run)来设置的设置加粗/斜体设置字体设置字体稍微复杂些,例如设置一段文字为宋体:。
文章标题:深度解析Python Docx中的表格用法
在Python的docx模块中,表格是一种常用的功能,它可以用来展示数据、排版文档,甚至制作简单的报表。
在本篇文章中,我们将深度
探讨Python Docx中的表格用法,包括创建、编辑、格式化及其在实际应用中的一些技巧和注意事项,希望能够帮助读者更好地理解和运
用这一功能。
一、Python Docx简介
在开始讨论表格用法之前,让我们先简要介绍一下Python Docx模块。
Python Docx是一个用于创建、修改和读取Microsoft Word文档的模块,它允许用户通过Python脚本轻松操作Word文档中的各种元素,包括段落、标题、图片和表格等。
利用Python Docx,用户可以
自动化地生成和处理Word文档,极大地提高了办公效率。
二、表格的基本创建与编辑
在Python Docx中,创建表格是非常简单的,只需要使用add_table()方法即可。
用户可以指定表格的行数、列数,甚至可以设置表格的样
式和边框等属性。
一旦表格创建完成,便可通过定位单元格来编辑、
填充数据,甚至进行合并、拆分操作。
我们还可以对表格中的文本样式、字体、颜色等进行调整,以满足不同的排版要求。
三、表格的格式化与排版
除了基本的创建与编辑外,表格的格式化与排版也是非常重要的部分。
在Python Docx中,用户可以自定义表格的样式、对齐方式、宽度和间距等属性,以便更好地适应文档的整体排版。
表格与文字、图片等
其他元素之间的协调性也需要被充分考虑,避免出现排版混乱、版面
杂乱的情况。
四、表格用法的一些技巧与注意事项
在实际应用中,表格用法也存在一些需要特别注意的地方。
在插入大
量数据的情况下,需要考虑表格的分页显示和跨页处理;在表格中使
用公式、信息等特殊元素时,需要确保其正确性和美观性;另外,在
处理复杂表格时,需要注意其结构和逻辑,避免出现不必要的错误和
混乱。
只有深入理解这些技巧和注意事项,才能更好地运用表格功能,提高文档的质量和效率。
五、个人观点与总结
Python Docx中的表格用法是一个非常灵活和实用的功能,它能够满
足用户在操作Word文档时对排版和数据展示的各种需求。
通过本文
的深度解析,相信读者能够更好地掌握表格的创建、编辑和格式化技巧,从而更加灵活地应用于实际场景中。
在未来的学习和工作中,建
议读者多多实践,不断积累经验,进一步提高自己在Python Docx表格用法上的技能和水平。
总结:通过本文的分析,我们深入探讨了Python Docx中的表格用法,
包括基本创建与编辑、格式化排版以及一些实际应用的技巧和注意事项。
通过本文的阐述,相信读者对于表格用法有了更深入的理解和掌握,希望能够对读者有所帮助。
接下来,我们将继续探讨Python Docx中表格用法的一些具体技巧和注意事项,以及在实际应用中的一些案例分析和解决方案。
希望这些
内容能够帮助读者更加全面地理解和运用Python Docx中的表格功能。
六、表格合并与拆分
在实际文档排版中,经常会遇到需要合并或拆分表格单元格的情况。
在Python Docx中,用户可以通过简单的操作实现对表格的合并或拆分。
如果需要合并某些单元格以进行跨列显示,可以使用cell.merge()方法来实现;如果需要拆分某个单元格成多个小单元格,可以使用cell.split()方法来实现。
这些操作能够帮助用户更好地控制表格的结构和排版,使得文档的展示效果更加符合实际需求。
七、跨页处理与自动分页
在处理大量数据的情况下,表格往往会出现跨页显示的情况。
对于这
种情况,Python Docx也提供了相应的解决方案。
用户可以通过设置
表格的行高和列宽来控制表格的显示范围,使得表格能够在页面上自
动分页并进行合理的展示。
用户还可以通过设置表格的标题行和重复
标题行等属性来确保表格在跨页显示时能够保持良好的可读性和连续性。
八、表格样式与自定义
除了基本的格式化之外,Python Docx还支持用户自定义表格的样式
和样式集。
用户可以通过设置表格的边框样式、背景色、文本对齐方
式等属性来创建符合自己需求的特定样式的表格。
用户还可以通过样
式集来简化表格样式的设置,从而更加高效地进行表格排版工作。
这
些功能能够帮助用户快速创建出符合需求的专业化和美观的表格,提
高文档的质量和视觉效果。
九、复杂表格的处理策略
在实际应用中,复杂的表格往往会涉及到多级标题、嵌套表格、单元
格合并等情况,这就需要用户对表格的结构和逻辑有更深入的理解和
处理能力。
为了更好地应对复杂表格,用户可以通过分析表格的结构
和特点,采取相应的处理策略。
比如采用逐行逐列的方式来填充数据,避免跨行跨列的数据冗余;通过合理设置表格的宽度和高度来控制整
体布局,避免表格排版混乱等。
也可以尝试使用循环和条件判断等编
程技巧,来简化对复杂表格的操作,提高操作效率。
十、实际案例分析与应用推演
为了更好地帮助读者理解和掌握表格用法,我们还可以通过一些实际
案例分析和应用推演来展示Python Docx中表格功能的实际应用。
在制作报表时,如何通过Python Docx来实现数据的自动填充和动态更新;在创建文档模板时,如何通过Python Docx来实现表格的模块化
设置和统一样式控制等,这些案例分析可以帮助读者更好地理解表格
用法的实际应用场景,为以后的工作和学习提供参考和借鉴。
十一、个人观点与总结
通过上述探讨和分析,我们对Python Docx中的表格用法有了更加深入和全面的了解。
表格是Word文档中一个非常重要的元素,它能够
帮助用户更好地展示数据、排版文档和制作报表。
通过学习和掌握Python Docx中表格功能的各项技巧和注意事项,相信读者能够更加
灵活地运用表格功能,提高文档的质量和效率。
在未来的学习和工作中,希望读者能够充分发挥Python Docx中表格功能的优势,不断提升自己的技能和水平。
也欢迎读者共享自己在表格用法方面的经验和
想法,共同促进Python Docx表格功能的学习和交流。
总结:通过对Python Docx中表格用法的深入探讨和分析,相信读者对表格的创建、编辑、格式化和实际应用有了更加全面和深入的理解。
希望本文的内容能够对读者有所帮助,也希望读者能够在以后的工作
和学习中不断积累经验,提高在Python Docx表格功能上的技能和水平。
也欢迎读者共享自己的观点和经验,共同推动Python Docx表格功能的进一步发展和完善。