首先描述一下最近的需求:通过原始数据与当前数据的比对,分别生成未完成表格,重复表格与命名错误的表格。因此大致可以得出需要用到遍历文档,读取与写入excel文件,通过逻辑判断语句生成相应的文件,最后进行打包。
分为多个方法进行完成。
目录
1.通过行列下标获取excel的单元格内容。传入值为int类型,返回字符串型。
2.获取文件夹下所有文件的路径。传入参数为字符串型,为文件上一级的目录。
3.在写入excel前进行逻辑判断,分别调用1与2的方法。示例如下:
5.excel的写入需要进行创建sheet页,创建表头,传入内容,以及写入操作。如下所示:
6.当完成调试后,需要进行打包操作。由于打包后无法通过控制台进行输入传参,因此需要调用GUI,创建按钮进行监听控制调用。(如无GUI打包运行会有报错)
2.在页面中点击”构件“->"点击加号"->选择"jar"->”从模块中选择“。选择主函数,以及jar包输出的路径 。把目录复制到剪切板。
3.回主界面,点击构建,选择:”编译Artifacts“,点击build即可
1.在cmd界面输入java -verbose,找到jdk的安装位置。一般在第一行。
2.复制路径到lib前,进入,bin文件内。复制文件路径: E:\Program Files\Java\jdk-11.0.4\bin,右击win,以管理员运行终端,切换到该盘符,进入文件内,执行命令
5.分别输入名称和路径,,该路径应将生成的jre置于同一文件夹下,
8.输入1.8即可。再点击”高级选项“,选择Search sequence
一、函数实现
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文件,原始数据文件拷贝到同位数电脑试运行。