ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (국비교육) 20 - 보조 스트림 + 스레드 + java로 엑셀 파일 만들기 + poi 활용하기
    개발/국비교육 2023. 6. 28. 16:43

    ■ 문자 변환 보조 스트림

     

     

    출력, 입력 메소드 만들어주기

     

    writer.write(str) 을 통해 입력받은 값을 출력하기

    flush() 버퍼까지 넘기기

    close() 닫아주기

     

    buffer 배열로 객체 만들어주고 한 번에 값 가져오기

    data 는 buffer 배열을 가져오되, 0인덱스부터 읽어온 끝까지 가져오게끔 설정해준다.

     

     

    read() 를 data 에 넣고 실행하면 읽어올 수 있다.

     

     

    * 에러해결

     

    하단에 read() 메소드에 타입을 걸어주고 위에는 해당 타입에 맞게 쓰지 않아 오류가 발생했다.

    밑에 타입을 미지정해주니 오류 해결 되었다.  

     

    package iotest;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.io.Reader;
    import java.io.Writer;
    
    public class CharactorConvertStreamEx {
    	public static void main(String[] args) throws IOException {
    		write("문자 변환 스트림을 사용합니다.");
    		String data = read();
    		System.out.println(data);
    
    	}
    
    	public static void write(String str) throws IOException {
    		FileOutputStream fos = new FileOutputStream("c:\\temp\\test1.txt");
    		Writer writer = new OutputStreamWriter(fos);
    		writer.write(str);
    		writer.flush();
    		writer.close();
    	}
    
    	public static String read() throws IOException {
    		FileInputStream fis = new FileInputStream("c:\\temp\\test1.txt");
    		Reader reader = new InputStreamReader(fis);
    		char[] buffer = new char[100];
    
    		int readCharNum = reader.read(buffer);
    		reader.close();
    		String data = new String(buffer, 0, readCharNum);
    		return data;
    	}
    
    }

     

    ■ Try Catch 로 파일 출력하기

     

     

    * 기존 파일에 이어서 저장하기

     

    파일명 뒤에 true 를 작성하면 글을 이어서 작성 가능하다.

    만약 기존에 글을 삭제하려면 true 를 빼면 된다. 

     

    package file;
    
    import java.io.FileWriter;
    import java.io.IOException;
    
    //기존 파일에 이어서 저장하기
    public class File02 {
    	public static void main(String[] args) {
    
    		try {
    			FileWriter fw = new FileWriter("c:\\temp\\fileWriter.txt", true);
    			for (int i = 10; i < 20; i++) {
    				String data = i + "번째 이어서 씁니다.\n";
    				fw.write(data);
    			}
    			fw.flush();
    			fw.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }

     

    ■ 예제 실습 

     

     

    exists() : 존재 여부 확인 (있어? 없어?)

    dir.mkdir() :디렉토리 만들기

    createNewFile() : 파일 만들기

     

    디렉토리 없으면 만들어

    파일 없으면 만들어

     

     

    listFiles() : 목록으로 가져와

    SimpleDateFormat : 간단하게 날짜 만들어줌

    lastModified() : 마지막으로 생성했던 시간

    isDirectory() : 디렉토리인지 아닌지 

     

    package file;
    
    import java.io.File;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.Date;
    
    public class FileEx {
    	public static void main(String[] args) throws IOException {
    
    		File dir = new File("c:\\temp\\images");
    		File file1 = new File("c:\\temp\\file1.txt");
    		File file2 = new File("c:\\temp\\file2.txt");
    		File file3 = new File("c:\\temp\\file3.txt");
    
    		if (!dir.exists()) {
    			dir.mkdir();
    		}
    		if (!file1.exists()) {
    			file1.createNewFile();
    		}
    		if (!file2.exists()) {
    			file2.createNewFile();
    		}
    		if (!file3.exists()) {
    			file3.createNewFile();
    		}
    		
    		File temp = new File("c:\\temp");
    		File[] contents = temp.listFiles();
    		
    		System.out.println("시간\t\t\t형태\t\t크기\t이름");
    		System.out.println("--------------------------------------------------------------");
    		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd a HH:mm"); //초 빼면 정렬됩니다.
    		
    		System.out.println(Arrays.toString(contents));
    		System.out.println(contents[0].getName());
    		System.out.println(contents[0].length());
    		System.out.println(contents[0].isDirectory());
    		
    		for (File file : contents) {
    			System.out.print(sdf.format(new Date(file.lastModified())));
    			if (file.isDirectory()) {
    				System.out.println("\t<DIR>\t\t\t" + file.getName());
    			} else {
    				System.out.println("\t\t\t" + file.length() + "\t" + file.getName());
    			}
    			System.out.println("");
    		}
    	}
    
    }

     

    ■ 엑셀 파일 만들기 (파일 하단 有)

     

     

    https://www.nextree.co.kr/p5229/

     

    JXL : Excel이 Java를 만났을 때

    주로 다양한 수치 Data를 다루는 통계Site에서 Data를 Excel File로 내려 받을 수 있도록 제공하는 경우가 많습니다. 보통은 화면에 보이는 내용을 그대로 Excel(xlsx, xls 확장자) 또는 CSV(Comma Separated Values

    www.nextree.co.kr

    jxl.jar
    0.40MB

     

     

     

    package excel;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Map;
    
    import jxl.Workbook;
    import jxl.write.Label;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;
    import jxl.write.WriteException;
    import jxl.write.biff.RowsExceededException;
    
    public class Excel01 {
    	public static void main(String[] args) throws IOException, RowsExceededException, WriteException {
    		
    		WritableWorkbook workbook = null;
    		WritableSheet sheet = null;
    		Label label = null;
    		File file = new File("c:\\temp\\Excel01.xls");
    		
    		HashMap<String, String> map = new HashMap<String, String>();
    		map.put("이름", "홍길동");
    		map.put("나이", "230");
    		map.put("성별", "남자");
    		
    		HashMap<String, String> map2 = new HashMap<String, String>();
    		map2.put("이름", "김길동");
    		map2.put("나이", "20");
    		map2.put("성별", "여자");
    		
    		HashMap<String, String> map3 = new HashMap<String, String>();
    		map3.put("이름", "송길동");
    		map3.put("나이", "28");
    		map3.put("성별", "남자");
    		
    		ArrayList<Map<String, String>> aList = new ArrayList<Map<String, String>>();
    		aList.add(map);
    		aList.add(map2);
    		aList.add(map3);
    
    		
    		workbook = Workbook.createWorkbook(file);
    		workbook.createSheet("시트", 0);
    		sheet = workbook.getSheet(0);
    		
    		label = new Label(0, 0, "이름");
    		sheet.addCell(label);
    		
    		label = new Label(1, 0, "나이");
    		sheet.addCell(label);
    		
    		label = new Label(2, 0, "성별");
    		sheet.addCell(label);
    		
    		for (int i = 0; i < aList.size(); i++) {
    			HashMap<String, String> rs = (HashMap<String, String>) aList.get(i);
    			label = new Label(0, (i+1), rs.get("이름"));
    			sheet.addCell(label);
    			
    			label = new Label(1, (i+1), rs.get("나이"));
    			sheet.addCell(label);
    			
    			label = new Label(2, (i+1), rs.get("성별"));
    			sheet.addCell(label);
    		}
    		workbook.write();
    		workbook.close();
    	}
    	
    
    }

     

    ■ POI 활용해보기

     

     

    해당 파일 다운로드 -> 압축 풀기

     

     

     

    해당 2개 파일 Build Path 로 설정해주기

    package excel;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Map;
    import java.util.Set;
    import java.util.TreeMap;
    
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    
    
    public class Excel02 {
    	public static String filePath = "c:\\temp";
    	public static String fileNm = "Excel02.xls";
    
    	public static void main(String[] args) throws IOException {
    		// 빈 Workbook 생성
    		//XSSFWorkbook workbook = new XSSFWorkbook();
    		HSSFWorkbook workbook = new HSSFWorkbook();
    		// 빈 Sheet 를 생성
    		HSSFSheet sheet = workbook.createSheet("직원데이터");
    
    		// Sheet 를 채우기 위한 데이터들을 Map 에 저장
    		Map<String, Object[]> data = new TreeMap<String, Object[]>();
    		data.put("1", new Object[] { "ID", "Name", "전화번호"});
    		data.put("2", new Object[] { "1", "쿠키", "010-4521-5698"});
    		data.put("3", new Object[] { "2", "식빵", "010-8966-5658"});
    		data.put("4", new Object[] { "3", "마카롱", "010-8700-4519"});
    		data.put("5", new Object[] { "4", "소금빵", "010-5000-5907"});
    		
    		//data 에서 keySet 을 가져옵니다. 이 set 값들을 조회해서 sheet 에 입력
    		Set<String> keyset = data.keySet();
    		int rownum = 0;
    		for (String key : keyset) {
    			Row row = sheet.createRow(rownum++);
    			Object[] objArr = data.get(key);
    			int cellnum = 0;
    			for (Object obj : objArr) {
    				Cell cell = row.createCell(cellnum++);
    				if (obj instanceof String) {
    					cell.setCellValue((String)obj);
    				} else if (obj instanceof Integer) {
    					cell.setCellValue((Integer)obj);
    				}
    			}
    		}
    		
    		try {
    			FileOutputStream out =
    					new FileOutputStream(new File(filePath, fileNm));
    			workbook.write(out);
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		}
    		
    	}
    }

     

    instanceof String : String으로 나온 녀석이 obj 맞아? 문자열 형태야?

     

    package excel;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    
    public class Excel03 {
       public static void main(String[] args) throws IOException {
    
          // Workbook생성하기
          Workbook wb = new HSSFWorkbook();// poi-4.0.0.jar
          //Workbook wb2 = new XSSFWorkbook();// poi-ooxml-4.0.0.jar
    
          Sheet sheet1 = wb.createSheet("시트만듬");
    
          //sheet1.setColumnWidth(0, 10000);
    
          Row row = null;
          Cell cell = null;
          int rowNum = 0;
          
          row = sheet1.createRow(rowNum++);
          
          cell = row.createCell(0);
          cell.setCellValue("이름");
          
          cell = row.createCell(1);
          cell.setCellValue("나이");
          
          cell = row.createCell(2);
          cell.setCellValue("사는곳");
          
         //data
          row = sheet1.createRow(rowNum++);
          cell = row.createCell(0);
          cell.setCellValue("홍길동");
          cell = row.createCell(1);
          cell.setCellValue("230");
          cell = row.createCell(2);
          cell.setCellValue("한양");
                
          
          File xlsfile = new File("c:\\temp\\test.xls") ;
          
          FileOutputStream fos = new FileOutputStream(xlsfile);
          wb.write(fos);
       }
    }

     

    https://archive.apache.org/dist/poi/release/bin/

     

    Index of /dist/poi/release/bin

     

    archive.apache.org

     

    [Java] Apache POI 간단 사용법 (velog.io)

     

    [Java] Apache POI 간단 사용법

    자바로 엑셀을 제어해보자. (feat.Apache POI)

    velog.io

     

    ■ TreeMap

     

     

    이진트리를 기반으로 만든다.

     

     

     

     

    hashmap 은 정렬이 안된다.

     

     

    LinkedHashMap 을 사용하면 순서가 없던 hashmap 도 내가 적은 순서대로 출력을 시킬 수는 있다. 

     

     

    https://seeminglyjs.tistory.com/227

     

    [Java] 자바 TreeMap 컬렉션에 대하여 알아보자!

    2021-01-14 TreeMap에서는 Tree라는 개념이 중요하다. 이는 이진트리 구조를 뜻하는데, 아래 보이는 노드들이 바로 이진트리 형태의 구조이다. 맨 위의 시작 노드를 보통 루트(root)라고 불리며, 나머지

    seeminglyjs.tistory.com

    https://ratsgo.github.io/data%20structure&algorithm/2017/10/21/tree/

     

    트리(tree)와 이진트리(binary tree) · ratsgo's blog

    이번 글에서는 다양한 분야에서 널리 쓰이고 있는 자료구조인 트리(tree)와 트리의 일종인 이진트리(binary tree)에 대해 살펴보도록 하겠습니다. 힙 정렬이 뭔지 알아보려면 여러가지 개념을 먼저

    ratsgo.github.io

     

    ■ 스레드 (p. 520)

     

     

    toolkit : 컴퓨터 소리 내기

    Toolkit.getDefaultToolkit() : Toolkit 객체 생성 하지 않고 있는거 그대로 가져옴

    .sleep(1000) : 1

     

    package threadex;
    
    import java.awt.Toolkit;
    
    public class Thread01 {
    	public static void main(String[] args) throws InterruptedException {
    		
    		Toolkit toolkit = Toolkit.getDefaultToolkit();
    		for (int i = 0; i < 5; i++) {
    			toolkit.beep();
    			Thread.sleep(3000); //3초
    			
    		}
    	}
    }

     

     

    바로 new BeepTask() 로 넣을 수 있다.

     

    * thread01 ~ temp 까지

     

    package threadex;
    
    import java.awt.Toolkit;
    
    public class Thread01 {
    	public static void main(String[] args) throws InterruptedException {
    		
    		Toolkit toolkit = Toolkit.getDefaultToolkit();
    		for (int i = 0; i < 5; i++) {
    			toolkit.beep();
    			Thread.sleep(3000); //3초
    			
    		}
    	}
    }

     

     

     

     

    package threadex;
    
    import java.awt.Toolkit;
    
    // 스래드를 상속받아야 해요.
    
    public class BeepTask implements Runnable {
    //실제 작업은 run()에 적어줍니다. / 실행은 start()
    	@Override
    	public void run() {
    		Toolkit toolkit = Toolkit.getDefaultToolkit();
    		for (int i = 0; i < 5; i++) {
    			toolkit.beep();
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    }

     

     

     

    package threadex;
    
    public class BeepPrintEx {
    	public static void main(String[] args) {
    
    		// Runnable beepTask = new BeepTask();
    		Thread thread = new Thread(new BeepTask());
    		thread.start();
    
    	}
    
    }

     

     

     

    package threadex;
    
    public class Temp extends Thread {
    	@Override
    	public void run() {
    	}
    	
    	public static void main(String[] args) {
    		Thread thread = new Thread() {
    			@Override
    			public void run() {
    				
    			}
    		}; //생성자 끝
    	}
    }

     

     

    * 익명 객체로 만들어보기

     

     

    package threadex;
    
    import java.awt.Toolkit;
    
    //익명 객체로 만들기
    public class BeepPrintEx5 {
    	public static void main(String[] args) {
    		Thread thread = new Thread() {
    			@Override
    			public void run() {
    				Toolkit toolkit = Toolkit.getDefaultToolkit();
    				for (int i = 0; i < 5; i++) {
    					toolkit.beep();
    					try {
    						Thread.sleep(1500);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    
    			}
    
    		}; // 생성자 끝
    	}
    }

     

    * 실습해보기 (동기화 작업은 추후)

     

    package threadex;
    //스래드 연습
    
    public class Thread02 extends Thread {
    	int seq;
    
    	public Thread02(int seq) {
    		this.seq = seq;
    	}
    
    	@Override
    	public void run() {
    		System.out.println(this.seq + "스래드 시작");
    
    		try {
    		 	Thread.sleep(1000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    
    		System.out.println(this.seq + "스래드 종료");
    
    	}// end run
    
    	public static void main(String[] args) {
    		System.out.println("main시작");
    
    		for (int i = 1; i < 11; i++) {
    			Thread02 thread02 = new Thread02(i);
    			thread02.start();
    		}
    		System.out.println("main끝");
    	}
    }

     

     

     

    https://roadmap.sh/

     

    Developer Roadmaps - roadmap.sh

    Community driven roadmaps, articles and guides for developers to grow in their career.

    roadmap.sh

     

     

     

Designed by Tistory.