前言

本人python零基础,但是听说Java直接读取excel和直接操作word比较麻烦,所以最近在学习Java调用python脚本进行excel和word的操作。本人没有下载python的其他编译器,因为它自带有一个编译器,虽然不是很好用。我用的python版本是3.7.15。

python实现读取excel指定表格的数据

import openpyxl

#读取excel表格数据

def getCell(wb, sheetname, column):

#指定读取哪个Sheet(每个excel表格默认有三个Sheet:Sheet1,Sheet2,Sheet3)

table = wb[sheetname]

#读取哪一列数据

cell = table[column]

for c in cell:

if (c.value):

#过滤没有数据的行

#打印结果

print(c.value)

if __name__ == "__main__":

path = 'E:\temp\test.xlsx'

#excel对象

wb = openpyxl.load_workbook(path)

#print(wb.sheetnames)

#print(wb.active)

sheetname = wb.sheetnames[0]

#print(sheetname)

column = 'B'

getCell(wb, sheetname, column)

if name == “main”:是程序的入口,相当于Java的main方法,这个代码比较简单,意思是读取test文件的B列数据,然后判断是否为空,输出不是空的值。

python操作word文档

首先是进入python的根路径下面,执行

pip install mailmerge

顾名思义下载mailmerge

然后操作word文档:在需要插入数据的地方做如下操作:

选择域:

格式也可以做相应选择,但是由于这里只是demo,所以不做规定,选择无。

这样子word文档的操作就完成了,关闭文档。

接下来就是写python脚本来操作word文档了。

from mailmerge import MailMerge

# 打印模

template = "E:\temp\pythonTest.docx"

fix="lixiaoli2"

name1='lixiaoli'

# 创建邮件合并文档并查看所有字段

document_1 = MailMerge(template)

#print("Fields included in {}: {}".format(template,document.get_merge_fields()))

document_1.merge(

name=u''+name1

)

document_1.write('E:\temp\'+fix+'.docx')

这个代码也是比较好理解,template表示的是刚刚所操作文档的路径加名称,name1表示的是name的值,这里是写死的,fix是新生成的文件的名字,也是写死的,document_1.merge里面就是给参数赋值,name=u’’+name1 表示将name1的值赋给name,这里u表示编码。document_1.write(‘E:temp’+fix+’.docx’)表示新文件的路径和文件名。运行后可以去指定的路径下面查看生成的文件:

python读取excel表格数据后写入word文档相应位置

import openpyxl

from mailmerge import MailMerge

#将数据写入wod文档

def writeDocx(name, filename):

template = "E:\temp\pythonTest.docx"

document_1 = MailMerge(template)

#print("Fields included in {}: {}".format(template,document.get_merge_fields()))

document_1.merge(

name=u''+name

)

document_1.write('E:\temp\'+filename+'.docx')

#读取excel表格数据

def getCell(wb, sheetname, column):

#指定读取哪个Sheet(每个excel表格默认有三个Sheet:Sheet1,Sheet2,Sheet3)

table = wb[sheetname]

#读取哪一列数据

cell = table[column]

#print(cell[0].value)

writeDocx(cell[1].value,cell[1].value)

#for c in cell:

#if (c.value):

#过滤没有数据的行

#打印结果

#print(c.value)

if __name__ == "__main__":

path = 'E:\temp\test.xlsx'

#excel对象

wb = openpyxl.load_workbook(path)

#print(wb.sheetnames)

#print(wb.active)

sheetname = wb.sheetnames[0]

#print(sheetname)

column = 'B'

getCell(wb, sheetname, column)

这个代码是整合了上面读取excel表格数据和写入word文档的方法。首先,从if name == "main"入口开始,读取’E:temp'的test文件,调用getCell方法读取excel表格B一列的数据。在getCell方法中,cell是excel表格B一列的数据,然后调用writeDocx方法来操作word文档,name和filename参数都是cell[1]的值。

这个方法是可以直接运行的,但是回归原来的目的,是Java调用pytho脚本,所以这里利用Java代码来运行:

import java.io.BufferedReader;

import java.io.InputStreamReader;

public class PythonTest {

public static void main(String[] args) {

try {

System.out.println("start");

String[] args1=new String[]{"E:\python\python.exe","E:\pythonWorkspace\ExcelTest.py"};

Process pr=Runtime.getRuntime().exec(args1);

/*

BufferedReader in = new BufferedReader(new InputStreamReader(

pr.getInputStream()));

String line;

while ((line = in.readLine()) != null) {

System.out.println(line);

}

in.close();

pr.waitFor();*/

System.out.println("end");

} catch (Exception e) {

e.printStackTrace();

}}

public void test(){

System.out.println("我的第一个方法C");

}

运行Java的main方法,这就运行了python脚本,读取了相应表格的数据并且对word文档进行了操作。

补充说明Runtime.getRuntime().exec()方法

这个方法相当于是运行cmd窗口来运行相应的python脚本。args1数组表示相应的参数,他的长度是没有限制的。其中第一个参数E:pythonpython.exe表示python的运行环境,如果电脑配置了python的环境变量,是可以直接写python的。第二个参数是要运行的相应的py文件。我的代码里面只有这两个参数,因为我只需要用到这两个参数,但是事实上,是可以远不止有这两个参数的,下面来举例说明:

创建一个py脚本:

import sys

if __name__ == '__main__':

a=sys.argv[0]

print(a)

Java代码:

public class PythonTest {

public static void main(String[] args) {

try {

System.out.println("start");

String[] args1=new String[]{"E:\python\python.exe","E:\pythonWorkspace.py","lixiaoli","lixioali11111"};

Process pr=Runtime.getRuntime().exec(args1);

BufferedReader in = new BufferedReader(new InputStreamReader(

pr.getInputStream()));

String line;

while ((line = in.readLine()) != null) {

System.out.println(line);

}

in.close();

pr.waitFor();

System.out.println("end");

} catch (Exception e) {

e.printStackTrace();

}}

public void test(){

System.out.println("我的第一个方法C");

}

}

其中arh1参数增加了几项,运行结果为:

修改py文件:

import sys

if __name__ == '__main__':

a=sys.argv[1]

print(a)

运行结果为:

这样的结果应该显而易见sys.argv[1]和sys.argv[0]的作用了。如果参数需要从Java传到python,那么就可以利用这个方法。

总结

其实Java也可以实现excel和word的相应操作,但是比较麻烦,所以才使用了python,python作为小工具来用,也确实挺方便的。

python从excel中读取数据 写入word_Java调用python脚本,读取excel表格数据并写入word文档-Go语言中文社区...相关推荐

  1. python数据写入表格生成图片_python在word文档里插入图片和表格实例代码演示

    # -*- coding: UTF8 -*- from docx import Document from docx.shared import Pt doc = Document() # 文件存储路 ...

  2. python word 表格 缩进_python-docx处理word文档

    前言 更多内容,请访问我的 个人博客. 前言 全网找了一番,用python创建和更新word(.docx)文档,还是 python-docx 包比较好用. 依赖Python 2.6, 2.7, 3.3 ...

  3. html在分页功能中如何实现当前页面的页码样式与其他页面不同_如何使用word文档?word文档使用技巧教程?...

    Word文档使用方法与教程: 使用正确的部分和章节标题 我们在前面的章节中介绍了预设样式,但是这些样式可用于快速创建章节,子标题和标题页.在"主页"功能区选项卡中找到样式,可以在其 ...

  4. python处理word文档(docxtpl 中文说明文档)

    一 docxtpl docxtpl 一个很强大的包,其主要通过对docx文档模板加载,从而对其进行修改. 主要依赖两个包 python-docx :读写doc文本 jinja2:管理插入到模板中的标签 ...

  5. python win32转pdf 横版_讲真,别再用win32com包来实现Word文档转PDF了

    这几天有件大爽事. 之前一直放在Django原生的服务器的网站,终于放到Apache上了.并不是配置多难,也不是我懒,问题出在了用win32com实现word转pdf,我不能使用这个插件读取word, ...

  6. gorm软删除_GORM中文文档-Go语言中文社区

    入门指南 GORM是类似Django ORM,对开发人员友好的 Golang ORM 库. 概览 全特性 ORM (几乎包含所有特性) 模型关联 (一对一, 一对多,一对多(反向), 多对多, 多态关 ...

  7. python调用metasploit自动攻击_Python脚本与Metasploit交互进行自动永恒之蓝攻击-Go语言中文社区...

    我们首先利用 findTarget() 函数找到目标网段或目标主机中开放了445端口的主机,然后利用 confickerExploit() 函数将攻击代码写入 configure.rc 配置文件中,最 ...

  8. python casefold lower_Python学习之路(2)——字符串方法casefold和lower的区别(Python3.5)-Go语言中文社区...

    最近在学习Python基础和一些视频教学中,发现字符串的内置函数(built-in functions)中有2个方法的作用非常相似:casefold和lower: str1='I love Pytho ...

  9. vue中使用file-saver插件导出文件(表格,图片,word文档等)

    1. 安装 js安装 npm install file-saver --save ts安装 npm install @types/file-saver --save-dev 2.引入 import { ...

  10. html修改表格行间距,怎样修改word文档中表格的行间距

    通常我们在Word中制作表格的时候,表格都不能一次性达到我们满意的效果,因为word表格的列宽及行高一般都是采用默认值.所以便需要我们对其行高和列宽作出调整,来达到自己需求的效果.那么有哪些方法可以让 ...

最新文章

  1. 推特雪花算法 java实现
  2. CSU1632Repeated Substrings(后缀数组/最长公共前缀)
  3. LeetCode-动态规划-213. 打家劫舍 II
  4. spring AOP策略模式使用
  5. 【Linux】一步一步学Linux——dpkg-reconfigure命令(272)
  6. Luogu P2577 [ZJOI2005]午餐
  7. linux shell 脚本 supress,《linux Shell 脚本攻略》进阶学习(第一部分)
  8. 文末赠书100本 | 当下最火爆的机器学习算法
  9. DOTNET Core MVC(二)路由初探
  10. CVPR 2020 论文大盘点—目标跟踪篇
  11. asp.net core webapi Session 内存缓存
  12. 这是我对智能制造的所有理念
  13. 微信小程序 禁止弹框下面的内容滑动
  14. w ndows10备份,Win10备份工具哪个最好?轻松备份会让你知道
  15. EEGLAB工具箱的下载与安装
  16. php 算年龄,php – 根据出生日期计算年龄
  17. mysql的auto_increment报错1467
  18. 小学计算机基础知识思维导图,简单易懂的小学除法思维导图
  19. 如何查看linux系统版本
  20. 使用 redis 连接指定端口的 redis 数据库

热门文章

  1. matlab画基尼系数,matlab 拟合洛伦兹曲线求基尼系数
  2. 网站如何防盗链的8种方法
  3. VMware9 绿色破解版 下载地址
  4. CodeForces-721A-One-dimensional Japanese Crossword
  5. MySQL数据库创建表一系列操作
  6. Android短信发送,监听,及其工具类封装
  7. SSL基础:23:生成Kubernetes集群证书(OpenSSL方式)
  8. 个人网站设计需求分析
  9. JSP个人博客网站设计与实现
  10. pentaho发布报表后免登陆查看数据报表