前言
本人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:\python\python.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作为小工具来用,也确实挺方便的。