-
(국비교육) 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/
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/
[Java] Apache POI 간단 사용법 (velog.io)
■ TreeMap
이진트리를 기반으로 만든다.
hashmap 은 정렬이 안된다.
LinkedHashMap 을 사용하면 순서가 없던 hashmap 도 내가 적은 순서대로 출력을 시킬 수는 있다.
https://seeminglyjs.tistory.com/227
https://ratsgo.github.io/data%20structure&algorithm/2017/10/21/tree/
■ 스레드 (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끝"); } }
'개발 > 국비교육' 카테고리의 다른 글
(국비교육) 22 - 메모리 + UTF-8설정 + input type + (0) 2023.06.30 (국비교육) 21 - 스래드 + join + synchronized + 가사출력 + 네이버 화면 만들기 + 하이디 + AQueryTool + DB dto/dao + 싱글턴 (0) 2023.06.29 (국비교육) 18 - C언어 맛보기 + 예외처리 + Tomcat 다운로드 + 웹브라우저 만들어보기 + 중복클래스 (2) 2023.06.26 (국비교육) 17 - 2회 시험 + Mariadb 다운 + 자바와 데이터베이스 연결(+기능단위 쪼개기) (0) 2023.06.23 (국비교육) 16 - HeidiSQL + 열거타입 + collection + vector (0) 2023.06.22