前言

本人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文档:在需要插入数据的地方做如下操作:

在Java中读取excel中的数据 java读取excel表格数据_python


选择域:

在Java中读取excel中的数据 java读取excel表格数据_Java_02


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

在Java中读取excel中的数据 java读取excel表格数据_python_03


这样子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’)表示新文件的路径和文件名。运行后可以去指定的路径下面查看生成的文件:

在Java中读取excel中的数据 java读取excel表格数据_python_04

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参数增加了几项,运行结果为:

在Java中读取excel中的数据 java读取excel表格数据_python_05


修改py文件:

import sys
if __name__ == '__main__':
  a=sys.argv[1]
  print(a)

运行结果为:

在Java中读取excel中的数据 java读取excel表格数据_Java_06


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

总结

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