DefaultHandler를 가지고 Handler 구성 읽은 엑셀파일 내용을 List<String []> rows 에 저장

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.ss.usermodel.BuiltinFormats;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.xssf.model.SharedStringsTable;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * Created by shea on 2018/10/12.
 */
public class MyHandler extends DefaultHandler {
    enum xssfDataType {
        BOOL, ERROR, FORMULA, INLINESTR, SSTINDEX, NUMBER,
    }
    /**
     * Table with styles
     */
    private StylesTable stylesTable;

    private SharedStringsTable sharedStringsTable;
    private int minColumnCount;

    private boolean vIsOpen;

    private xssfDataType nextDataType;

    private short formatIndex;
    private String formatString;
    private DataFormatter formatter;

    private int thisColumn = -1;
    // The last column printed to the output stream
    private int lastColumnNumber = -1;

    // Gathers characters as they are seen.
    private StringBuffer value;
    private String[] record;
    private List<String[]> rows = new ArrayList<String[]>();
    private boolean isCellNull = false;
    private SimpleDateFormat sdf = null;
    private static DecimalFormat df = new DecimalFormat("###########");


    //构造器
    public MyHandler(StylesTable styles,
                              SharedStringsTable strings, int cols) {
        this.stylesTable = styles;
        this.sharedStringsTable = strings;
        this.minColumnCount = cols;
        this.value = new StringBuffer();
        this.nextDataType = xssfDataType.NUMBER;
        this.formatter = new DataFormatter();
        record = new String[this.minColumnCount];
        rows.clear();
    }

    public void startElement(String uri, String localName, String name,
                             Attributes attributes) throws SAXException {

        if ("inlineStr".equals(name) || "v".equals(name)) {
            vIsOpen = true;
            value.setLength(0);
        }
        // c => cell
        else if ("c".equals(name)) {
            // Get the cell reference
            String r = attributes.getValue("r");
            int firstDigit = -1;
            for (int c = 0; c < r.length(); ++c) {
                if (Character.isDigit(r.charAt(c))) {
                    firstDigit = c;
                    break;
                }
            }
            thisColumn = nameToColumn(r.substring(0, firstDigit));

            // Set up defaults.
            this.nextDataType = xssfDataType.NUMBER;
            this.formatIndex = -1;
            this.formatString = null;
            String cellType = attributes.getValue("t");
            String cellStyleStr = attributes.getValue("s");
            if ("b".equals(cellType))
                nextDataType = xssfDataType.BOOL;
            else if ("e".equals(cellType))
                nextDataType = xssfDataType.ERROR;
            else if ("inlineStr".equals(cellType))
                nextDataType = xssfDataType.INLINESTR;
            else if ("s".equals(cellType))
                nextDataType = xssfDataType.SSTINDEX;
            else if ("str".equals(cellType))
                nextDataType = xssfDataType.FORMULA;
            else if (cellStyleStr != null) {
                // It's a number, but almost certainly one
                // with a special style or format
                int styleIndex = Integer.parseInt(cellStyleStr);
                XSSFCellStyle style = stylesTable.getStyleAt(styleIndex);
                this.formatIndex = style.getDataFormat();
                this.formatString = style.getDataFormatString();
                if (this.formatString == null)
                    this.formatString = BuiltinFormats
                            .getBuiltinFormat(this.formatIndex);
            }
        }

    }

    public void endElement(String uri, String localName, String name)
            throws SAXException {

        String thisStr = null;

        // v => contents of a cell
        if ("v".equals(name)) {
            // Process the value contents as required.
            // Do now, as characters() may be called more than once
            switch (nextDataType) {

                case BOOL:
                    char first = value.charAt(0);
                    thisStr = first == '0' ? "FALSE" : "TRUE";
                    break;

                case ERROR:
                    thisStr = "\"ERROR:" + value.toString() + '"';
                    break;

                case FORMULA:
                    // A formula could result in a string value,
                    // so always add double-quote characters.
                    thisStr = value.toString();
                    break;

                case INLINESTR:
                    // TODO: have seen an example of this, so it's untested.
                    XSSFRichTextString rtsi = new XSSFRichTextString(
                            value.toString());
                    thisStr =rtsi.toString();
                    break;

                case SSTINDEX:
                    String sstIndex = value.toString();
                    try {
                        int idx = Integer.parseInt(sstIndex);
                        XSSFRichTextString rtss = new XSSFRichTextString(
                                sharedStringsTable.getEntryAt(idx));
                        thisStr = rtss.toString();
                    } catch (NumberFormatException ex) {
                        System.out.println("Failed to parse SST index '" + sstIndex
                                + "': " + ex.toString());
                    }
                    break;

                case NUMBER:
                    String n = value.toString();
                    if (formatIndex == 14 || formatIndex == 31 || formatIndex == 57 || formatIndex == 58
                            || (176<=formatIndex && formatIndex<=178) || (182<=formatIndex && formatIndex<=196)
                            || (210<=formatIndex && formatIndex<=213) || (208==formatIndex ) ) {// 日期
                        sdf = new SimpleDateFormat("yyyy-MM-dd");
                        Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(Double.parseDouble(n));
                        thisStr=sdf.format(date);
                    } else if (formatIndex == 20 || formatIndex == 32 || formatIndex==183 || (200<=formatIndex && formatIndex<=209)) {//时间
                        sdf = new SimpleDateFormat("HH:mm");
                        Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(Double.parseDouble(n));
                        thisStr = sdf.format(date);
                    }
                    else{
                         if(n.contains("E")){
                             String[] split = n.split("\\+");
                             String e = split[0].replaceAll("E|e", "");
                             thisStr=e.replace(".","");
                        }else {
                             thisStr = n;
                         }
                    }
                    break;
                default:
                    thisStr = "(TODO: Unexpected type: " + nextDataType + ")";
                    break;
            }
            if (lastColumnNumber == -1) {
                lastColumnNumber = 0;
            }
            if (thisStr == null || "".equals(isCellNull)) {
                isCellNull = true;
            }
            record[thisColumn] = thisStr;
            if (thisColumn > -1)
                lastColumnNumber = thisColumn;
        } else if ("row".equals(name)) {
            // Print out any missing commas if needed
            if (minColumnCount > 0) {
                // Columns are 0 based
                if (lastColumnNumber == -1) {
                    lastColumnNumber = 0;
                }
                if(record!=null &&record.length!=0){
                    rows.add(record.clone());
                    isCellNull = false;
                    for (int i = 0; i < record.length; i++) {
                        record[i] = null;
                    }
                }
            }
            lastColumnNumber = -1;
        }

    }

    public List<String[]> getRows() {
        return rows;
    }

    public void setRows(List<String[]> rows) {
        this.rows = rows;
    }

    public void characters(char[] ch, int start, int length)
            throws SAXException {
        if (vIsOpen)
            value.append(ch, start, length);
    }

    private int nameToColumn(String name) {
        int column = -1;
        for (int i = 0; i < name.length(); ++i) {
            int c = name.charAt(i);
            column = (column + 1) * 26 + c - 'A';
        }
        return column;
    }
}

 

저장해둔 핸들러 rows의 데이터를 받아와서 처리

 

		FileInputStream fis= new FileInputStream(fullFilePath);
            
    		OPCPackage opc = null;
    		opc = OPCPackage.open(fis);
    		XSSFReader xssfReader = null;

    		xssfReader = new XSSFReader(opc);
    		SharedStringsTable sst = xssfReader.getSharedStringsTable();
    		XMLReader parser = fetchSheetParser(sst);
    		XSSFReader.SheetIterator itr = (SheetIterator) xssfReader.getSheetsData();
    		StylesTable styles = xssfReader.getStylesTable();
    		ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(opc);
    		
    		
    		//MyHandler handler = new MyHandler(styles, sst, minColumns);
    		
    		MyHandler handler = new MyHandler(styles,sst,70);
    		
    		while(itr.hasNext()){

    			InputStream sheetStream = itr.next();
    			
    			String shtName = itr.getSheetName();

    			if(shtName.equals("리스트")){
    				InputSource sheetSource = new InputSource(sheetStream);
    	    		
    	    		SAXParserFactory saxFactory = SAXParserFactory.newInstance();
    				SAXParser saxParser = null;;
    				saxParser = saxFactory.newSAXParser();
    	    		
    	    		parser.setContentHandler(handler);
    				
    				
    				//SheetHandler sheetListHanler = new SheetHandler(sst,styles);
    				//saxParser.parse(sheetSource, sheetListHanler);
    				
    				parser.parse(sheetSource);
    				
    				sheetStream.close();
    				
    				
    			}
    		}
    		
    		
//    		List<NewVO> list = inputModVo(dataList);
    		List<NewVO> list = new ArrayList<NewVO>();
    		
    		List<String[]> dataList = handler.getRows();

Posted by 샤린냥
2016. 11. 14. 09:10
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Main {
  static String url = "jdbc:oracle:thin:@localhost:1521:javaDemo";
  static String username = "username";
  static String password = "welcome";
  public static void main(String[] args) throws Exception {
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn = DriverManager.getConnection(url, username, password);

    String sql = "SELECT name, description, image FROM pictures ";
    PreparedStatement stmt = conn.prepareStatement(sql);
    ResultSet resultSet = stmt.executeQuery();
    while (resultSet.next()) {
      String name = resultSet.getString(1);
      String description = resultSet.getString(2);
      File image = new File("D:\\java.gif");
      FileOutputStream fos = new FileOutputStream(image);

      byte[] buffer = new byte[1];
      InputStream is = resultSet.getBinaryStream(3);
      while (is.read(buffer) > 0) {
        fos.write(buffer);
      }
      fos.close();
    }
    conn.close();
  }
}


Posted by 샤린냥
2016. 11. 14. 09:09
import java.io.File;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class Main {
  public static void main(String[] argv) throws Exception {
    File file = new File("myimage.gif");
    FileInputStream fis = new FileInputStream(file);
    Class.forName("oracle.jdbc.driver.OracleDriver");
    Connection conn = DriverManager.getConnection(
        "jdbc:oracle:thin:@//server.local:1521/prod", "scott", "tiger");
    conn.setAutoCommit(false);
    PreparedStatement ps = conn
        .prepareStatement("insert into images values (?,?)");
    ps.setString(1, file.getName());
    ps.setBinaryStream(2, fis, (int) file.length());
    ps.executeUpdate();
    ps.close();
    fis.close();

  }
}


Posted by 샤린냥

일단 환경을 SPRING / MYBATIS / ORACLE  을 사용하였다.


실제 실행은 spring scheduler 를 사용하여 주단위로 DB에 해당 정보를 갱신하는 부분이었으나 이번 글에서는 

TXT 파일 저장 후  저장한 TXT 파일을  ORACLE DB에 BLOB 형태로 INSERT 까지 하는 부분까지만 적을 예정입니다.


REST API에서 값 요청하는 부분은 생략을 하고 TXT파일 저장 후 해당 TXT 파일을 BYTE[]   array 형태로 DB에 Insert 할 예정이다.


vo 처리

----------------------------------------------------------------------------------------------------------------------


public class blobVO {

private byte[] txtfile;

public byte[] getTxtfile() {

return txtfile;

}

public void setTxtfile(byte[] txtfile) {

this.txtfile = txtfile;

}

}


아래 부분은 실제 파일 저장 및 DB에 데이터를  Insert등 부분을 처리하는 service impl 내의 내용이다.

-----------------------------------------------------------------------------------------------------------------------

//저장할 파일명

String filename = "테스트.txt";


try {

//저장할 파일명으로 파일 생성하는 부분   FileWriter의 파일명 다음의 false는 false로 했을경우 해당 파일에 새로운 데이터를 덮어씨는 부분이고 true 처리를 할경우 이미 있는 데이터에 현재 데이터를 append한다.

//테스트txt.파일에 쓸 내용

String data = "파일에 쓰기";


BufferedWriter fw = new BufferedWriter(new FileWriter(filename, false));

fw.write(sb.toString());

      fw.flush();

fw.close();

} catch (Exception e) {

System.out.println("파일쓰기 오류");

}


blobVO vo = new blobVO;

//위에서 저장했던 파일 InputStream 사용하여 가져오기

File file = new File(filename);

InputStream is = new FileInputStream(file);

//Inputstream 읽은 데이타를 byte[] 형태로 변환

byte[] targetArray = IOUtils.toByteArray(is);


//vo에 데이터 담기

vo.setTxtfile(targetArray);

//DB에 데이터 INSERT TRY CATCH 처리를 해줘야 한다.

//dao에 insert를 처리하는 부분은... 별다를게 없어서 생략하였다.

dao.insertHotspotdata(hotspotData);

'Java' 카테고리의 다른 글

Read BLOBs data from database  (0) 2016.11.14
Insert an Image  (0) 2016.11.14
java 배열 내 문자열 확인  (0) 2016.10.04
대용량 엑셀파일 업로드 excel upload  (4) 2016.09.22
[Tomcat] UTF-8 한글 처리  (0) 2016.04.08
Posted by 샤린냥

sigcdArray 배열 안에 value 값 포함 여부를 검사한다.


boolean result = Arrays.asList(sigcdArray).contains(value);

Posted by 샤린냥

java에서는 엑셀파일을 읽을때 대용량 엑셀 같은 경우에는 메모리 이슈(out of memory)가 발생하는 경우가 많다

그래서 이번에는 대용량 엑셀파일 처리하는 걸 올릴려고 한다.


여기서 부터 실제 코딩 


//엑셀파일 읽어서 저장할 List

List<String[]> dataList = null;

OPCPackage opc = null;


opc = OPCPackage.open(file);

XSSFReader xssfReader = null;

xssfReader = new XSSFReader(opc);

XSSFReader.SheetIterator itr = (SheetIterator) xssfReader.getSheetsData();

StylesTable styles = xssfReader.getStylesTable();

ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(opc);

dataList = new ArrayList<String[]>();

while(itr.hasNext()){

InputStream sheetStream = itr.next();

InputSource sheetSource = new InputSource(sheetStream);

//Sheet2ListHandler은 엑셀 data를 가져와서 SheetContentHandler(Interface)를 재정의 해서 만든 Class

        //String[] 배열을 몇개 사용할지 숫자

Sheet2ListHandler sheet2ListHandler = new Sheet2ListHandler(dataList, 22);     //

ContentHandler handler = new XSSFSheetXMLHandler(styles, strings, sheet2ListHandler, true);

SAXParserFactory saxFactory = SAXParserFactory.newInstance();

SAXParser saxParser = null;;

saxParser = saxFactory.newSAXParser();

//sax parser 방식의 xmlReader를 생성

XMLReader sheetParser = saxParser.getXMLReader();

//xml reader에 row와 cell 이벤트를 생성하는 핸들러를 설정한 후.

sheetParser.setContentHandler(handler);

//위에서 Sheet 별로 생성한 inputSource를 parsing합니다.

//이 과정에서 handler는 row와 cell이벤트를 생성하고 생성된 이벤트는 sheet2ListHandler 가 받아서

처리합니다.

sheetParser.parse(sheetSource);

  sheetStream.close();

}



//Sheet2ListHandler     

public class Sheet2ListHandler implements SheetContentsHandler {


private boolean firstCellOfRow = false;

private int currentCol = -1;

//collection 객체

private List<String[]> rows;


//collection에 추가될 객체 startRow에서 초기화함

private String[] row;

//collection 내 객체를 String[]로 잡았기 때문에 배열의 길이를 생성시 받도록 설계

private int columnCnt;

//cell 이벤트 처리 시 해당 cell의 데이터가 배열 어디에 저장되야 할지 가리키는 pointer

private int currColNum = 0;

//외부 collection 과 배열 size를 받기 위해 추가한 부분입니다.

public Sheet2ListHandler(List<String[]> rows, int columnsCnt) {

this.rows = rows;

this.columnCnt = columnsCnt;

}

//Row의 시작 부분에서 발생하는 이벤트를 처리하는 method

@Override

public void startRow(int rowNum) {

this.row = new String[columnCnt];

currColNum = 0;

}


//Row의 끝에서 발생하는 이벤트를 처리하는 method

@Override

public void endRow(int rowNum) {

//cell 이벤트에서 담아놓은 row String[]를 collection에 추가

//데이터가 하나도 없는 row는 collection 추가하지 않도록 조건 추가

boolean addFlag = false;

for(String data:row){

if(!"".equals(data)){

addFlag = true;

}

}

if(addFlag)rows.add(row);

}


//cell 이벤트 발생 시 해당 cell의 주소와 값을 받아옴.

@Override

public void cell(String cellReference, String formattedValue, XSSFComment comment) {

// 엑셀 내용중 비어있는 셀은 제외하고 쓰여지기 때문에 아래와 같이 체크후 빈셀은 ""로 채워서 자리를 채워줌

int thisCol = (new CellReference(cellReference)).getCol();

int missedCols = thisCol - currentCol - 1;

   for (int i=0; i<missedCols; i++) {

       row[currColNum++] = "";

   }

   currentCol = thisCol;

  row[currColNum++] = formattedValue == null ? "":formattedValue;

    }

@Override

public void headerFooter(String text, boolean isHeader, String tagName) {

}


'Java' 카테고리의 다른 글

JAVA SPRING + MYBATIS + ORACLE TXT 파일 BLOB 형태로 DB에 INSERT  (0) 2016.11.01
java 배열 내 문자열 확인  (0) 2016.10.04
[Tomcat] UTF-8 한글 처리  (0) 2016.04.08
이클립스 jdk 경로 지정  (0) 2016.04.07
이클립스 SVN 설치  (0) 2013.07.24
Posted by 샤린냥

1. JSP 파일 화면 상단 처리

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>


2. 톰켓 server.xml 파일 설정

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" >


포트 설정하는 부분에 URIEncoding="UTF-8"  이부분을 추가한다.

'Java' 카테고리의 다른 글

java 배열 내 문자열 확인  (0) 2016.10.04
대용량 엑셀파일 업로드 excel upload  (4) 2016.09.22
이클립스 jdk 경로 지정  (0) 2016.04.07
이클립스 SVN 설치  (0) 2013.07.24
이클립스 마켓 설치 방법  (0) 2013.07.24
Posted by 샤린냥

이클립스 ini 환경설정 파일에 아래 내용을 추가


-vm

C:/Develop/Java/jdk1.8.0_11/bin/javaw.exe

'Java' 카테고리의 다른 글

java 배열 내 문자열 확인  (0) 2016.10.04
대용량 엑셀파일 업로드 excel upload  (4) 2016.09.22
[Tomcat] UTF-8 한글 처리  (0) 2016.04.08
이클립스 SVN 설치  (0) 2013.07.24
이클립스 마켓 설치 방법  (0) 2013.07.24
Posted by 샤린냥
2013. 7. 24. 10:51

Menu -> Help -> Eclipse Marketplace 선택




svn을 검색 후 Subversive - SVN Team Provider 설치한다.


이클립스 재구동후 SVN Kit를 체크 설치 해준다.









'Java' 카테고리의 다른 글

java 배열 내 문자열 확인  (0) 2016.10.04
대용량 엑셀파일 업로드 excel upload  (4) 2016.09.22
[Tomcat] UTF-8 한글 처리  (0) 2016.04.08
이클립스 jdk 경로 지정  (0) 2016.04.07
이클립스 마켓 설치 방법  (0) 2013.07.24
Posted by 샤린냥

이클립스에 마켓이 없을시 설치 방법입니다.

 

Menu -> Help -> Install New Software... 선택



Add 버튼을 누른후 이름은 아무거나 선택 

Location -> http://marketplace.eclipse.org/repo


Marketplace Client 체크 후 Next


이클립스 메뉴 Help -> Eclipse Marketplace 실행






'Java' 카테고리의 다른 글

java 배열 내 문자열 확인  (0) 2016.10.04
대용량 엑셀파일 업로드 excel upload  (4) 2016.09.22
[Tomcat] UTF-8 한글 처리  (0) 2016.04.08
이클립스 jdk 경로 지정  (0) 2016.04.07
이클립스 SVN 설치  (0) 2013.07.24
Posted by 샤린냥
이전버튼 1 이전버튼