Word自动化(C# + Python)(持续更新中...)

简介: 目录前言读取Word内容NPOINPOI安装NPOI提取Word内容用Costura.Fody打包DLLpython-docx读取PDF内容python-docx自动生成Word全局字体内容字体单元格合并最后前言Word就是那种很难用, 很丑陋,...

目录

  • 前言
  • 读取Word内容
  • NPOI
  • NPOI安装
  • NPOI提取Word内容
  • 用Costura.Fody打包DLL
  • python-docx
  • 读取PDF内容
  • python-docx自动生成Word
  • 全局字体
  • 内容字体
  • 单元格合并
  • 最后

前言

Word就是那种很难用, 很丑陋, 但是你不得不用的东西, 在这一点上, 它甚至比Windows更甚(毕竟Gates是通过帮水果写Office才有机会接触Macintash和施乐的嘛, 你听过的, 两个小偷的故事). Windows可以用macOS + PlayStation进行1000%的替代, 没有多打0(手动滑稽). 但是Office不能够, 并不是没有比Office更好的东西, 这是一个历史残留问题, 就像牙膏厂CPU里面, 那些莫名其妙的字段一样.
总之, 这里通过使用一些库, Python的python-docx, C#的pdfbox和npoi, 来让对Word和PDF的处理变得更加自动化一些.
最后, 如果你想设计一些定制化的功能, 还是希望可以从官方文档进行学习, 而不是通过看博客. 尤其是当你只能够用某度, 而不是某歌, 那些前几页给出的搜索结果老旧又不顶用, 说真的, 用某度还不如在博客网站进行站内搜索, 不过我最近发现某日头条的全网搜索给出的结果还不错, 如果你不能某歌, 可以用下某日头条, 再不济用某应(Bing)也好过某度.


读取Word内容

好了, 不多说废话了. 直接看从Word获取内容. 这里可以用C#的NPOI和python-docx实现.


NPOI

NPOI安装

来看下维基的介绍. Apache POI是Apache软件基金会的开放源码库, POI提供API给Java程序对Microsoft Office格式文件读和写的功能. .NET的开发人员则可以利用NPOI(POI for .NET)来访问POI的功能.
其实, 最近这几年, 巨硬通过推出像.NET Core这样的跨平台应用程序开发框架, 已经让C#有了一点起死回生的迹象, 我不喜欢巨硬, 但我很推崇这种战略, 当然了, 甚至在硬件上推出了Duo这样的Surface安卓设备. 虽然之前写Unity游戏的时候用过一些C#, 但是这次是我第一次从软件开发的角度使用C#, 不得不说, NuGet令我印象深刻, 很好用.
这里假设你已经装了vs2019或者旧一点的版本, 但是注意, .NET Framework的程序依旧只能在Windows进行开发, 因为我暂时还没有摸像Mono这样的环境, 如果你感兴趣, 可以试下.

  • 新建.NET Framework控制台应用:

  • 然后你只需要在搜索框输入nuget, 点击管理NuGet程序包:

  • 之后搜索NPOI, 点击安装, 就可以了. 可能比起mac的brew install, linux的apt-get install和python的pip3 install多了两步, 但是我已经很满意了, 比什么找DLL, 拷贝DLL之类的, 要显得9102的多.

  • 安装之后, 在右侧的解决方案引用里面, 已经可以看到添加的库了:


NPOI提取Word内容

其实NPOI非常强大, 足以用来做和Word有关的一切了, 但是, 这里只演示一下提取Word中的内容, 因为后面有python-docx这样更加轻巧的库, 不需要vs不需要Windows, 你就可以处理docx类型的文件了.

源码如下:

using NPOI.XWPF.UserModel;
using System.IO;
using System.Text;

namespace getWord
{
    class Program
    {
        static void Main(string[] args)
        {
            string in_path = System.Console.ReadLine();
            string out_path = System.Console.ReadLine();
            Stream stream = File.OpenRead(in_path);
            XWPFDocument doc = new XWPFDocument(stream);

            string text = "";
            string tmp_text;
            foreach (var para in doc.Paragraphs)
            {
                tmp_text = para.ParagraphText;
                if (tmp_text.Trim() != "")
                    text += tmp_text + "\n";
            }

            StreamWriter swPdfChange = new StreamWriter(out_path, false, Encoding.GetEncoding("gb2312"));
            swPdfChange.Write(text);
            swPdfChange.Close();
        }
    }
}

我从控制台读取了输入输出路径, 然后循环读取Word内容写入缓存, 最后转码成gb2312到输出文件.
最终, 我还是希望你去NPOI官网看看.


用Costura.Fody打包DLL

如果你就这样直接生成Release版本, 你会被老板骂的狗血淋头, 太不专业了. 至少你应该把DLL打包进EXE或DLL.
你可以把DLL作为资源文件进行打包, 但是这样不优雅, 很土. 同样, 我们用9102年应该用的方法.
在NuGet搜索Costura.Fody, 安装即可. 这样的话, 编译成Release版本的时候, 直接就打包成一个EXE文件了.



python-docx

好了, 到了Python, 一切都舒服了, 忘记刚才为了写C#安装的好几个G甚至几十个G的vs吧, 毕竟Gates说过'640K is more memory than anyone will ever need.'(手动滑稽)
现在你只需要:

pip3 install python-docx

而且, 官方文档写得很不错, 并且我发现在作业部落(对, 就是我的macOS上有什么里面推荐的那个cmd markdown)的一篇python-docx中文, 几乎就是官方中文. 所以, 我基本就靠这两个外加谷歌, 完成了全部的内容学习, 当然, 你会发现, 难点还是在Table处理和样式修改那里.

import docx

doc = docx.Document('./t.docx')

doc_text = ''
doc_table_text = ''

for paragraph in doc.paragraphs:
    doc_text += paragraph.text + '\n'

for table in doc.tables:
    for row in table.rows:
        for cell in row.cells:
            doc_table_text += cell.text + '\n'

with open('./tt.txt', 'w') as f:
    f.write(doc_text)
    f.write(doc_table_text)

# doc.save ('./tt.docx')

代码其实很好懂, 关于python-docx的一些细节操作, 除了官方文档, 我在后面的自动化生成Word里面也会分享一些我的处理经验, 当然, 更多的是处理时候的坑(手动无奈).


读取PDF内容

同样, 这次用的是C#的库, 名为Pdfbox. 其实呢, 这个Pdfbox是个Java库. 是由Apache PDFBox团队为.NET生成的.

using org.apache.pdfbox.pdmodel;
using org.apache.pdfbox.util;
using System.IO;
using System.Text;

namespace getPDFCon
{
    class Program
    {
        static void Main(string[] args)
        {
            string in_path = System.Console.ReadLine();
            string out_path = System.Console.ReadLine();

            PDDocument doc = PDDocument.load(in_path);
            PDFTextStripper pdfStripper = new PDFTextStripper();
            string text = pdfStripper.getText(doc);
            // Console.WriteLine(Utf8ToGB2312(text));
            // Console.ReadKey();
            StreamWriter swPdfChange = new StreamWriter(out_path, false, Encoding.GetEncoding("gb2312"));
            swPdfChange.Write(text);
            swPdfChange.Close();
        }
    }
}

和之前读取Word几乎是一样的思路, 不多说了.


python-docx自动生成Word

这里我来细说一下, python-docx的一些操作. 从样式修改, 表格合并处理这些难点来谈. 后续也会逐步更新新遇到的坑.

全局字体

首先, 你可以设置全局字体.

doc.styles['Normal'].font.name = u'宋体'
doc.styles['Normal'].font.size = Pt (9)
doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')

注意, 如果是汉字, 第三行是必须要加的, 否则不生效. 第二行是设置字体大小, 你需要用from docx.shared import Pt进行导包. 当然, 你直接导入整个docx包就完事了.

内容字体

如果你想只修改某段内容的字体, 不影响全局, 之前的方案就不行.

p = doc.add_paragraph ()
font = p.add_run ('标题').font
font.bold = True
font.size = Pt (14)
p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER

这里看到一个p.add_run, 这是给当前Paragraph实例添加的Run实例, 也就是运行时候的一些设置, 只对当前Paragraph实例生效. 来看下和直接设置Paragraph实例属性的比较.

doc = Document ()

p = doc.add_paragraph ()
font = p.add_run ('标题1').font
font.bold = True
font.size = Pt (14)
p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER

p2 = doc.add_paragraph ()
p2.text = ('标题2')
p2.style.font.size = Pt (20)

p3 = doc.add_paragraph ()
p3.text = ('标题3')
p3.style.font.size = Pt (40)

doc.save ('a.docx')

这段代码在想象中应该是段落内容越来越大, 对吧, 但是很遗憾, 对于标题3的字体设置会覆盖标题2的字体设置, 但是通过run对象进行设置的标题1就不会受到影响, 来看图说话:

这样一来, 想要很好处理某段内容的风格, 就必须使用run. 否则就会关联其他. 修改下代码, 都设置成add_run, 看看是否如此:

很好, 这才是想要的效果. 同理, 在表格内容里面也是如此, 不多赘述.

但是还有一点要注意, 比如你已经通过, p.text进行文字赋值, 但是, 你又用, p.add_run ('标题').font进行设置, 那么你会得到两份内容. 所以, 这里要特别注意, 如果通过样式填充, 就不用再用text字段进行赋值.


单元格合并

比如我现在建立一张表, 尝试合并. 然后你会发现, 合并之后, 把两份内容都保留了, 如果这是你需要的, 自然没有问题. 但是如果不是, 你就要思考内容合并的策略, 你不可能一个一个设置. 一个比较合理的策略就是用临时变量保留你要的内容, 合并完成之后, 将临时变量内容覆盖合并后的内容.


最后

其实, 不论是NPOI还是python-docx, 已经是非常不错的库了, 都可以很好地帮助开发者进行自动化word的生成. 如果你不这么觉得, 我举个反例. Microsoft.Office.Interop.Word是巨硬提供的com组件, 那么要如何使用它呢, 你要先装Windows, 再装Office, Office2013对应这个com组件的15.x版本, Office2007对应组件的12.x. 然后你写完代码, 每次运行还需要启动Word, 可以后台启动, 但终归是启动了, 所以效率非常低.
当然, 本章内容还会在后续使用当中持续更新, 直到我觉得没有必要更新了. 喜欢可以点个赞, 有意见或者建议, 评论区见哦~


目录
相关文章
|
18天前
|
搜索推荐 Python
使用Python自动化生成物业通知单
本文介绍如何使用Python结合Pandas和python-docx库自动化生成物业通知单。通过读取Excel数据并填充至Word模板,实现高效准确的通知单批量制作。包括环境准备、代码解析及效果展示,适用于物业管理场景。
55 14
|
21天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
1月前
|
数据采集 监控 数据挖掘
Python自动化脚本:高效办公新助手###
本文将带你走进Python自动化脚本的奇妙世界,探索其在提升办公效率中的强大潜力。随着信息技术的飞速发展,重复性工作逐渐被自动化工具取代。Python作为一门简洁而强大的编程语言,凭借其丰富的库支持和易学易用的特点,成为编写自动化脚本的首选。无论是数据处理、文件管理还是网页爬虫,Python都能游刃有余地完成任务,极大地减轻了人工操作的负担。接下来,让我们一起领略Python自动化脚本的魅力,开启高效办公的新篇章。 ###
|
8天前
|
JSON 数据可视化 测试技术
python+requests接口自动化框架的实现
通过以上步骤,我们构建了一个基本的Python+Requests接口自动化测试框架。这个框架具有良好的扩展性,可以根据实际需求进行功能扩展和优化。它不仅能提高测试效率,还能保证接口的稳定性和可靠性,为软件质量提供有力保障。
29 7
|
22天前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
30 7
|
1月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
97 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
21天前
|
安全 API 文件存储
Yagmail邮件发送库:如何用Python实现自动化邮件营销?
本文详细介绍了如何使用Yagmail库实现自动化邮件营销。Yagmail是一个简洁强大的Python库,能简化邮件发送流程,支持文本、HTML邮件及附件发送,适用于数字营销场景。文章涵盖了Yagmail的基本使用、高级功能、案例分析及最佳实践,帮助读者轻松上手。
30 4
|
20天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
1月前
|
开发者 Python
使用Python实现自动化邮件通知:当长时程序运行结束时
本文介绍了如何使用Python实现自动化邮件通知功能,当长时间运行的程序完成后自动发送邮件通知。主要内容包括:项目背景、设置SMTP服务、编写邮件发送函数、连接SMTP服务器、发送邮件及异常处理等步骤。通过这些步骤,可以有效提高工作效率,避免长时间等待程序结果。
62 9
|
27天前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录