Python自动化秘籍(三)绝不原创的飞龙

最简单的报告是生成一些文本并将其存储在文件中。

对于这个配方,我们将以文本格式生成简要报告。要存储的数据将在一个字典中。

>>>fromdatetimeimportdatetime>>>TEMPLATE='''Moviesreport-------------Date:{date}Moviesseeninthelast30days:{num_movies}Totalminutes:{total_minutes}'''>>>data={'date':datetime.utcnow(),'num_movies':3,'total_minutes':376,}>>>report=TEMPLATE.format(**data)>>>FILENAME_TMPL="{date}_report.txt">>>filename=FILENAME_TMPL.format(date=data['date'].strftime('%Y-%m-%d'))>>>filename2018-06-26_report.txt>>>withopen(filename,'w')asfile:...file.write(report)$cat2018-06-26_report.txtMoviesreport-------------Date:2018-06-2623:40:08.737671Moviesseeninthelast30days:3Totalminutes:376工作原理...如何操作...部分的第2步和第3步设置了一个简单的模板,并添加了包含报告中所有数据的字典。然后,在第4步,这两者被合并成一个特定的报告。

在第4步中,将字典与模板结合。请注意,字典中的键对应模板中的参数。诀窍是在format调用中使用双星号来解压字典,将每个键作为参数传递给format()。

在第5步中,生成的报告(一个字符串)存储在一个新创建的文件中,使用with上下文管理器。open()函数根据打开模式w创建一个新文件,并在块期间保持打开状态,该块将数据写入文件。退出块时,文件将被正确关闭。

打开模式确定如何打开文件,无论是读取还是写入,以及文件是文本还是二进制。w模式打开文件以进行写入,如果文件已存在,则覆盖它。小心不要错误删除现有文件!

第6步检查文件是否已使用正确的数据创建。

文件名使用今天的日期创建,以最小化覆盖值的可能性。日期的格式从年份开始,以天结束,已选择文件可以按正确顺序自然排序。

即使出现异常,with上下文管理器也会关闭文件。如果出现异常,它将引发IOError异常。

在写作中一些常见的异常可能是权限问题,硬盘已满,或路径问题(例如,尝试在不存在的目录中写入)。

请注意,文件可能在关闭或显式刷新之前未完全提交到磁盘。一般来说,处理文件时这不是问题,但如果尝试打开一个文件两次(一次用于读取,一次用于写入),则需要牢记这一点。

HTML是一种非常灵活的格式,可用于呈现丰富的报告。虽然可以将HTML模板视为纯文本创建,但也有工具可以让您更好地处理结构化文本。这也将模板与代码分离,将数据的生成与数据的表示分开。

此配方中使用的工具Jinja2读取包含模板的文件,并将上下文应用于它。上下文包含要显示的数据。

我们应该从安装模块开始:

$echo"jinja2==2.20">>requirements.txt$pipinstall-rrequirements.txtJinja2使用自己的语法,这是HTML和Python的混合体。它旨在HTML文档,因此可以轻松执行操作,例如正确转义特殊字符。

在GitHub存储库中,我们已经包含了一个名为jinja_template.html的模板文件。

如何做...部分中的步骤2和4非常简单:它们读取模板并保存生成的报告。

如步骤3和4所示,主要任务是创建一个包含要显示信息的上下文字典。然后模板呈现该信息,如步骤5所示。让我们来看看jinja_template.html:

MoviesReport

MoviesReport

Date{{date}}

Moviesseeninthelast30days:{{movies|length}}

    {%formovieinmovies%}
  1. {{movie}}
  2. {%endfor%}

Totalminutes:{{total_minutes}}

大部分是替换上下文值,如{{total_minutes}}在花括号之间定义。

注意标签{%for...%}/{%endfor%},它定义了一个循环。这允许基于Python的赋值生成多行或元素。

可以对变量应用过滤器进行修改。在这种情况下,将length过滤器应用于movies列表,以使用管道符号获得大小,如{{movies|length}}所示。

除了{%for%}标签之外,还有一个{%if%}标签,允许它有条件地显示:

请注意,您可以使用过滤器向模板添加大量处理和逻辑。虽然少量是可以的,但请尝试限制模板中的逻辑量。大部分用于显示数据的计算应该在之前完成,使上下文非常简单,并简化模板,从而允许进行更改。

处理HTML文件时,最好自动转义变量。这意味着具有特殊含义的字符,例如<字符,将被替换为等效的HTML代码,以便在HTML页面上正确显示。为此,使用autoescape参数创建模板。在这里检查差异:

>>>Template('{{variable}}',autoescape=False).render({'variable':'<'})'<'>>>Template('{{variable}}',autoescape=True).render({'variable':'<'})'<'可以对每个变量应用转义,使用e过滤器(表示转义),并使用safe过滤器取消应用(表示可以安全地渲染)。

Jinja2模板是可扩展的,这意味着可以创建一个base_template.html,然后扩展它,更改一些元素。还可以包含其他文件,对不同部分进行分区和分离。有关更多详细信息,请参阅完整文档。

Jinja2非常强大,可以让我们创建复杂的HTML模板,还可以在其他格式(如LaTeX或JavaScript)中使用,尽管这需要配置。我鼓励您阅读整个文档,并查看其所有功能!

Markdown是一种非常流行的标记语言,用于创建可以转换为样式化HTML的原始文本。这是一种良好的方式,可以以原始文本格式对文档进行结构化,同时能够在HTML中正确地对其进行样式设置。

在这个配方中,我们将看到如何使用Python将Markdown文档转换为样式化的HTML。

我们应该首先安装mistune模块,它将Markdown文档编译为HTML:

$echo"mistune==0.8.3">>requirements.txt$pipinstall-rrequirements.txt在GitHub存储库中,有一个名为markdown_template.md的模板文件,其中包含要生成的报告的模板。

如何做...部分的第2步和第3步准备模板和要显示的数据。在第4步中,产生了额外的信息——电影的数量,这是从movies元素派生出来的。然后,将movies元素从Python列表转换为有效的Markdown元素。注意新行和初始的*,它将被呈现为一个项目符号:

>>>'\n'.join('*{}'.format(movie)formovieincontext['pmovies'])'*Casablanca\n*TheSoundofMusic\n*Vertigo'在第5步中,模板以Markdown格式生成。这种原始形式非常易读,这是Markdown的优点:

MoviesReport=======Date:2018-06-2920:47:18.930655Moviesseeninthelast30days:3*Casablanca*TheSoundofMusic*VertigoTotalminutes:404然后,使用mistune,报告被转换为HTML并在第6步中存储在文件中。

学习Markdown非常有用,因为它被许多常见的网页支持,可以作为一种启用文本输入并能够呈现为样式化格式的方式。一些例子是GitHub,StackOverflow和大多数博客平台。

实际上,Markdown不止一种。这是因为官方定义有限或模糊,并且没有兴趣澄清或标准化它。这导致了几种略有不同的实现,如GitHubFlavouredMarkdown,MultiMarkdown和CommonMark。

MicrosoftOffice是最常见的软件之一,尤其是MSWord几乎成为了文档的事实标准。使用自动化脚本可以生成docx文档,这将有助于以一种易于阅读的格式分发报告。

在这个食谱中,我们将学习如何生成一个完整的Word文档。

我们将使用python-docx模块处理Word文档:

Word文档的基础是它被分成段落,每个段落又被分成运行。运行是一个段落的一部分,它共享相同的样式。

如何做...部分的第1步和第2步是导入和定义要存储在报告中的数据的准备工作。

在第3步中,创建了文档并添加了一个具有适当标题的标题。这会自动为文本设置样式。

在第5步和第6步中,我们看到了有关电影的信息。第一部分以与第4步类似的方式存储了电影的数量。之后,电影逐个添加到报告中,并设置为项目符号的样式。

如果需要在文档中引入额外的行以进行格式设置,请添加空段落。

由于MSWord格式的工作方式,很难确定将有多少页。您可能需要对大小进行一些测试,特别是如果您正在动态生成文本。

即使生成了docx文件,也不需要安装MSOffice。还有其他应用程序可以打开和处理这些文件,包括免费的替代品,如LibreOffice。

Word文档可能非常简单,但我们也可以添加样式以帮助正确理解显示的数据。Word具有一组预定义的样式,可用于变化文档并突出显示其中的重要部分。

默认情况下,每个运行都使用Normal样式创建。任何.bold、.italic或.underline的属性都可以更改为True,以设置运行是否应以适当的样式或组合显示。值为False将停用它,而None值将保留为默认值。

请注意,此协议中的正确单词是italic,而不是italics。将属性设置为italics不会产生任何效果,但也不会显示错误。

运行的.font属性显示在第5步中。这允许您手动设置特定的字体和大小。请注意,需要使用适当的Pt(点)对象来指定大小。

最后,第7步保存文件,使其存储在文件系统中。

另一个可用的选项是更改文本的颜色。注意,运行可以是先前生成的运行之一:

>>>fromdocx.sharedimportRGBColor>>>DARK_BLUE=RGBColor.from_string('1b3866')>>>run.font.color.rbg=DARK_BLUE颜色可以用字符串的常规十六进制格式描述。尝试定义要使用的所有颜色,以确保它们都是一致的,并且在报告中最多使用三种颜色,以免过多。

为了创建适当的专业报告,它们需要有适当的结构。MSWord文档没有“页面”的概念,因为它是按段落工作的,但我们可以引入分页和部分来正确地划分文档。

在本配方中,我们将看到如何创建结构化的Word文档。

我们将使用python-docx模块来处理Word文档:

检查新页面:

检查横向部分:

然后,返回到纵向方向:

在如何做...部分的第2步中创建文档后,我们为第一部分添加了一个段落。请注意,文档以一个部分开始。段落在段落中间引入了一个换行。

段落中的换行和新段落之间有一点差异,尽管对于大多数用途来说它们是相似的。尝试对它们进行实验。

第3步引入了分页符,但未更改部分。

第4步在新页面上创建一个新的部分。第5步还将页面方向更改为横向。在第6步,引入了一个新的部分,并且方向恢复为纵向。

请注意,当更改方向时,我们还需要交换宽度和高度。每个新部分都继承自上一个部分的属性,因此这种交换也需要在第6步中发生。

最后,在第6步保存文档。

一个部分规定了页面构成,包括页面的方向和大小。可以使用长度选项(如Inches或Cm)来更改页面的大小:

>>>fromdocx.sharedimportInches,Cm>>>section.page_height=Inches(10)>>>section.page_width=Cm(20)页面边距也可以用同样的方式定义:

>>>section.left_margin=Inches(1.5)>>>section.right_margin=Cm(2.81)>>>section.top_margin=Inches(1)>>>section.bottom_margin=Cm(2.54)还可以强制节在下一页开始,而不仅仅是在下一页开始,这在双面打印时看起来更好:

Word文档能够添加图像以显示图表或任何其他类型的额外信息。能够添加图像是创建丰富报告的好方法。

在这个配方中,我们将看到如何在Word文档中包含现有文件。

前几个步骤(如何做...部分的第1步到第3步)创建文档并添加一些文本。

第4步从文件中添加图像,第5步将其调整为可管理的大小。默认情况下,图像太大了。

调整图像大小时请注意图像的比例。请注意,您还可以使用其他度量单位,如Inch,也在shared中定义。

插入图像也会创建一个新段落,因此可以对段落进行样式设置,以使图像对齐或添加更多文本,例如参考或描述。通过document.paragraph属性在第6步获得段落。最后一个段落被获得并适当地样式化,使其居中。添加了一个新行和一个带有描述性文本的run。

第7步在图像后添加额外文本并保存文档。

图像的大小可以更改,但是如前所述,如果更改了图像的比例,需要计算图像的比例。如果通过近似值进行调整,调整大小可能不会完美,就像如何做...部分的第5步一样。

请注意,图像的比例不是完美的10:14。它应该是10:13.33。对于图像来说,这可能足够好,但对于更敏感于比例变化的数据,如图表,可能需要额外的注意。

为了获得适当的比例,将高度除以宽度,然后进行适当的缩放:

>>>image=document.add_picture('photo-dublin-a1.jpg')>>>image.height/image.width0.75>>>RELATION=image.height/image.width>>>image.width=Cm(12)>>>image.height=Cm(12*RELATION)如果需要将值转换为特定大小,可以使用cm、inches、mm或pt属性:

PDF文件是共享报告的常用方式。PDF文档的主要特点是它们确切地定义了文档的外观,并且在生成后是只读的,这使得它们非常容易共享。

在这个配方中,我们将看到如何使用Python编写一个简单的PDF报告。

我们将使用fpdf模块来创建PDF文档:

fpdf模块创建PDF文档并允许我们在其中写入。

由于PDF的特殊性,最好的思考方式是想象一个光标在文档中写字并移动到下一个位置,类似于打字机。

首先要做的操作是指定要使用的字体和大小,然后添加第一页。这是在步骤3中完成的。第一个字体是粗体(第二个参数为'B'),比文档的其余部分大,用作标题。颜色也使用.set_text_color设置为RGB组件。

文本也可以使用I斜体和U下划线。您可以将它们组合,因此BI将产生粗体和斜体的文本。

.cell调用创建具有指定文本的文本框。前面的几个参数是宽度和高度。宽度0使用整个空间直到右边距。高度5(mm)适用于大小12字体。对.ln的调用引入了一个新行。

要写多行段落,我们使用.multi_cell方法。它的参数与.cell相同。在步骤5和6中写入两个段落。请注意在报告的标题和正文之间的字体变化。.set_text_color使用单个参数调用以设置灰度颜色。在这种情况下,它是黑色。

对于长文本使用.cell会超出边距并超出页面。仅用于适合单行的文本。您可以使用.get_string_width找到字符串的大小。

在步骤7中将文档保存到磁盘。

如果multi_cell操作占据页面上的所有可用空间,则页面将自动添加。调用.add_page将移动到新页面。

字体Symbol和ZapfDingbats也可用,但用于符号。如果您需要一些额外的符号,这可能很有用,但在使用之前进行测试。其余默认字体应包括您对衬线、无衬线和等宽情况的需求。在PDF中,使用的字体将嵌入文档中,因此它们将正确显示。

保持整个文档中的高度一致,至少在相同大小的文本之间。定义一个您满意的常数,并在整个文本中使用它:

>>>BODY_TEXT_HEIGHT=5>>>document.multi_cell(0,BODY_TEXT_HEIGHT,text)默认情况下,文本将被调整对齐,但可以更改。使用J(调整对齐)、C(居中)、R(右对齐)或L(左对齐)的对齐参数。例如,这将产生左对齐的文本:

在创建PDF时,某些元素可以自动生成,以使您的元素看起来更好并具有更好的结构。在本教程中,我们将看到如何添加页眉和页脚,以及如何创建到其他元素的链接。

我们将使用fpdf模块创建PDF文档:

在结尾处检查目录:

让我们来看看脚本的每个元素。

StructuredPDF定义了一个从FPDF继承的类。这对于覆盖footer方法很有用,它在创建页面时每次创建一个页脚。它还有助于简化main中的代码。

main函数创建文档。它启动文档,并添加每个章节,收集它们的链接信息。最后,它调用toc方法使用链接信息生成目录。

要存储的文本是通过乘以LOREM_IPSUM文本生成的,这是一个占位符。

chapter方法首先打印标题部分,然后添加每个定义的段落。它收集章节开始的页码和title_text方法返回的链接以返回它们。

title_text方法以更大、更粗的文本编写文本。然后,它添加一行来分隔标题和章节的正文。它生成并设置一个指向以下行中当前页面的link对象:

link=self.add_link()self.set_link(link)此链接将用于目录,以添加指向本章的可点击元素。

footer方法会自动向每个页面添加页脚。它设置一个较小的字体,并添加当前页面的文本(通过page_no获得),并使用{nb},它将被替换为总页数。

在main中调用alias_nb_pages确保在生成文档时替换{nb}。

最后,在toc方法中生成目录。它写入标题,并添加所有已收集的引用链接作为链接、页码和章节名称,这是所有所需的信息。

注意使用randint为文档添加一些随机性。这个调用在Python的标准库中可用,返回一个在定义的最大值和最小值之间的数字。两者都包括在内。

get_full_line方法为目录生成适当大小的行。它需要一个开始(章节的名称)和结束(页码),并添加填充字符(点)的数量,直到行具有适当的宽度(120毫米)。

为了计算文本的大小,脚本调用get_string_width,它考虑了字体和大小。

调整一些元素可能需要一定程度的试错,例如,调整线的位置。稍微长一点或短一点的线可能是品味的问题。不要害怕尝试和检查,直到产生期望的效果。

在这个食谱中,我们将看到如何将两个PDF合并成一个。这将允许我们将报告合并成一个更大的报告。

我们将使用PyPDF2模块。Pillow和pdf2image也是脚本使用的依赖项:

>>>importPyPDF2>>>output_pdf=PyPDF2.PdfFileWriter()>>>file1=open('report.pdf','rb')>>>pdf1=PyPDF2.PdfFileReader(file1)>>>output_pdf.appendPagesFromReader(pdf1)>>>file2=open('report2.pdf','rb')>>>pdf2=PyPDF2.PdfFileReader(file2)>>>output_pdf.appendPagesFromReader(pdf2)>>>withopen('result.pdf','wb')asout_file:...output_pdf.write(out_file)>>>file1.close()>>>file2.close()工作原理...PyPDF2允许我们为每个输入文件创建一个阅读器,并将其所有页面添加到新创建的PDF写入器中。请注意,文件以二进制模式(rb)打开。

输入文件需要保持打开状态,直到保存结果。这是由于页面复制的方式。如果文件是打开的,则生成的文件可以存储为空文件。

PDF写入器最终保存到一个新文件中。请注意,文件需要以二进制模式(wb)打开以进行写入。

.appendPagesFromReader非常方便,可以添加所有页面,但也可以使用.addPage逐个添加页面。例如,要添加第三页,代码如下:

我们将使用pdf2image模块将PDF文档转换为PIL图像。Pillow是先决条件。我们还将使用PyPDF2:

$pythonwatermarking_pdf.pyreport.pdf-uautomate_user-oout.pdf-psecretpasswordCreatingawatermarkWatermarkingthedocumentEncryptingthedocument$工作原理...watermarking_pdf.py脚本首先使用argparse从命令行获取参数,然后将其传递给调用其他三个函数的main函数,create_watermark,apply_watermark和(如果使用密码)encrypt。

create_watermark生成带有水印的图像。它使用Pillow的Image类创建灰色图像(模式L)并绘制文本。然后,将此图像应用为新图像上的Alpha通道,使图像半透明,因此它将显示水印文本。

Alpha通道使白色(颜色0)完全透明,黑色(颜色255)完全不透明。在这种情况下,背景是白色,文本的颜色是55,使其半透明。

然后将图像旋转45度并裁剪以减少可能出现的透明背景。这将使图像居中并允许更好的定位。

在下一步中,apply_watermark使用pdf2image模块将PDF转换为PILImages序列。它计算应用水印的位置,然后粘贴水印。

图像需要通过其左上角定位。这位于文档的一半,减去水印的一半,高度和宽度都是如此。请注意,脚本假定文档的所有页面都是相等的。

最后,结果保存为PDF;请注意save_all参数,它允许我们保存多页PDF。

如果传递了密码,则调用encrypt函数。它使用PdfFileReader打开输出PDF,并使用PdfFileWriter创建一个新的中间PDF。将输出PDF的所有页面添加到新PDF中,对PDF进行加密,然后使用os.rename将中间PDF重命名为输出PDF。

作为水印的一部分,请注意页面是从文本转换为图像的。这增加了额外的保护,因为文本不会直接可提取,因为它存储为图像。在保护文件时,这是一个好主意,因为它将阻止直接复制/粘贴。

这不是一个巨大的安全措施,因为文本可能可以通过OCR工具提取。但是,它可以防止对文本的轻松提取。

PIL的默认字体可能有点粗糙。如果有TrueType或OpenType文件可用,可以通过调用以下内容添加并使用另一种字体:

在本章中,我们将涵盖以下食谱:

电子表格是计算机世界中最通用和无处不在的工具之一。它们直观的表格和单元格的方法被几乎每个使用计算机作为日常操作的人所使用。甚至有一个笑话说整个复杂的业务都是在一个电子表格中管理和描述的。它们是一种非常强大的工具。

这使得自动从电子表格中读取和写入变得非常强大。在本章中,我们将看到如何处理电子表格,主要是在最常见的格式Excel中。最后一个食谱将涵盖一个免费的替代方案,LibreOffice,特别是如何在其中使用Python作为脚本语言。

CSV文件是简单的电子表格,易于共享。它们基本上是一个文本文件,其中包含用逗号分隔的表格数据(因此称为逗号分隔值),以简单的表格格式。CSV文件可以使用Python的标准库创建,并且可以被大多数电子表格软件读取。

对于这个食谱,只需要Python的标准库。一切都已经准备就绪!

在如何做部分的步骤1和2中进行准备工作后,步骤3是执行工作的部分。

它以写(w)模式打开一个名为movies.csv的新文件。然后在csvfile中创建一个原始文件对象。所有这些都发生在with块中,因此在结束时关闭文件。

注意newline=''参数。这是为了让writer直接存储换行,并避免兼容性问题。

写入器使用.writerow逐行写入元素。第一个是HEADER,然后是每行数据。

所呈现的代码将数据存储在默认方言中。方言定义了每行数据之间的分隔符(逗号或其他字符),如何转义,换行等。如果需要调整方言,可以在writer调用中定义这些参数。请参见以下链接,了解可以定义的所有参数列表:

CSV文件在简单时更好。如果要存储的数据很复杂,也许最好的选择不是CSV文件。但是在处理表格数据时,CSV文件非常有用。它们几乎可以被所有程序理解,甚至在低级别处理它们也很容易。

完整的csv模块文档可以在这里找到:

鉴于CSV文件是简单的文本文件,更新其内容的最佳解决方案是读取它们,将它们更改为内部Python对象,然后以相同的格式写入结果。在这个食谱中,我们将看到如何做到这一点。

在这个配方中,我们将使用GitHub上的movies.csv文件。它包含以下数据:

注意星球大战的年份是错误的(应为1977年)。我们将在配方中更改它。

>>>importcsv>>>FILENAME='movies.csv'>>>withopen(FILENAME,newline='')asfile:...data=[rowforrowincsv.DictReader(file)]>>>data[OrderedDict([('Admissions','225.7'),('Name','GoneWiththeWind'),('Year','1939')]),OrderedDict([('Admissions','194.4'),('Name','StarWars'),('Year','1968')]),OrderedDict([('Admissions','161.0'),('Name','ET:TheExtra-Terrestrial'),('Year','1982')])]>>>data[1]['Year']'1968'>>>data[1]['Year']='1977'>>>HEADER=data[0].keys()>>>withopen(FILENAME,'w',newline='')asfile:...writer=csv.DictWriter(file,fieldnames=HEADER)...writer.writeheader()...writer.writerows(data)工作原理...在如何做...部分的第2步中导入csv模块后,我们从文件中提取所有数据。文件在with块中打开。DictReader方便地将其转换为字典列表,其中键是标题值。

然后可以操纵和更改方便格式化的数据。我们在第3步中将数据更改为适当的值。

在这个配方中,我们直接更改值,但在更一般的情况下可能需要搜索。

第4步将覆盖文件,并使用DictWriter存储数据。DictWriter要求我们通过fieldnames在列上定义字段。为了获得它,我们检索一行的键并将它们存储在HEADER中。

文件再次以w模式打开以覆盖它。DictWriter首先使用.writeheader存储标题,然后使用单个调用.writerows存储所有行。

也可以通过调用.writerow逐个添加行

关闭with块后,文件将被存储并可以进行检查。

CSV文件的方言通常是已知的,但也可能不是这种情况。在这种情况下,Sniffer类可以帮助。它分析文件的样本(或整个文件)并返回一个dialect对象,以允许以正确的方式进行读取:

>>>withopen(FILENAME,newline='')asfile:...dialect=csv.Sniffer().sniff(file.read())然后可以在打开文件时将方言传递给DictReader类。需要两次打开文件进行读取。

记得在DictWriter类上也使用方言以相同的格式保存文件。

csv模块的完整文档可以在这里找到:

MSOffice可以说是最常见的办公套件软件,使其格式几乎成为标准。在电子表格方面,Excel可能是最常用的格式,也是最容易交换的格式。

在这个配方中,我们将看到如何使用openpyxl模块从Python中以编程方式获取Excel电子表格中的信息。

我们将使用openpyxl模块。我们应该安装该模块,并将其添加到我们的requirements.txt文件中,如下所示:

$echo"openpyxl==2.5.4">>requirements.txt$pipinstall-rrequirements.txt在GitHub存储库中,有一个名为movies.xlsx的Excel电子表格,其中包含前十部电影的出席信息。文件可以在此处找到:

>>>importopenpyxl>>>xlsfile=openpyxl.load_workbook('movies.xlsx')>>>xlsfile.sheetnames['Sheet1']>>>sheet=xlsfile['Sheet1']>>>sheet['B4'].value161>>>sheet['D4'].value'StevenSpielberg'>>>sheet.max_row11>>>sheet.max_column4>>>sheet['A12'].value>>>sheet['E1'].value它是如何工作的...在第1步中导入模块后,如何做…部分的第2步将文件加载到Workbook对象的内存中。每个工作簿可以包含一个或多个包含单元格的工作表。

要确定可用的工作表,在第3步中,我们获取所有工作表(在此示例中只有一个),然后像字典一样访问工作表,以检索Worksheet对象。

然后,Worksheet可以通过它们的名称直接访问所有单元格,例如A4或C3。它们中的每一个都将返回一个Cell对象。.value属性存储单元格中的值。

在本章的其余配方中,我们将看到Cell对象的更多属性。继续阅读!

可以使用max_columns和max_rows获取存储数据的区域。这允许我们在数据的限制范围内进行搜索。

Excel将列定义为字母(A、B、C等),行定义为数字(1、2、3等)。记住始终先设置列,然后设置行(D1,而不是1D),否则将引发错误。

可以访问区域外的单元格,但不会返回数据。它们可以用于写入新信息。

也可以使用sheet.cell(column,row)检索单元格。这两个元素都从1开始。

从工作表中迭代数据区域内的所有单元格,例如:

>>>forrowinsheet:...forcellinrow:...#Dostuffwithcell这将返回一个包含所有单元格的列表的列表,逐行:A1、A2、A3...B1、B2、B3等。

您可以通过sheet.columns迭代来检索单元格的列:A1、B1、C1等,A2、B2、C2等。

在检索单元格时,可以使用.coordinate、.row和.column找到它们的位置:

>>>cell.coordinate'D4'>>>cell.column'D'>>>cell.row4完整的openpyxl文档可以在此处找到:

在这个配方中,我们将看到如何更新现有的Excel电子表格。这将包括更改单元格中的原始值,还将设置在打开电子表格时将被评估的公式。我们还将看到如何向单元格添加注释。

我们将使用模块openpyxl。我们应该安装该模块,并将其添加到我们的requirements.txt文件中,如下所示:

$echo"openpyxl==2.5.4">>requirements.txt$pipinstall-rrequirements.txt在GitHub存储库中,有一个名为movies.xlsx的Excel电子表格,其中包含前十部电影的观众人数信息。

文件可以在此处找到:

在如何做…部分,第1步中的导入和第2步中的读取电子表格,我们在第3步中选择要更改的单元格。

在第4步中进行值的更新。在单元格中添加注释,覆盖.coment属性并添加新的Comment。请注意,还需要添加进行注释的用户。

值也可以包括公式的描述。在第6步,我们向单元格B12添加一个新的公式。在第8步打开文件时,该值将被计算并显示。

公式的值不会在Python对象中计算。这意味着公式可能包含错误,或者通过错误显示意外结果。请务必仔细检查公式是否正确。

最后,在第9步,通过调用文件的.save方法将电子表格保存到磁盘。

生成的文件名可以与输入文件相同,以覆盖该文件。

可以通过外部访问文件来检查注释和值。

您可以将数据存储在多个值中,并且它将被转换为Excel的适当类型。例如,存储datetime将以适当的日期格式存储。对于float或其他数字格式也是如此。

如果需要推断类型,可以在加载文件时使用guess_type参数来启用此功能,例如:

>>>xlsfile=openpyxl.load_workbook('movies.xlsx',guess_types=True)>>>xlsfile['Sheet1']['A1'].value='37%'>>>xlsfile['Sheet1']['A1'].value0.37>>>xlsfile['Sheet1']['A1'].value='2.75'>>>xlsfile['Sheet1']['A1'].value2.75向自动生成的单元格添加注释可以帮助审查结果文件,清楚地说明它们是如何生成的。

虽然可以添加公式来自动生成Excel文件,但调试结果可能会很棘手。在生成结果时,通常最好在Python中进行计算并将结果存储为原始数据。

完整的openpyxl文档可以在这里找到:

在这个教程中,我们将演示如何从头开始创建一个新的Excel电子表格,并添加和处理多个工作表。

$echo"openpyxl==2.5.4">>requirements.txt$pipinstall-rrequirements.txt我们将在新文件中存储有关参与人数最多的电影的信息。数据从这里提取:

在如何做…部分,在第1步导入模块后,在第2步创建一个新的电子表格。这是一个只包含默认工作表的新电子表格。

要存储的数据在第3步中定义。请注意,它包含将放在两个工作表中的信息(两个工作表中都有名称,第一个工作表中有入场人数,第二个工作表中有导演的名称)。在这一步中,填充了第一个工作表。

请注意值是如何存储的。正确的单元格定义为列A或B和正确的行(行从1开始)。enumerate函数返回一个元组,第一个元素是索引,第二个元素是枚举参数(迭代器)。

之后,在第4步创建了新的工作表,使用名称Directors。.create_sheet返回新的工作表。

在第5步中存储了Directors工作表中的信息,并在第6步保存了文件。

可以通过.title属性更改现有工作表的名称:

>>>sheet=xlsfile['Sheet']>>>sheet.title='Admissions'>>>xlsfile.sheetnames['Admissions','Directors']要小心,因为无法访问xlsfile['Sheet']工作表。那个名称不存在!

活动工作表,文件打开时将显示的工作表,可以通过.active属性获得,并且可以使用._active_sheet_index进行更改。索引从第一个工作表开始为0:

>>xlsfile.active>>>xlsfile._active_sheet_index0>>>xlsfile._active_sheet_index=1>>>xlsfile.active工作表也可以使用.copy_worksheet进行复制。请注意,某些数据,例如图表,不会被复制。大多数重复的信息将是单元格数据:

new_copied_sheet=xlsfile.copy_worksheet(source_sheet)完整的openpyxl文档可以在这里找到:

电子表格包括许多处理数据的工具,包括以丰富多彩的图表呈现数据。让我们看看如何以编程方式将图表附加到Excel电子表格。

我们将使用openpyxl模块。我们应该安装该模块,将其添加到我们的requirements.txt文件中,如下所示:

$echo"openpyxl==2.5.4">>requirements.txt$pipinstall-rrequirements.txt我们将在新文件中存储有关观众人数最多的电影的信息。数据从这里提取:

在如何做...部分,在步骤1和2中准备数据后,数据已准备在范围A1:B4中。请注意,A1和B1都包含不应在图表中使用的标题。

在步骤3中,我们设置了新图表并包括基本数据,如标题和Y轴的单位。

标题更改为Millions;虽然更正确的方式应该是Admissions(millions),但这将与图表的完整标题重复。

步骤4通过Reference对象创建一个引用框,从第2行第1列到第4行第2列,这是我们的数据所在的区域,不包括标题。使用.add_data将数据添加到图表中。from_rows使每一行成为不同的数据系列。titles_from_data使第一列被视为系列的名称。

在步骤5中,将图表添加到单元格A6并保存到磁盘中。

可以创建各种不同的图表,包括柱状图、折线图、面积图(填充线和轴之间的区域的折线图)、饼图或散点图(其中一个值相对于另一个值绘制的XY图)。每种类型的图表都有一个等效的类,例如PieChart或LineChart。

同时,每个都可以具有不同的类型。例如,BarChart的默认类型是列,将柱形图垂直打印,但也可以选择不同的类型将其垂直打印:

>>>chart.type='bar'检查openpyxl文档以查看所有可用的组合。

可以使用set_categories来明确设置数据的x轴标签,而不是从数据中提取。例如,将步骤4与以下代码进行比较:

data=Reference(sheet,min_row=2,max_row=4,min_col=2,max_col=2)labels=Reference(sheet,min_row=2,max_row=4,min_col=1,max_col=1)chart.add_data(data,from_rows=False,titles_from_data=False)chart.set_categories(labels)可以使用描述区域的文本标签来代替Reference对象的范围:

chart.add_data('Sheet!B2:B4',from_rows=False,titles_from_data=False)chart.set_categories('Sheet!A2:A4')如果数据范围需要以编程方式创建,这种描述方式可能更难处理。

在电子表格中呈现信息不仅仅是将其组织到单元格中或以图表形式显示,还涉及更改格式以突出显示有关它的重要要点。在这个食谱中,我们将看到如何操纵单元格的格式以增强数据并以最佳方式呈现它。

$echo"openpyxl==2.5.4">>requirements.txt$pipinstall-rrequirements.txt我们将在新文件中存储有关出席人数最多的电影的信息。数据从这里提取:

在如何做...部分,第1步中我们导入openpyxl模块并创建一个新的Excel文件。在第2步中,我们向第一个工作表添加数据。第3步也是一个准备步骤,用于定义要使用的颜色。颜色以十六进制格式定义,这在网页设计世界中很常见。

在第4步中,我们准备格式以定义标题。标题将具有不同的字体(Tahoma)、更大的大小(14pt),并且将以蓝色背景上的白色显示。为此,我们准备了一个具有字体、大小和前景颜色的Font对象,以及具有背景颜色的PatternFill。

在创建header_font和header_fill后的循环将字体和填充应用到适当的单元格。

请注意,迭代范围始终返回行,然后是单元格,即使只涉及一行。

在第5步中,为行添加边框和交替背景。边框定义为蓝色顶部和底部,白色左侧和右侧。填充的创建方式与第4步类似,但是颜色是浅蓝色。背景只应用于偶数行。

请注意,单元格的顶部边框是上面一个单元格的底部,反之亦然。这意味着可能在循环中覆盖边框。

文件最终在第6步中保存。

要定义字体,还有其他可用的选项,如粗体、斜体、删除线或下划线。定义字体并重新分配它,如果需要更改任何元素。记得检查字体是否可用。

还有各种创建填充的方法。PatternFill接受几种模式,但最有用的是solid。GradientFill也可以用于应用双色渐变。

最好限制自己使用PatternFill进行实体填充。您可以调整颜色以最好地表示您想要的内容。记得包括style='solid',否则颜色可能不会出现。

也可以定义条件格式,但最好尝试在Python中定义条件,然后应用适当的格式。

可以正确设置数字格式,例如:

cell.style='Percent'这将显示值0.37为37%。

LibreOffice是一个免费的办公套件,是MSOffice和其他办公套件的替代品。它包括一个文本编辑器和一个名为Calc的电子表格程序。Calc可以理解常规的Excel格式,并且也可以通过其UNOAPI在内部进行完全脚本化。UNO接口允许以编程方式访问套件,并且可以用不同的语言(如Java)进行访问。

其中一种可用的语言是Python,这使得在套件格式中生成非常复杂的应用程序非常容易,因为这样可以使用完整的Python标准库。

使用完整的Python标准库可以访问诸如加密、打开外部文件(包括ZIP文件)或连接到远程数据库等元素。此外,利用Python语法,避免使用LibreOfficeBASIC。

在本配方中,我们将看到如何将外部Python文件作为宏添加到电子表格中,从而改变其内容。

下载并安装后,需要配置以允许执行宏:

步骤1中的主要工作在include_macro.py脚本中完成。它将文件复制到macro_file子目录中,以避免修改输入。

在内部,.ods文件是一个具有特定结构的ZIP文件。脚本利用ZIP文件Python模块,将脚本添加到内部的适当子目录中。它还修改manifest.xml文件,以便LibreOffice知道文件中有一个脚本。

在步骤3中执行的宏在libreoffice_script.py中定义,并包含一个函数:

defObtainAggregated(*args):"""PrintsthePythonversionintothecurrentdocument"""#getthedocfromthescriptingcontext#whichismadeavailabletoallscriptsdesktop=XSCRIPTCONTEXT.getDesktop()model=desktop.getCurrentComponent()#getthefirstsheetsheet=model.Sheets.getByIndex(0)#FindtheadmissionscolumnMAX_ELEMENT=20forcolumninrange(0,MAX_ELEMENT):cell=sheet.getCellByPosition(column,0)if'Admissions'incell.String:breakelse:raiseException('Admissionsnotfound')accumulator=0.0forrowinrange(1,MAX_ELEMENT):cell=sheet.getCellByPosition(column,row)value=cell.getValue()ifvalue:accumulator+=cell.getValue()else:breakcell=sheet.getCellByPosition(column,row)cell.setValue(accumulator)cell=sheet.getCellRangeByName("A15")cell.String='Total'returnNone变量XSCRIPTCONTEXT会自动创建并允许获取当前组件,然后获取第一个Sheet。之后,通过.getCellByPosition迭代表找到Admissions列,并通过.String属性获取字符串值。使用相同的方法,聚合列中的所有值,通过.getValue提取它们的数值。

当循环遍历列直到找到空单元格时,第二次执行时,它将聚合B12中的值,这是上一次执行中的聚合值。这是故意为了显示宏可以多次执行,产生不同的结果。

还可以通过.getCellRangeByName按其字符串位置引用单元格,将Total存储在单元格A15中。

Python解释器嵌入到LibreOffice中,这意味着如果LibreOffice发生变化,特定版本也会发生变化。在撰写本书时的最新版本的LibreOffice(6.0.5)中,包含的版本是Python3.5.1。

例如,可以创建复杂的图表,甚至是要求用户提供并处理响应的交互式对话框。在论坛和旧答案中有很多信息。基本代码大多数时候也可以适应Python。

LibreOffice是以前的项目OpenOffice的一个分支。UNO已经可用,这意味着在搜索互联网时会找到一些涉及OpenOffice的引用。

请记住,LibreOffice能够读取和写入Excel文件。一些功能可能不是100%兼容;例如,可能会出现格式问题。

出于同样的原因,完全可以使用本章其他食谱中描述的工具生成Excel格式的文件,并在LibreOffice中打开。这可能是一个不错的方法,因为openpyxl的文档更好。

调试有时也可能会很棘手。记住确保在用新代码重新打开文件之前,文件已完全关闭。

UNO还能够与LibreOffice套件的其他部分一起工作,比如创建文档。

THE END
1.食堂Excel表格模板食堂Excel表格模板下载熊猫办公网站共为您提供86个食堂设计素材以及精品食堂Excel表格模板下载,汇集全球精品流行的食堂Excel表格完整版模板,下载后直接替换文字图片即可使用,方便快捷的不二选择。https://www.tukuppt.com/excelmuban/shitang.html
2.一周工作日程安排模板专题模板一周工作日程安排模板图片素材下载我图网一周工作日程安排模板专题为您整理了362个原创高质量一周工作日程安排模板图片素材供您在线下载,PSD/JPG/PNG格式一周工作日程安排模板模板下载、高清一周工作日程安排模板图片大全等,下载图片素材就上我图网。https://so.ooopic.com/sousuo/57517462/
3.单位食谱安排表张老师是一名上班族,她每天忙碌,但她知道保持良好的身体状态对于工作非常重要。她开始使用一个适合她的年龄段和职业水平的单位食谱安排表,每周都会根据这个计划购买蔬果,并预先准备一些可以带到办公室的小零嘴。 李先生是一个爱运动的人,他经常参加马拉松比赛。他发现通过科学规划他的饮食能够帮助他恢复体力并提升表现。https://www.hgddesks.cn/mei-shi-gong-lve/554635.html
4.实小每周食谱第14周食谱(2024.12.02—2024.12.06)年级实小每周食谱 | 第14周食谱(2024.12.02—2024.12.06) 2024.12.02--2024.12.06 每 周 食 谱 第14周 菜品新鲜 种类齐全 营养均衡 精工细作 膳食平衡 科学配方 NO·1 星期一 早餐 祛湿粥 一、二、三年级:蛋挞+生肉包 四、五、六年级:咸水角+奶黄包https://chihe.sohu.com/a/831766089_121123984
5.个人饮食计划每周食谱表excel表格模板excel模板免费下载图精灵为您提供个人饮食计划每周食谱表excel表格模板免费下载,格式为xls,下载后直接使用,更多excel模板就在图精灵https://616pic.com/sucai/n14xbqxlv.html
6.个人饮食计划每周食谱表excel表格模板免费下载Excel表格办图网提供个人饮食计划每周食谱表excel表格模板模板供会员免费下载,作品格式为xlsx。更多精彩个人素材,尽在办图网。 标签:个人饮食计划每周食谱表excel表格模板 本网站所有作品均是用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系客服。 编号11119419 https://m.888ppt.com/excelbiaoge/64ed90c5437e754a11119419.html
7.孕妇每周营养食谱菜单Excel模板孕妇每周营养食谱菜单Excel模板的内容摘要:https://m.360docs.net/doc/c415198311.html
8.孕妇每周营养食谱菜单列表Excel表格哎呦喂0102孕妇每周营养食谱菜单列表Excel表格,哎呦喂0102,平面,其他平面,站酷网,中国设计师互动平台.孕妇每周营养食谱菜单列表Excel表格https://www.zcool.com.cn/work/ZNTQ2MDg0ODg=.html
9.个人饮食计划每周食谱表EXCEL表格个人日常健身计划表本作品内容为个人饮食计划每周食谱表下载,大小为10.85KB,作品为高清大图模板,格式为xlsx, 属于健身计划表模板,作品模板源文件下载后可用编辑替换,模板中如有人物画像仅供参考禁止商用。小Q办公网-提供简历,PPT,Word,Excel优质模板素材下载模版平台,拥有海量的工作总结、竞聘求职、年终颁奖、计划书等。 通过小Q办公网下载https://www.xqppt.cn/view/7297.html
10.图片表格图标excel模板千库网提供精品图片表格图标excel模板下载,涵盖各类高端大气逼格excel模板,致力于满足您不同场景的不同需求,下载图片表格图标excel模板就来千库网https://m.588ku.com/excel/120337157.html
11.菜单模板模板模板免费下载excel表格千图网Excel模板频道为您找到17个菜单模板模板模板、菜单模板模板excel表格供你在线下载使用,找人力资源表格、费用报表、图表模板等各类excel模板就来千图网。https://www.58pic.com/tupian-excel/102453520.html
12.一周营养食谱安排表图一周营养食谱安排表图范文模板一周营养食谱安排表图是用表格的形式合理安排一周需要吃的食物。一周营养食谱安排表图下载Excel模板免费下载由华军软件园为您提供,源文件为xlsx格式,下载源文件即可自行编辑修改内容样式,更多有关一周营养食谱安排表图下载模板免费下载请关注华军软件园。 一周营养食谱安排表图使用技巧 http://www.onlinedown.net/soft/10012656.htm
13.word菜单word菜单模板可编辑下载公司简介A纸图文Word模板 图文风企业文化手册封面word模板 免费 宣传推广表格设计简约风Word模板 简约风企业文化手册封面word模板 手绘风食堂一周菜谱word模板 红金风全民防疫倡议书党政风word模板 简约风商务企业通知word模板 插画风食堂每周食谱word模板 excel表格设计简约红色大气扁平化Word模板 https://www.chuangkit.com/polymer/1185.html
14.锻炼打卡表Excel模板大全精美锻炼打卡表表格模板下载办公资源网总共为您找到了41个锻炼打卡表Excel模板,这些模板都是精挑细选的与锻炼打卡表相关的Excel模板,办公资源网是一家专注于生产高质量锻炼打卡表Excel模板的网站,下载Excel模板就来办公资源网https://www.bangongziyuan.com/search/val-duanliandakabiao-type-2.html
15.每周食谱记录表Excel模板每周食谱记录表Excel模板由专业的PPT模板网站当图网提供,免费每周食谱记录表Excel模板下载,每周食谱记录表Excel模板免费下载,更多精美PPT模板,尽在当图网。https://www.99ppt.com/P_3685695.html
16.小学生一周食谱安排表表格excel格式下载小学生一周食谱安排表是用表格的形式安排小学生一周需要吃的食物。小学生一周食谱安排表下载excel模板免费下载由下载之家为您提供,源文件为xlsx格式,下载源文件即可自行编辑修改内容样式,更多有关小学生一周食谱安排表下载模板免费下载请关注下载之家。 小学生一周食谱安排表使用技巧 http://mip.downza.cn/soft/311613.html
17.学生每周食谱下载excel模板下载更新时间:2024-11-25 11:33:13 食谱每周学生 图片展示 风云办公提供学生每周食谱下载,格式为 xlsx,一共1页,作品中文字及图均可以修改和编辑,图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改。更多精彩教育培训Excel模板,尽在风云办公。 相关搜索 健康食谱 一周食谱http://www.shyinkou.com/excel/072d96a93e.html
18.电子表格程序Microsoft365详细了解电子表格 大数据帮助做出重大决策 了解如何利用收集到的大数据。 了解详细信息 实时协作技巧 了解远程办公员工如何像办公室员工一样高效工作。 了解详细信息 甘特图指南 了解项目可以如何利用甘特图。 了解详细信息 常见问题解答 | 关注Microsofthttps://www.microsoft.com/zh-cn/microsoft-365/excel/spreadsheets
19.excel表格素材excel表格高清图片素材下载摄图网汇聚excel表格图片大全:excel表格素材、excel表格高清图片、excel表格背景图片等。你可以找excel表格设计灵感、摄影创意,我们欢迎您下载excel表格vrf正版授权图片,商用无压力https://699pic.com/image/1440789.html
20.Excel数据表格的拆分和合并模板.doc文档介绍:Excel数据表格的拆分和合并Excel数据表格的拆分与合并一、数据的拆分与提取图1数据表(1)数据拆分操作由于数据量较大,所以要先通过列号将整列全部选中。按“数据→分列”命令,选择默认的“分隔符号”选项,单击“下一步”按钮。然后将中间“空格”的选项选中,会在下方看到分列的预览。再进入“下一步”(见https://m.taodocs.com/p-339083638.html
21.菜谱.excel表格数据,包含八大菜系,西餐,风味小吃,共16个菜系的餐饮业成本核算表格 浏览:27 餐饮业成本核算表格,日常记录餐饮业 月度收入支出费用报表EXCEL模板.xls 简洁菜谱查询工具(带两千多条数据) v1.0.rar 浏览:46 一款非常简洁实用的菜谱程序,包含两千多条菜谱数据,可随意进行修改、美化。 EveryCook:世界上最好的食谱数据库 https://download.csdn.net/download/qq_36604863/15564284
22.减肥计划表减肥计划表模板下载健身运动减肥计划表EXCEL模板 减肥减脂计划表 简约减肥饮食计划表 销售计划表 绿色简单减肥食谱计划表 减肥之个人饮食管理计划表 减肥之个人饮食管理计划表 蓝色简约减肥月度计划 蓝色简约2024年日历工作计划表 绿色简约2024年日历日程计划表 紫色时间轴工作计划表 https://www.51miz.com/so-biaoge/2028161.html
23.10个月宝宝辅食食谱一天安排表excel格式下载10个月宝宝辅食食谱一天安排表主要是对于10个月大的婴儿每日辅食的具体安排使用的表格。10个月宝宝辅食食谱一天安排表下载Excel模板免费下载由华军下载为您提供,源文件为xlsx格式,下载源文件即可自行编辑修改内容样式,更多有关10个月宝宝辅食食谱一天安排表下载模板免费下载请关注华军下载。 10个月宝宝辅食食谱一天安排表https://www.huajunxiazai.com/soft/315186.html
24.月嫂工作日志表格怎么写好了,以上就是小编今天为您介绍的主要内容了,主要包括月嫂的工作日志表格可以先模仿着网上发布的月嫂工作日志表格进行填写、月嫂的工作日志表格可以借用模板然后根据自己的实际情况填写、月嫂的工作日志表格可以用word或excel自己进行制作这三方面内容,希望可以帮助到您。如果您想要了解更多与月嫂工作日志表格相关的内容,欢迎https://www.daojia.com/zixun/649125859126465826/
25.7个月宝宝辅食食谱一天安排表官方电脑版7个月宝宝辅食食谱一天安排表主要是7个月宝宝日常辅食的具体安排表。7个月宝宝辅食食谱一天安排表下载Excel模板免费下载由51下载站为您提供,源文件为xlsx格式,下载源文件即可自行编辑修改内容样式,更多有关7个月宝宝辅食食谱一天安排表下载模板免费下载请关注51下载站。 https://www.51xiazai.cn/soft/10018126.htm
26.饮食记(饮食记录表格模板)V1.1安卓手机版饮食记(饮食记录表格模板)是由厦门晓屯网络技术有限公司开发的移动食谱软件,菜谱记录就在饮食记APP。该软件为用户提供非常丰富的美食内容,无论是国内还是国外的,每种美食都有详细的视频介绍,这是 美食爱好者必备的软件。 食物介绍互联网名人美食:新颖,独特的美食食谱教程 季节性饮食:选择四个季节的合理饮食食谱 名人https://m.greenxf.com/android/315725.html