Java打包.exe可执行文件;Java读取、写入excel;Java遍历文件夹;

 首先描述一下最近的需求:通过原始数据与当前数据的比对,分别生成未完成表格,重复表格与命名错误的表格。因此大致可以得出需要用到遍历文档,读取与写入excel文件,通过逻辑判断语句生成相应的文件,最后进行打包。

分为多个方法进行完成。

目录

一、函数实现

1.通过行列下标获取excel的单元格内容。传入值为int类型,返回字符串型。

2.获取文件夹下所有文件的路径。传入参数为字符串型,为文件上一级的目录。

3.在写入excel前进行逻辑判断,分别调用1与2的方法。示例如下:

4.补充

5.excel的写入需要进行创建sheet页,创建表头,传入内容,以及写入操作。如下所示:

6.当完成调试后,需要进行打包操作。由于打包后无法通过控制台进行输入传参,因此需要调用GUI,创建按钮进行监听控制调用。(如无GUI打包运行会有报错)

二、程序打包:

1.在idea中点击”文件“->"项目结构"

2.在页面中点击”构件“->"点击加号"->选择"jar"->”从模块中选择“。选择主函数,以及jar包输出的路径 。把目录复制到剪切板。

3.回主界面,点击构建,选择:”编译Artifacts“,点击build即可

三、exe4j使用

1.在cmd界面输入java -verbose,找到jdk的安装位置。一般在第一行。

 2.复制路径到lib前,进入,bin文件内。复制文件路径: E:\Program Files\Java\jdk-11.0.4\bin,右击win,以管理员运行终端,切换到该盘符,进入文件内,执行命令

3.打开exe4j软件后直接点击下一步

 4.选择jar in exe:再下一步

5.分别输入名称和路径,,该路径应将生成的jre置于同一文件夹下,

6.输入软件名称,图标(可选),再下一步

7.选择jar包,主方法

 8.输入1.8即可。再点击”高级选项“,选择Search sequence

 9.将原本的三个全部删除后选择自己的输出路径下的jre文件

10. 选择第二项,客户端的VM ​编辑


一、函数实现

1.通过行列下标获取excel的单元格内容。传入值为int类型,返回字符串型。

/**
     * 根据行和列的下表获取单元格的数据
     *
     * @param row
     * @param column
     * @return
     */

    public String getExcelDataByIndex(int row, int column) {
        XSSFRow row1 = sheet.getRow(row);
        String cell = null;
        if (row1 != null && row1.getCell(column) != null)
            cell = row1.getCell(column).toString();
        return cell;
    }

2.获取文件夹下所有文件的路径。传入参数为字符串型,为文件上一级的目录。


    /**
     * 获取一个文件夹下的所有文件的路径
     *
     * @param path 文件夹路径
     */
    public static String[] getAllFileName(String path) {
        File file = new File(path);
        String dirname[] = new String[2100];
        File[] files = file.listFiles();
        String[] names = file.list();
        if (names != null) {
            int len = names.length;
            String[] completNames = new String[len];
            for (int i = 0; i < len; i++) {
                if (names[i] != null) {
                    dirname[i] = names[i].substring(0, names[i].indexOf("."));
                    completNames[i] = path + names[i];
                }
            }

            List<String> renames = Arrays.asList(completNames);

        }
        for (File a : files) {
            //如果文件夹下有子文件夹,获取子文件夹下的所有文件全路径。
            if (a.isDirectory()) {
                getAllFileName(a.getAbsolutePath());
            }
        }
        return dirname;
    }

3.在写入excel前进行逻辑判断,分别调用1与2的方法。示例如下:

     /*
     * 未做点数
     *
     * */
    public static List<List<String>> getContentNo() {
        List<List<String>> contentList = new ArrayList<>();
        String files = null;
        String[] filenames = getAllFileName(SOURCE_FILE_PATH);
        String[] point = new String[2095];//所有点
        String[] Npoint = new String[3005];//点号
        String[] Nlon = new String[3005];//lon
        String[] Nlat = new String[3005];//lat
        int j = 0;
        int i = 0;
        //所有点坐标  sheet表示
        //Compare为方法名称,在最初通过重载,进行传参,详情如4所示。
        Compare sheet = new Compare(TARGET_EXCEL_PATH, "Sheet1");
        for (i = 0; i < 2095; i++) {
            if (sheet.getExcelDataByIndex(i, 1) != null && sheet.getExcelDataByIndex(i, 0) != null) {
                point[j] = sheet.getExcelDataByIndex(i, 1);
                Nlon[j] = sheet.getExcelDataByIndex(i, 2);
                Nlat[j] = sheet.getExcelDataByIndex(i, 3);
            }
            j++;
        }
        int m = 0;
        j = 0;
        while (m < filenames.length && filenames[m] != null) {
            if (filenames[m].length() <= 4) {
                files = filenames[m] + ".xlsx";
                //属性表  Nsheet用户新建表   05,06为点位标记。
                Compare Nsheet = new Compare(SOURCE_FILE_PATH + files, "Sheet1");
                for (i = 0; i < 2100; i++) {
                    if (Nsheet.getExcelDataByIndex(i, 6) != null) {
                        Npoint[j] = Nsheet.getExcelDataByIndex(i, 6);
                        j++;
                    }
                }
            }
            m++;
        }

        for (i = 0; i < 2095; i++) {
            if (point[i] != null && Npoint[i] != null && Npoint[i].equalsIgnoreCase("SamOrgCode") == false) {
                //未做筛选
                if (Counts(Npoint, point[i]) == 0) {
                    List<String> contents = new ArrayList<>();
                    //赋值传参
                    contents.add(point[i]);
                    contents.add(Nlon[i]);
                    contents.add(Nlat[i]);
                    contentList.add(contents);
                    //System.out.print(Nsheet.getExcelDataByIndex(i, m));
                }
            }
        }
        return contentList;
    }

4.补充


    Compare(String filePath, String sheetName) {
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(filePath);
            XSSFWorkbook sheets = new XSSFWorkbook(fileInputStream);
            //获取sheet
            sheet = sheets.getSheet(sheetName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

5.excel的写入需要进行创建sheet页,创建表头,传入内容,以及写入操作。如下所示:


    //将数据写入excel中
    private static XSSFWorkbook workbook;
    private static XSSFSheet sheets;
    private static XSSFRow row;
    private static XSSFCell cell;
    private static File file;

    //创建sheet页
    public static void setSheet(String sheetName) {
        workbook = new XSSFWorkbook();
        sheets = workbook.createSheet(sheetName);
    }

    //创建表头
    public static void createHead(List<String> headList) {
        //创建表头,也就是第一行
        row = sheets.createRow(0);
        for (int i = 0; i < headList.size(); i++) {
            cell = row.createCell(i);
            cell.setCellValue(headList.get(i));
        }
    }

    //创建表内容
    public static void createContent(List<List<String>> contentList) {
        //创建表内容,从第二行开始
        for (int i = 0; i < contentList.size(); i++) {
            row = sheets.createRow(i + 1);
            for (int j = 0; j < contentList.get(i).size(); j++) {
                row.createCell(j).setCellValue(contentList.get(i).get(j));
            }
        }
    }

    //写入文件
    public static void writeToFile(String filePath) {
        file = new File(filePath);
        //将文件保存到指定的位置
        try {
            workbook.write(new FileOutputStream(file));
            System.out.println("写入成功");
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

6.当完成调试后,需要进行打包操作。由于打包后无法通过控制台进行输入传参,因此需要调用GUI,创建按钮进行监听控制调用。(如无GUI打包运行会有报错)

    private static void Action2() {
        //两个按钮实现同一个监听
        //开始 停止
        Frame frame = new Frame();
        frame.setTitle("进度检测                              powered by le");
        
        frame.setLocationRelativeTo(null);//设置居中
        frame.setSize(550, 110);
        Button No = new Button("未作检测");
        Button Err = new Button("错误检测");
        Button Rep = new Button("重复检测");
        Button Add = new Button("自加检测");

        //set替代默认值
        No.setActionCommand("未作检测");
        Err.setActionCommand("错误检测");
        Rep.setActionCommand("重复检测");
        Add.setActionCommand("自加检测");

        MyMonitor myMonitor = new MyMonitor();
        No.addActionListener(myMonitor);
        Err.addActionListener(myMonitor);
        Rep.addActionListener(myMonitor);
        Add.addActionListener(myMonitor);

        frame.add(No, BorderLayout.SOUTH);
        frame.add(Rep, BorderLayout.EAST);
        frame.add(Err, BorderLayout.WEST);
        frame.add(Add, BorderLayout.NORTH);
        frame.setVisible(true);

        windowClose(frame);
    }

    private static void windowClose(Frame frame) {
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
     public static void No() {
        List<String> headList = new ArrayList<>();
        //未作检测
        headList.add("未做点号");
        headList.add("经度");
        headList.add("纬度");
        List<List<String>> contentListNo = getContentNo();//内容测试数据
        setSheet("No");                        //创建sheet页
        createHead(headList);                         //设置表头
        createContent(contentListNo);                   //设置内容
        writeToFile("D:/kuangdiao/No.xlsx");

    }

    static class MyMonitor implements ActionListener {

        int flg = 0;

        @Override
        public void actionPerformed(ActionEvent e) {
            //e.getActionCommand()获得按钮信息
            System.out.println("按钮被点击了 msg:" + e.getActionCommand());
            if (e.getActionCommand().equals("自加检测")) {
                Add();
            } else if (e.getActionCommand().equals("错误检测")) {
                Err();
            } else if (e.getActionCommand().equals("未作检测")) {
                No();
            } else if (e.getActionCommand().equals("重复检测")) {
                Rep();
            }
        }
    }

二、程序打包:

1.在idea中点击”文件“->"项目结构"

2.在页面中点击”构件“->"点击加号"->选择"jar"->”从模块中选择“。选择主函数,以及jar包输出的路径 。把目录复制到剪切板。

3.回主界面,点击构建,选择:”编译Artifacts“,点击build即可

三、exe4j使用

jar包转可执行exe用到exe4j,激活码可以自行度娘,避免使用弹窗。

在开始前先准备好运行的jre环境而非jdk(目的是实现不同电脑执行exe便可以运行)

1.在cmd界面输入java -verbose,找到jdk的安装位置。一般在第一行。

 2.复制路径到lib前,进入,bin文件内。复制文件路径: E:\Program Files\Java\jdk-11.0.4\bin,右击win,以管理员运行终端,切换到该盘符,进入文件内,执行命令

jlink.exe --module-path jmods --add-modules java.desktop --output jre

完毕后会在jdk内生成jre文件,复制该文件夹。

3.打开exe4j软件后直接点击下一步

 4.选择jar in exe:再下一步

5.分别输入名称和路径,,该路径应将生成的jre置于同一文件夹下,

6.输入软件名称,图标(可选),再下一步

7.选择jar包,主方法

 

 8.输入1.8即可。再点击”高级选项“,选择Search sequence

 

 

 9.将原本的三个全部删除后选择自己的输出路径下的jre文件

由于我的之前是桌面,使用相对路径确保可以在其他电脑上运行,点击下一步

10. 选择第二项,客户端的VM 

完成后一路,下一步即可。点击软件试运行。

确保没问题后将xxx.exe与jre文件,原始数据文件拷贝到同位数电脑试运行。

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Le05280

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值