5일차는 3,4일차에 했던 작업을 했습니다.
쓸게 딱히 없어서 6일차에 꼽사리 껴서 올립니다!

본론으로 바로 들어가겠숨다
위의 사진이 바로 알바로 요청받은 프로그램입니다.
간단한 소개를 하자면
은행에서 후원내역을 api로 제공하는데
엑셀로 다운 받고
회원 관리 소프트웨어인 MRM에서 납부구분 리스트와
후원자 리스트를 다운 받아서
위의 파일 세개의 위치를 입력하면
자동으로 요청받은 형식으로 csv 파일을 변환해줍니다.

예를 들어 ECC와 TIM 중에 선택을 하지 않으면
선택해달라는 문구가 출력되고



그리고 위와 마찬가지로 위치가 입력되지 않은 파일이 있다면
해당 파일의 위치를 입력하달라고 안내합니다.
그리고 만약 모든 파일의 위치가 올바르다면

작업이 실행됩니다!!
실제 리스트는 일급비밀 사항이기에

파일이 이렇게 정리됩니다.
회원번호 부여 완료 후원자 파일에는
회원번호와 후원받으시는 분의 이름 모두 올바른 분들이 들어가고
미등록 후원자 또는 납부구분 확인 필요하신분들 파일에는
회원번호가 없거나 후원받으시는 분들의 이름이 올바르지 않은 경우
들어가게 됩니다.
package report13;
import java.awt.*;
import java.awt.event.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import javax.swing.*;
public class report13 extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
public static final int WIDTH = 500;
public static final int HEIGHT = 300;
private JTextField bankinputField;
private JTextField donatornputField;
private JTextField nabbuinputField;
private JTextField OutputField;
String radio_name[] = {"ECC", "TIM"};
JRadioButton radio[] = new JRadioButton[2];
int mode = -1;
public static void main(String[] args){
report13 dtobConverter = new report13( );
dtobConverter.setVisible(true);
}
public report13( ){
setTitle("엑셀 파일 변환");
setSize(WIDTH, HEIGHT);
addWindowListener(new WindowDestroyer());
Container contentPanel = getContentPane();
contentPanel.setLayout(new GridLayout(6, 1));
JPanel radiopanel = new JPanel();
ButtonGroup group = new ButtonGroup();
for(int i=0; i<radio.length; i++){
radio[i] = new JRadioButton(radio_name[i]);
group.add(radio[i]);
radiopanel.add(radio[i]);
radio[i].addActionListener(this);
}
/////////////////////////////////////////////////////////////
JPanel bankPanel = new JPanel();
bankPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
JLabel bankLabel = new JLabel("은행에서 가져온 엑셀 파일 위치 :");
bankPanel.add(bankLabel);
bankinputField = new JTextField(40);
bankPanel.add(bankinputField);
contentPanel.add(bankPanel);
/////////////////////////////////////////////////////////////
JPanel donatorPanel = new JPanel();
donatorPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
JLabel donatorLabel = new JLabel("후원자 리스트 파일 위치 :");
donatorPanel.add(donatorLabel);
donatornputField = new JTextField(40);
donatorPanel.add(donatornputField);
contentPanel.add(donatorPanel);
/////////////////////////////////////////////////////////////
JPanel missionaryPanel = new JPanel();
donatorPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
JLabel missionaryLabel = new JLabel("납부구분 리스트 파일 위치 :");
missionaryPanel.add(missionaryLabel);
nabbuinputField = new JTextField(40);
missionaryPanel.add(nabbuinputField);
contentPanel.add(missionaryPanel);
contentPanel.add(radiopanel);
/////////////////////////////////////////////////////////////
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
JLabel binaryLabel = new JLabel("변환 완료 여부 : ");
bottomPanel.add(binaryLabel);
OutputField = new JTextField(35);
OutputField.setEditable(false);
bottomPanel.add(OutputField);
contentPanel.add(bottomPanel);
//button
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new FlowLayout());
JButton convertButton = new JButton("Convert");
convertButton.addActionListener(this);
buttonPanel.add(convertButton);
JButton exitButton = new JButton("Exit");
exitButton.addActionListener(this);
buttonPanel.add(exitButton);
contentPanel.add(buttonPanel);
}
public void actionPerformed(ActionEvent e)
{
String s = e.getActionCommand();
try
{
if(s.equals("Exit")){
System.exit(0);
}
else if(s.equals(radio[0].getText())){
System.out.println(radio[0].getText());
mode = 0;
}
else if(s.equals(radio[1].getText())){
System.out.println(radio[1].getText());
mode = 1;
}
else if(mode == -1) {
OutputField.setText("ECC, TIM 둘 중에 선택해주세요.");
}
else if(donatornputField.getText().length() == 0) {
OutputField.setText("후원자 리스트 파일의 위치를 입력하세요.");
}
else if(bankinputField.getText().length() == 0) {
OutputField.setText("은행에서 받아온 파일의 위치를 입력하세요.");
}
else if(nabbuinputField.getText().length() == 0) {
OutputField.setText("납부구분 리스트 파일의 위치를 입력하세요.");
}
else
tryconvert(e);
}
catch (NumberFormatException e2){
OutputField.setText("Error: Reenter Number.");
}
}
public void tryconvert(ActionEvent e)
{
HashMap<String, String> donatormap = new HashMap<String, String>();
HashMap<String, String> nabbumap = new HashMap<String, String>();
BufferedReader br = null;
BufferedWriter perfect = null;
BufferedWriter NoInMrm = null;
donatormap = loaddonator();
nabbumap = loadnabbu();
try{
br = Files.newBufferedReader(Paths.get(bankinputField.getText().trim()));
String s[] = bankinputField.getText().split("/");
String output = "";
for(int i = 0 ; i < s.length-1 ; i++ ) {
output += s[i] + "/";
}
perfect = Files.newBufferedWriter(Paths.get(output + "회원번호 부여 완료 후원자.csv"),Charset.forName("UTF-8"));
NoInMrm = Files.newBufferedWriter(Paths.get(output + "미등록 후원자 또는 납부구분 확인 필요하신분들.csv"),Charset.forName("UTF-8"));
String line = "";
String nabbu = "";
String donator = "";
int flag = 0;
line = br.readLine();//버퍼 처리
line = br.readLine();//버퍼 처리
while((line = br.readLine()) != null) {
String array[] = line.split(",");
String date[] = array[1].split(" ");
flag = 0;
donator = array[3];
if(array[0].equals("")) continue;
//납부 검색
for(String strkey : nabbumap.keySet()) {
if(array[2].contains(strkey)) {
nabbu = strkey;
flag = 1;
break;
}
}
if(flag == 0) {
nabbu = array[2];
if(donatormap.containsKey(donator)) {
NoInMrm.write( donatormap.get(donator) + "," + donator + "," + array[4] + "," + nabbu + "," + date[0] + ",납부구분 확인 바람");
NoInMrm.newLine();
continue;
} else {
NoInMrm.write( "," + donator + "," + array[4] + "," + nabbu + "," + date[0] + ",납부구분 확인 바람 그리고 후원자 등록 필요");
NoInMrm.newLine();
continue;
}
}
if(donatormap.containsKey(donator)) {
perfect.write(donatormap.get(donator) + "," + donator + "," + array[4] + "," + nabbu + "," + date[0]);
perfect.newLine();
}
else {
NoInMrm.write( "," + donator + "," + array[4] + "," + nabbu + "," + date[0] + ",후원자 등록 필요");
NoInMrm.newLine();
}
}
OutputField.setText("작업 완료! ");
}catch(FileNotFoundException e1){
e1.printStackTrace();
OutputField.setText("후원자 리스트 파일이 존재하지 않는 파일이거나 파일 위치를 찾을 수 없습니다.");
}catch(IOException e1){
OutputField.setText("후원자 리스트 파일이 존재하지 않는 파일이거나 파일 위치를 찾을 수 없습니다.");
e1.printStackTrace();
}finally{
try{
if(br != null){
br.close();
perfect.close();
NoInMrm.close();
}
}catch(IOException e1){
e1.printStackTrace();
}
}
}
public class WindowDestroyer extends WindowAdapter{
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
public HashMap<String, String> loaddonator() {
BufferedReader br = null;
int count = 0;
HashMap<String, String> map = new HashMap<String, String>();
try{
br = Files.newBufferedReader(Paths.get(donatornputField.getText().trim()));
String line = "";
line = br.readLine();//버퍼 처리
while((line = br.readLine()) != null){
String array[] = line.split(",");
String mon = "";
if(array.length == 5)
mon = array[3] + array[4];
else if(array.length == 6)
mon = array[3] + array[4] + array[5];
if( mode == 0 ) {
if(array[0].equals("동서문화개발교류회") ) {
//System.out.println(array[2]+" "+array[1]);
map.put(array[2],array[1]);
}
}
else if( mode == 1 ) {
if(array[0].equals("두란노해외선교회") ) {
//System.out.println(array[0]+" "+ array[2]+" "+array[1]);
map.put(array[2],array[1]);
}
}
count++;
}
}catch(FileNotFoundException e){
e.printStackTrace();
OutputField.setText("후원자 리스트 파일이 존재하지 않는 파일이거나 파일 위치를 찾을 수 없습니다.");
}catch(IOException e){
OutputField.setText("후원자 리스트 파일이 존재하지 않는 파일이거나 파일 위치를 찾을 수 없습니다.");
e.printStackTrace();
}finally{
try{
if(br != null){
br.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
return map;
}
public HashMap<String, String> loadnabbu() {
BufferedReader br = null;
int count = 0;
HashMap<String, String> map = new HashMap<String, String>();
try{
br = Files.newBufferedReader(Paths.get(nabbuinputField.getText().trim()));
String line = "";
line = br.readLine();//버퍼 처리
while((line = br.readLine()) != null){
String array[] = line.split(",");
if( mode == 0 ) {
if(array[0].equals("ECC")) {
//System.out.println(array[0]+" "+array[1]);
map.put(array[1],array[0]);
}
}
else if( mode == 1 ) {
if(array[0].equals("TIM")) {
//System.out.println(array[0]+" "+array[1]);
map.put(array[1],array[0]);
}
}
count++;
}
}catch(FileNotFoundException e){
e.printStackTrace();
OutputField.setText("납부구분 파일이 존재하지 않는 파일이거나 파일 위치를 찾을 수 없습니다.");
}catch(IOException e){
OutputField.setText("납부구분 파일이 존재하지 않는 파일이거나 파일 위치를 찾을 수 없습니다.");
e.printStackTrace();
}finally{
try{
if(br != null){
br.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
return map;
}
}
디자인은 좀 별로여도
최대한 빠르게 사용가능하게 만들어달라 하셔서
자바 수업 때 사용했던 디자인을 조금 수정했다.
디자인은 내 영역이 아닌듯 하다
이과라서 미안하다 ㅜㅜ
코드를 다 짜고 나니
실행파일을 만들 때가 되었다
exe 파일로 만들기 위해 검색을 해보니
http://launch4j.sourceforge.net
Launch4j - Cross-platform Java executable wrapper
Cross-platform Java executable wrapper Launch4j is a cross-platform tool for wrapping Java applications distributed as jars in lightweight Windows native executables. The executable can be configured to search for a certain JRE version or use a bundled one
launch4j.sourceforge.net
이 Launch4j 를 사용해야 했다.
다운 받고 실행 시키니

이런 화면이 나왔다
Basic 에서는 output file 과 Jar 만 채워주면 된다.
아웃풋 파일은 만들 exe 파일의 이름이다.
Jar 파일은 작성한 코드를 export -> runnable jar file 을 하니 만들수 있었다
(필자는 eclipse 를 사용했기에 다른 개발환경은 어떻게 해야 하는지 잘 모른다)
그리고

ClassPath에서는 custom classpath를 켜주고
메인 함수가 들어있는 자바 파일을 선택해준다.

Header 에서는 GUI 인지 Console 인지 선택하면 된다.
나는 GUI에 해당하므로 GUI를 선택했다!

그리고 JRE에서 Min JRE version 를 설정해준다!
내가 찾아본 블로그에서 1.8.0을 했기에 따라해봤는데 잘 작동했다.
그리고 왼쪽 위의 톱니바퀴 모형을 클릭하면
exe파일을 저장할 위치를 지정합니다.
그리고 이제 마지막으로 톱니바퀴 옆에 있는 파란 시작버튼을 누른다!!!
그럼 이제 지정한 위치에 exe 파일이 생성된다.
다른 노트북으로 옮겨 실행되나 테스트 해보니
자바가 안 깔려 있어서 자바를 새로 깔았다
그 후에는 정상적으로 잘 실행되었다
이제 이 알바도 서서히 마무리 단계에 접어들고 있다.
내일 하루만 더 하면 끝일거 같은데 참...
마냥 재밌을줄 알았던 코딩으로 알바하기
너무 바쁜 시기에 맡은것 같은 기분이 좀 들지만
남의 돈 벌어먹기가 어디 쉬운가
담에 또 이런 알바 들어오면 좋겠다
ㅋㅋㅋㅋㅋㅋㅋ
암튼 이제 자러가보겠슝~
참고한 사이트 :
https://bluemond.tistory.com/entry/Launch4j-를-이용하여-자바-애플리케이션을-exe-파일로-만들기
Launch4j 를 이용하여 자바 애플리케이션을 exe 파일로 만들기
자바 애플리케이션을 제작하는 개발자는 당연히 JDK_HOME 이 설정되어 있다. 그렇기 때문에 자바 애플리케이션이 문제 없이 실행될 것이다. 하지만, JDK 혹은 JRE가 설치되어 있지 않은 PC에 어떻게
bluemond.tistory.com
https://aljjabaegi.tistory.com/446
[launch4j] jar파일로 exe 파일만드는 방법 how to make exe file to jar file
[launch4j] jar파일로 exe 파일만드는 방법 how to make exe file to jar file jar 파일로 배포를 하다 보면은 batch 파일 생성시에 몇가지 문제점이 발생합니다. 예를 들어 window기반에서 실행은 경..
aljjabaegi.tistory.com
'개발 일지 > 후원명단관리 프로그램' 카테고리의 다른 글
코딩으로 알바하기 마지막 (1) | 2021.07.15 |
---|---|
코딩으로 알바하기 4일차 (2) | 2021.07.13 |
코딩으로 알바하기 3일차 (당근흔들흔들) (4) | 2021.07.12 |
코딩으로 알바하기 2일차 (2) | 2021.07.11 |
코딩으로 알바하기 1일차 (0) | 2021.07.10 |
댓글