달력

62025  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

http://okjsp.pe.kr/seq/122183

jxl은 대용량데이터를 엑셀문서를 통해 입력할때 속도가 빠릅니다.
단점은 엑셀형식으로 데이터를 받았을때 제대로 된 엑셀이 아니라 조작이 좀 그렇습니다.
반대로 poi는 데이터를 엑셀문서로 다운받았을때 제대로 된 엑셀문서라 현업들이 바로 조작하고 사용하기가 편합니다.
하지만 데이터를 넣을때 소량은 상관없지만 수만개이상넣을때..좀 느립니다.
그래서 저도 지금까지 4,5번해봤지만 데이터를 넣을때는 jxl로 데이터를 받을때는 poi로 합니다.
Posted by marryjane
|

http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10102&eid=X3/YQCPY9/+a9yR4FpqEJlYn4mNSb0LE&qb=anhsIMDMuczB9g==&pid=fK8I1soi5Uhssb7go4ssss--154326&sid=SM85U5giz0gAAFizEvo

테스트는 안해봤음.

import java.awt.Graphics;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
import jxl.*;
import java.io.*;
import java.sql.*;

public class Test3 {
    //frame의 내부무명클래스의 메서드에서 사용할수 있게 전역변수로 설정함
    javax.swing.ImageIcon icon = null;    


    public void excel2(){
        try{
            Workbook workbook = null;
            Sheet sheet = null;
           
            workbook = Workbook.getWorkbook(new File("excel/test.xls"));//엑셀파일 위치입니다.
           
            sheet = workbook.getSheet(0);
           
            //이미지 갯수를 카운트합니다
            for(int i=0;i<sheet.getNumberOfImages();i++) {
                //가지고 오는 이미지의 사이즈 체크
                if(sheet.getDrawing(i).getImageData().length>0) {
                    //이미지 파일을 생성하고 for문 종료합니다.
                    icon = new javax.swing.ImageIcon(sheet.getDrawing(i).getImageData());
                    break;
                }
            }
           
            javax.swing.JFrame frame = new javax.swing.JFrame(){
                //paint메소드 상속하여 구현해줌....icon은 Test3 클래스의 icon입니다.
                public void paint(java.awt.Graphics g) {
                    g.drawImage(icon.getImage(), 0, 0, this);
                }

            };
           
            frame.setSize(500, 500);
           
            frame.setDefaultCloseOperation(javax.swing.JFrame.DISPOSE_ON_CLOSE);
           
            frame.setVisible(true);


        }catch(Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Test3().excel2();
    }
}

Posted by marryjane
|

Java POI 예제소스

java 2008. 8. 26. 11:13

/**
* 작성자 : litwave
* 작성일 : 2008. 08. 21
* 참고 Site :
*   http://poi.apache.org/hssf/quick-guide.html#Autofit
*   http://poi.apache.org/apidocs/index.html
*   http://blog.naver.com/btchae?Redirect=Log&logNo=80005156571
*/

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.Region;

public class ExcelFormatAdapter {
  private HSSFWorkbook wb;
  private HSSFSheet [] sheets;

  private final int ROW_POSITION = 1;
  private final int COL_POSITION = 1;

  public ExcelFormatAdapter(String[] sheetNames, String title, String author, String[] header, int [] length) {
    wb = new HSSFWorkbook();
    sheets = new HSSFSheet[sheetNames.length];
    for(int index=0; index < sheetNames.length; index++) {
      sheets[index] = wb.createSheet(sheetNames[index]);
      makeHeader(index, title, author, header, length);
    }
  }

  public void makeTailCell(int sheetIndex, int rowIndex, int valueCount, String currentDate) {
    int dataRowIndex = ROW_POSITION + 3 + rowIndex;
    HSSFRow row = sheets[sheetIndex].createRow(dataRowIndex);

    // 데이터 를 입력한다.
    for(int index=0; index < valueCount; index++) {
      if(index == valueCount -1) {
        createTailCell(row, COL_POSITION + index, "출력일자 : " + currentDate);
      } else {
        createTailCell(row, COL_POSITION + index, "");
      }
    }
  }


  /**
   * 마지막에 출력할 출력일자 셀을 설정한다.
   * @param row
   * @param column
   * @param value
   */
  private void createTailCell(HSSFRow row, int column, String value) {
    HSSFCell cell = row.createCell((short)column);
    HSSFRichTextString richValue = new HSSFRichTextString(value);
    cell.setCellValue(richValue);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellStyle(getTailStyle());
  }

  private HSSFCellStyle getTailStyle() {
    // font를 설정한다.
    HSSFFont font = wb.createFont();
    font.setFontHeightInPoints((short) 10);
    font.setFontName("돋움");

    HSSFCellStyle style = wb.createCellStyle();
    style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
    style.setFont(font);
    style.setBorderTop(HSSFCellStyle.BORDER_THIN);

    return style;
  }


  public void makeDataCell(int sheetIndex, int rowIndex, String [] values) {
    int dataRowIndex = ROW_POSITION + 3 + rowIndex;
    HSSFRow row = sheets[sheetIndex].createRow(dataRowIndex);

    // 데이터 를 입력한다.
    for(int index=0; index < values.length; index++) {
      createDataCell(row, COL_POSITION + index, values[index]);
    }
  }

  /**
   * 데이터 셀을 설정한다.
   * @param row
   * @param column
   * @param value
   */
  private void createDataCell(HSSFRow row, int column, String value) {
    HSSFCell cell = row.createCell((short)column);
    HSSFRichTextString richValue = new HSSFRichTextString(value);
    cell.setCellValue(richValue);
//    cell.setCellStyle(getDataStyle());
  }

  private HSSFCellStyle getDataStyle() {
    // font를 설정한다.
    HSSFFont font = wb.createFont();
    font.setFontHeightInPoints((short) 10);
    font.setFontName("돋움");

    HSSFCellStyle style = wb.createCellStyle();
    style.setAlignment(HSSFCellStyle.ALIGN_LEFT);

    style.setFont(font);

    return style;
  }

  private void makeHeader(int sheetIndex, String title, String author, String[] header, int [] length) {
    HSSFRow row = sheets[sheetIndex].createRow(ROW_POSITION);
    // Title을 만들어 준다.
    createTitleCell(row, COL_POSITION, title);
    sheets[sheetIndex].addMergedRegion(new Region(ROW_POSITION, (short)COL_POSITION, ROW_POSITION, (short)header.length));

    // 작성자 셀을 설정한다.
    row = sheets[sheetIndex].createRow(ROW_POSITION + 1);
    createAuthorCell(row, COL_POSITION + header.length -1, "작성자 : " + author);

    sheets[sheetIndex].setColumnWidth((short)0, (short) ( ( 50 * 1 ) / ( (double) 1 / 20 )));

    // 데이터 Header를 입력한다.
    row = sheets[sheetIndex].createRow(ROW_POSITION + 2);
    for(int index=0; index < header.length; index++) {
      sheets[sheetIndex].setColumnWidth((short)(COL_POSITION + index), (short) ( ( 50 * length[index] ) / ( (double) 1 / 20 )));
      createHeaderCell(row, COL_POSITION + index, header[index]);
    }
  }

  /**
   * Header 셀을 설정한다.
   * @param row
   * @param column
   * @param value
   */
  private void createHeaderCell(HSSFRow row, int column, String value) {
    HSSFCell cell = row.createCell((short)column);
    HSSFRichTextString richValue = new HSSFRichTextString(value);
    cell.setCellValue(richValue);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellStyle(getHeaderStyle());
  }

  private HSSFCellStyle getHeaderStyle() {
    // font를 설정한다.
    HSSFFont font = wb.createFont();
    font.setFontHeightInPoints((short) 10);
    font.setFontName("돋움");
    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    font.setColor(wb.getCustomPalette().findSimilarColor((byte)0x00, (byte)0x00, (byte)0x00).getIndex());


    HSSFCellStyle style = wb.createCellStyle();
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

    style.setFont(font);

    style.setFillForegroundColor(wb.getCustomPalette().findSimilarColor((byte)0x99, (byte)0xCC, (byte)0xFF).getIndex());
    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
    style.setBorderTop(HSSFCellStyle.BORDER_THIN);

    return style;
  }

  /**
   * 작성자 셀을 설정한다.
   * @param row
   * @param column
   * @param value
   */
  private void createAuthorCell(HSSFRow row, int column, String value) {
    HSSFCell cell = row.createCell((short)column);
    HSSFRichTextString richValue = new HSSFRichTextString(value);
    cell.setCellValue(richValue);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellStyle(getAuthorStyle());
  }

  private HSSFCellStyle getAuthorStyle() {
    // font를 설정한다.
    HSSFFont font = wb.createFont();
    font.setFontHeightInPoints((short) 10);
    font.setFontName("돋움");

    HSSFCellStyle style = wb.createCellStyle();
    style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
    style.setFont(font);

    return style;
  }

  /**
   * 제목 셀을 설정한다.
   * @param row
   * @param column
   * @param value
   */
  private void createTitleCell(HSSFRow row, int column, String value) {
    HSSFCell cell = row.createCell((short)column);
    HSSFRichTextString richValue = new HSSFRichTextString(value);
    cell.setCellValue(richValue);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellStyle(getTitleStyle());
  }

  private HSSFCellStyle getTitleStyle() {
    // font를 설정한다.
    HSSFFont font = wb.createFont();
    font.setFontHeightInPoints((short) 14);
    font.setFontName("돋움");
    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
    font.setColor(wb.getCustomPalette().findSimilarColor((byte)0xFF, (byte)0xFF, (byte)0xFF).getIndex());


    HSSFCellStyle style = wb.createCellStyle();
    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

    style.setFont(font);

    style.setFillForegroundColor(wb.getCustomPalette().findSimilarColor((byte)0x00, (byte)0x80, (byte)0x80).getIndex());
    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

    return style;
  }

  public void write(OutputStream stream) throws IOException {
    wb.write(stream);
  }

  public static void main(String [] args) {
    String [] sheetNames = new String [] { "첫번째 시트" };
    String title = "타이틀";
    String author = "litwave";
    String createDate = "2008. 08. 21(목)";
    String [] header = new String [] { "제목 1", "제목2", "제목3" };
    int [] length = new int [] { 10, 15, 8 };

    ExcelFormatAdapter excelAdapter = new ExcelFormatAdapter(sheetNames, title, author, header, length);
    int index=0;
    for(; index < 10; index++) {
      excelAdapter.makeDataCell(0, index, new String [] { "data_" + index, "데이 터" + index, "테스트 " + index });
    }

    excelAdapter.makeTailCell(0, index, header.length, createDate);

    File f = new File("D:/Z02_temp/imsi/test.xls");
    FileOutputStream fos = null;
    try {
      fos = new FileOutputStream(f);
      excelAdapter.write(fos);

    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if(fos != null) try { fos.close(); } catch (IOException e) { }
    }
  }
}

'java' 카테고리의 다른 글

Connection Pool - DBCP  (0) 2008.09.01
ZK - Ajax but no JavaScript  (0) 2008.08.29
jdbc 1.0 ~ 3.0  (0) 2008.08.05
SI 프로젝트에서도 애자일 프로세스는 가능한가?  (0) 2008.07.28
HTTPClient 3.0  (0) 2008.07.25
Posted by marryjane
|

Sub changeFile()
    For i = 8 To ActiveWorkbook.Sheets.Count
        Worksheets(i).Select
        changeSheet (i)
    Next i
   
    'makeIndex
    deleteHeader
End Sub

Sub makeIndex()
    Worksheets(2).Select
   
    For i = ActiveWorkbook.Sheets.Count To 4 Step -1
        Rows("2:2").Select
        Selection.Copy
        Selection.Insert Shift:=xlDown
       
        Range("F3").Activate
        ActiveCell.FormulaR1C1 = Worksheets(i).Name
    Next i
End Sub

Sub changeSheet(idx As Integer)
   
    '레이아웃 편집
    Rows("1:2").Select
    With Selection
        .MergeCells = False
    End With
    Columns("A:A").Select
    Range("A2").Activate
    Selection.Delete Shift:=xlToLeft
    Columns("B:C").Select
    Selection.Insert Shift:=xlToRight
    Columns("F:F").Select
    Range("F3").Activate
    Selection.Insert Shift:=xlToRight
    Columns("I:J").Select
    Range("I3").Activate
    Selection.Insert Shift:=xlToRight
    Columns("M:Q").Select
    Selection.Insert Shift:=xlToRight
    Columns("M:Q").Select
    Selection.ColumnWidth = 2.3
    Range("B3").Select
    '속성정보 편집
    Columns("G:G").Select
    Range("G5").Activate
    Selection.Replace What:="X", Replacement:="C", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Selection.Replace What:="9", Replacement:="N", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False
    Columns("B:C").Select
    Selection.ColumnWidth = 3
    Columns("E:E").Select
    Selection.Copy
    Columns("D:D").Select
    Selection.Insert Shift:=xlToRight
    Columns("F:F").Select
    Selection.Delete Shift:=xlToLeft
    Columns("A:A").Select
    Selection.ColumnWidth = 3
    Columns("B:C").Select
    Selection.ColumnWidth = 6
    Columns("D:E").Select
    Selection.ColumnWidth = 20
    Columns("F:K").Select
    Selection.ColumnWidth = 3
    Columns("L:L").Select
    Selection.ColumnWidth = 35
    Columns("R:R").Select
    Selection.ColumnWidth = 15
   
    '비고필드 자동줄바꿈
    Columns("R:R").Select
    Range("R2").Activate
    With Selection
        .VerticalAlignment = xlCenter
        .WrapText = True
        .Orientation = 0
        .AddIndent = False
        .ShrinkToFit = False
        .ReadingOrder = xlContext
    End With
   
    '첫번째시트에서 타이틀 카피
    Worksheets(1).Select
    Rows("1:7").Select
    Range("A7").Activate
    Selection.Copy
    Worksheets(idx).Select
    Rows("1:1").Select
    Selection.Insert Shift:=xlDown
    '타이틀 편집
    Range("E2:H2").Activate
    ActiveCell.FormulaR1C1 = "재무"
    Range("E3:H3").Activate
    ActiveCell.FormulaR1C1 = ""
    Range("A9").Select
    Selection.Copy
    Range("A9").Select
    Range("E4:H4").Select
    ActiveSheet.Paste
    Range("L4").Select
    ActiveCell.FormulaR1C1 = ""
    Range("R2").Select
    ActiveCell.FormulaR1C1 = "재무"
    Range("R3").Select
    ActiveCell.FormulaR1C1 = ""
    Range("R4").Select
    ActiveCell.FormulaR1C1 = Worksheets(idx).Name
    Rows("8:10").Select
    Selection.Delete Shift:=xlToUp
   
    Columns("A:A").Select
    Range("A1").Activate
    With Selection.Font
        .Size = 10
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
    End With
    ActiveWindow.Zoom = 85
   
End Sub

Sub deleteHeader()
    For i = 8 To ActiveWorkbook.Sheets.Count
        Worksheets(i).Select
        Rows("8:21").Select
        Selection.Delete Shift:=xlToUp
       
        Range("A8").Select
        ActiveCell.FormulaR1C1 = "1"
    Next i
End Sub

Sub copyValue()
'값만 copy
    Range("A600").Activate
     Cells.Select
    Selection.Copy
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("A1").Select
    Application.CutCopyMode = False
    Range("s1").Select
End Sub


Sub copyValueSheet()
    For i = 8 To ActiveWorkbook.Sheets.Count
        Worksheets(i).Select
        copyValue
    Next i
End Sub

Sub all()
    For i = 8 To ActiveWorkbook.Sheets.Count
        Worksheets(i).Select
        copyValue
        editForm
    Next i
End Sub

Sub editSheet()
    For i = 8 To ActiveWorkbook.Sheets.Count
        Worksheets(i).Select
        editForm
    Next i
End Sub


Sub editForm()
    Columns("B:B").Select
    Selection.Delete Shift:=xlToLeft
    Columns("F:K").Select
    Selection.Delete Shift:=xlToLeft
    Columns("H:H").Select
    Selection.Delete Shift:=xlToLeft
    Columns("I:I").Select
    Selection.Delete Shift:=xlToLeft
    Columns("J:J").Select
    Selection.Delete Shift:=xlToLeft
    Columns("s:S").Select
    Selection.Delete Shift:=xlToLeft
    rowNumbering
End Sub

Sub rowNumbering()
'마지막 row까지
    For i = 8 To Range("A8").End(xlDown).Row
        Range("A" & i).Activate
        ActiveCell.FormulaR1C1 = i - 7
    Next i
End Sub

'formula xls 에서 문서ID, SEQ 와 MSGID, SEQ 를 가져와 LIST 로 만드는 함수
'파일다이얼로그창에서 적용할 파일을 선택해서 동작시킨다.
Sub xlsSeq()
    Dim Files As Variant
    Dim fileX As Variant
    Dim wb As Workbook
    Dim xlsSheet As Worksheet
    Dim listSheet As Worksheet

    Set listSheet = Worksheets("ID_SEQ_LIST_B3")
    
    Files = Application.GetOpenFilename(filefilter:="total Files(*.*),*.*", Title:="파일선택", MultiSelect:=True)
    For Each fileX In Files
        Set wb = Workbooks.Open(fileX)
        
        For m = 8 To wb.Sheets.Count
            Set xlsSheet = wb.Worksheets(m)
            Call getXlsSEQ(xlsSheet, listSheet)
        Next m
'파일 저장후 close
        wb.Save
        wb.Close
    Next fileX
    
End Sub


Private Sub getXlsSEQ(xlsWs As Worksheet, listWs As Worksheet)

    Dim xlsID  As String
    Dim msgID As String
    Dim listLastRow, xlsLastRow As Integer
    xlsLastRow = xlsWs.Range("A65535").End(xlUp).Row
    
    If Not (IsError(xlsWs.Range("P2").Value)) Then
        xlsID = xlsWs.Range("P2").Value
        msgID = xlsWs.Range("P4").Value
        
        '마지막 row까지
        For i = 8 To xlsLastRow
           listLastRow = listWs.Range("A65535").End(xlUp).Row + 1
           listWs.Cells(listLastRow, 1).Value = msgID
           listWs.Cells(listLastRow, 2).Value = xlsWs.Range("A" & i).Value
           listWs.Cells(listLastRow, 3).Value = xlsID
           listWs.Cells(listLastRow, 4).Value = xlsWs.Range("B" & i).Value
        Next i
    End If
End Sub


Sub editFormatIoCls()
    Dim Files As Variant
    Dim fileX As Variant
    Dim wb As Workbook
    
    Files = Application.GetOpenFilename(filefilter:="total Files(*.*),*.*", Title:="파일선택", MultiSelect:=True)
    For Each fileX In Files
        Set wb = Workbooks.Open(fileX)
        
        For m = 8 To wb.Sheets.Count
            wb.Worksheets(m).Select
            wb.Worksheets(m).Columns("M:M").Select
            Selection.Copy
'copy 한 columns 를 붙여넣기
            wb.Worksheets(m).Columns("T:T").Select
            Selection.Insert Shift:=xlToRight
            wb.Worksheets(m).Columns("M:M").Select
            Selection.Delete Shift:=xlToLeft
            wb.Worksheets(m).Columns("Q:Q").Select
            Selection.Insert Shift:=xlToRight
        Next m
        wb.Save
        wb.Close
    Next fileX
End Sub


Sub addFormula()
     Dim Files As Variant
    Dim fileX As Variant
    Dim wb As Workbook
    
    Files = Application.GetOpenFilename(filefilter:="total Files(*.*),*.*", Title:="파일선택", MultiSelect:=True)
    For Each fileX In Files
        Set wb = Workbooks.Open(fileX)
        
        For m = 8 To wb.Worksheets.Count
            wb.Worksheets(m).Select
            wb.Worksheets(m).Range("P2").Formula = "=VLOOKUP(P4, [000.0.macro.xls]ID_SEQ_LIST_B3!$E:$F, 2, FALSE)"
            Call addFormulaXlsSEQ(wb.Worksheets(m))
        Next m
        wb.Save
        wb.Close
    Next fileX
End Sub

Sub addFormulaXlsSEQ(xlsWs As Worksheet)
    Dim xlsLastRow As Integer
    
    If Not (IsError(xlsWs.Range("P2").Value)) Then
        With xlsWs
            xlsLastRow = Range("A65535").End(xlUp).Row
            Columns("E:E").Select
            Selection.Copy
            Selection.Insert Shift:=xlToRight
            Columns("E:E").Select
            Selection.Replace What:="_", Replacement:="", LookAt:=xlPart, _
                SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                ReplaceFormat:=False
            Range("B8").Select
            Application.CutCopyMode = False
'셀에 수식넣기
            ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[3],C30:C31, 2, FALSE)"
'Range 에 수식을 AutoFill
            If xlsLastRow > 8 Then
                Selection.AutoFill Destination:=Range("B8:B" & xlsLastRow)
            End If
            Range("B8:B" & xlsLastRow).Select
            Selection.Copy
            Range("B8").Select
'copy 한 selection 을 선택붙여넣기로 값만 넣기
            Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                :=False, Transpose:=False
            Columns("B:B").Select
'Find 로 문자열 #N/A 를 찾아 "" 로 replace 하기
            Selection.Replace What:="#N/A", Replacement:="", LookAt:=xlPart, _
                SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                ReplaceFormat:=False
            Columns("E:E").Select
            Selection.Delete Shift:=xlToLeft
        End With
    Else
        xlsWs.Range("A8").Select
    End If
End Sub


'시트명 (msgid) 변경
Sub changeSheetsName()
    Dim Files As Variant
    Dim fileX As Variant
    Dim wb As Workbook
    
    Files = Application.GetOpenFilename(filefilter:="total Files(*.*),*.*", Title:="파일선택", MultiSelect:=True)
    For Each fileX In Files
        Set wb = Workbooks.Open(fileX)
        Call changeSheetName(wb)
        Call changeMsgId(wb)
        wb.Save
        wb.Close
    Next fileX

End Sub

Private Sub changeSheetName(wb As Workbook)
    For i = 1 To wb.Worksheets.Count
        If i < 8 Then
            If i = 1 Or i = 6 Or i = 7 Then
                With wb.Worksheets(i)
                    .Select
                    Columns("F:F").Select
                    Selection.Replace What:="B30", Replacement:="B3", LookAt:=xlPart, _
                        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
                        ReplaceFormat:=False
                End With
            End If
        Else
            wb.Worksheets(i).Name = Left(wb.Worksheets(i).Name, 2) & Right(wb.Worksheets(i).Name, 4)
        End If
    Next i
End Sub


Private Sub changeMsgId(wb As Workbook)
    For i = 8 To wb.Worksheets.Count
        With wb.Worksheets(i)
            .Select
'Formula 와 FormulaR1C1 의 차이점. Formula 로 수식을 넣을 때, 따옴표처리는 Chr(34)
            Range("P4").Formula = "=REPLACE(CELL(" & Chr(34) & "filename" & Chr(34) & ",A1),1,FIND(" & Chr(34) & "]" & Chr(34) & ",CELL(" & Chr(34) & "filename" & Chr(34) & ",A1))," & Chr(34) & "" & Chr(34) & ")"
        End With
    Next i
End Sub

시트 카피
Sheets("B200003").Select
Sheets("B200003").Copy After:=Sheets(ActiveWorkbook.Sheets.Count)
ActiveSheet.Name = "B200004"
시트명 변경
Sheets("B200003").Name = "ABC"

Posted by marryjane
|

Jakarta POI - 쓰기

java 2005. 11. 30. 01:12

III. Formula(수식) 지원

엑셀을 읽고 쓸때 수식을 지원합니다.
org.apache.poi.hssf.usermodel.HSSFCell의 setCellFormula("formulaString") 메쏘드는 스프레드시트에 수식을 추가하는데 사용되며 getCellFormula() 메쏘드는 수식을 대표하는 문자열을 해석하는데 사용됩니다. 하지만 엑셀에서 사용하는 수식을 모두 사용 할 수는 없습니다.

 

지원되는 부분
-. 셀 참조, 시트참조, 지역참조
-. 상대적 혹은 절대적 참조
-. 수연산 및 논리연산
-. 시트 혹은 매크로 함수

-. 수식 결과값 반환

 

부분적 지원
문자열을 포함하는 수식을 해석할 수는 있지만 문자열값을 반환하는 수식은 아직 지원하지 않습니다.

지원되지 않는 부분

-. 배열 수식
-. 1진법 수식
-. 3D 참조
-. 에러 값 (cells containing #REF's or #VALUE's)


VII. 엑셀 쓰기예제

쓰기도 역시 읽기와 비슷합니다.

엑셀 워크북을 생성합니다. 행과 셀을 생성하려면 당연한 절차겠죠?

HSSFWorkbook workbook = new HSSFWorkbook();

시트를 생성합니다.

시트명을 파라미터로 바로 생성 합니다.

HSSFSheet sheet = workbook.createSheet("sheet name");

만약 한글로 시트명을 만들려면 다음과 같이 인코딩이 필요합니다.

HSSFSheet sheet = workbook.createSheet();
workbook.setSheetName( 0 , "한글" , HSSFWorkbook.ENCODING_UTF_16 );

셀에 사용할 스타일을 미리 생성해 둡니다.

HSSFCellStyle style = wb.createCellStyle();
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBottomBorderColor(HSSFColor.BLACK.index);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setLeftBorderColor(HSSFColor.GREEN.index);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setRightBorderColor(HSSFColor.BLUE.index);
style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);
style.setTopBorderColor(HSSFColor.BLACK.index);

등 여러가지 스타일을 만들 수 있습니다.

스타일은 다음 주소를 참고하세요
http://jakarta.apache.org/poi/apidocs/org/apache/poi/hssf/usermodel/HSSFCellStyle.html

로우를 하나 생성합니다.

HSSFRow row = sheet.createRow(0);

셀츨 하나 생성하여 스타일을 주고 값을 입력합니다.

HSSFCell cell = row.createCell((short)0);
cell.setCellStyle(style);
cell.setCellValue("jakarta project!");

만약 한글을 입력한다면 인코딩 해야 하며 값 세팅전에 해야 합니다.

cell.setEncoding(HSSFCell.ENCODING_UTF_16);  //한글 처리
cell.setCellStyle(style);
cell.setCellValue("자카드타 프로젝트!");

모든 셀이 다 입력되었으면 파일을 만듭니다.

FileOutputStream fs = new FileOutputStream("excelfile.xls");
workbook.write(fs);
fs.close();

VIII. 쓰기샘플 소스

<%@ page language="java" contentType="text/html;charset=euc-kr" %>
<%@ page import="java.io.*" %>
<%@ page import="org.apache.poi.poifs.dev.*" %>
<%@ page import="org.apache.poi.hssf.record.*" %>
<%@ page import="org.apache.poi.hssf.record.formula.*" %>
<%@ page import="org.apache.poi.hssf.model.*" %>
<%@ page import="org.apache.poi.hssf.usermodel.*" %>
<%@ page import="org.apache.poi.hssf.util.*" %>


<html>
<body>

<%

    String filepath = "C:\\Tomcat 5.0\\webapps\\ROOT\\write.xls";


    try {

        String[] cell_value = {"자카르타","프로젝트","www.jakartaproject.com"};


        HSSFWorkbook workbook = new HSSFWorkbook();


        HSSFSheet sheet = workbook.createSheet();
        workbook.setSheetName(0 , "한글명" ,HSSFWorkbook.ENCODING_UTF_16);


        HSSFCellStyle style = workbook.createCellStyle();
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBottomBorderColor(HSSFColor.BLACK.index);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setLeftBorderColor(HSSFColor.GREEN.index);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setRightBorderColor(HSSFColor.BLUE.index);
        style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);
        style.setTopBorderColor(HSSFColor.BLACK.index);           


        HSSFRow row = sheet.createRow(0);
        for (int i = 0 ; i < cell_value.length; i++){
            HSSFCell cell = row.createCell((short)i);
            cell.setEncoding(HSSFCell.ENCODING_UTF_16);
            cell.setCellStyle(style);
            cell.setCellValue(cell_value[i]);
        }
           
        FileOutputStream fs = null;
        try {
            fs = new FileOutputStream(filepath);
            workbook.write(fs);
        } catch (Exception e) {
        } finally {
            if (fs != null) fs.close();
        }
       
    } catch (Exception e) {
%>
        Error occurred:  <%= e.getMessage() %>
<%  
        e.printStackTrace();
    }   
   
%>

</body>
</html>


자 결과화면 입니다.

사용자 삽입 이미지


성공!
위의 소스를 기본으로 한다면 그리 어렵지 않을겁니다 ^^

참고로 셀병합은

HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("new sheet");

HSSFRow row = sheet.createRow((short) 1);
HSSFCell cell = row.createCell((short) 1);
cell.setCellValue("This is a test of merging");

//셀병합
//Region(int 시작row, short 시작col, int 종료row, short 종료col)
sheet.addMergedRegion(new Region(1,(short)1,1,(short)2));

FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();

와 같이하면 됩니다.

'java' 카테고리의 다른 글

리소스 누수현상  (0) 2006.02.21
java.sql.SQLException: IO 예외 상황: Broken pipe - thread  (0) 2006.01.31
이미지포함된 워드 파일 다운로드 시  (0) 2005.11.30
Jakarta POI - 읽기  (0) 2005.11.30
스케쥴러 구현  (0) 2005.11.30
Posted by 알 수 없는 사용자
|

Jakarta POI - 읽기

java 2005. 11. 30. 00:12

http://poi.apache.org/index.html
http://blog.naver.com/levin01.do?Redirect=Log&logNo=100011049989


I. POI 란?

일반적으로 POI가 엑셀파일을 쓰는 컴퍼넌트로 알려져 있으나 POI는 프로젝트 이름입니다.
즉 POI는 Microsoft Format File을 액세스 할 수 있는 API를 제공합니다. (한마디로 자바에서 MS파일을 읽고 쓸수있도록 지원합니다.)

POI안에는 여러 컴퍼넌트들이 있습니다.

POIFS
Microsoft의 OLE2 포맷 형식의 문서를 자바로 읽고 쓸수 있는 컴퍼넌트입니다
기본적으로 POI의 모든 컴퍼넌트들이 POIFS를 사용합니다.
HSSF
Microsoft의 엑셀파일을 읽고 쓸수 있도록 지원하는 컴퍼넌트입니다.
HWPF
Microsoft의 워드파일을 읽고 쓸수 있도록 지원하는 컴퍼넌트입니다.
이 컴퍼넌트는 디자인 초기단계입니다.
HPSF
Microsoft의 OLE2 포맷 형식의 문서 속성을 어플리케이션에서 사용 할수 있도록 지원하는 컴퍼넌트입니다.
현재 읽기 기능만 제공합니다

워드파일을 핸들링 하는 HWPF는 초기단계라 사용을 못하지만 기대는 되는군요 ^^

ps. 영어사전을 찾아보니 poi는 하와이의 토란 요리를 뜻하더군요.
우리나라말로 하니 자카르타 토란 프로젝트 쯤 될라나? ㅎㅎ

II. 다운로드 및 설치
다운로드 받으러 갑시다~!
http://jakarta.apache.org/site/downloads/downloads_poi.cgi

현재 2.5.1버젼입니다.
다운받은 파일을 압축을 풀면 *.jar 파일들이 있을겁니다 이 파일들을 자신의 어플리케이션 /lib/에 복사합시다

POI API http://jakarta.apache.org/poi/apidocs/index.html

Quick Guide http://jakarta.apache.org/poi/hssf/quick-guide.html

III. Formula(수식) 지원에 관해..

엑셀을 읽고 쓸때 수식을 지원합니다.
org.apache.poi.hssf.usermodel.HSSFCell의 setCellFormula("formulaString") 메쏘드는 스프레드시트에 수식을 추가하는데 사용되며 getCellFormula() 메쏘드는 수식을 대표하는 문자열을 해석하는데 사용됩니다. 하지만 엑셀에서 사용하는 수식을 모두 사용 할 수는 없습니다.

지원되는 부분
-. 셀 참조, 시트참조, 지역참조
-. 상대적 혹은 절대적 참조
-. 수연산 및 논리연산
-. 시트 혹은 매크로 함수
-. 수식 결과값 반환

부분적 지원
문자열을 포함하는 수식을 해석할 수는 있지만 문자열값을 반환하는 수식은 아직 지원하지 않습니다.

지원되지 않는 부분
-. 배열 수식
-. 1진법 수식
-. 3D 참조
-. 에러 값 (cells containing #REF's or #VALUE's)

IV. 기본객체

가장 기본이되는 객체가 다음 4가지 입니다. 이름에서 무엇을 뜻하는지 대강 짐작 할 수 있겠죵?

HSSFWorkbook - 엑셀 워크북을 말합니다.
HSSFSheet - 엑셀 쉬트를 나타냅니다.
HSSFRow - 엑셀에서 특정 행입니다.
HSSFCell - 엑셀에서 특정 행에대한 특정 셀입니다

위 4가지 객체는 앞으로 계속 나올겁니다. 눈여겨 미리 봐 둡시다. @.@

V. 엑셀 읽기 예제

POSFS을 이용하여 엑셀 워크북을 생성합니다.

POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("excelfile.xls"));
HSSFWorkbook workbook = new HSSFWorkbook(fs);

생성된 워크북을 이용하여 시트 수만큼 돌면서 엑셀 시트 하나씩을 생성합니다.

int sheetNum = workbook.getNumberOfSheets();

for (int k = 0; k < sheetNum; k++) {
   System.out.println("Sheet Number : "+k);

   System.out.println(Sheet Name : " + workbook.getSheetName(k));
   HSSFSheet sheet = workbook.getSheetAt(k);

}

생성된 시트를 이용하여 그 행의 수만큼 돌면서 행을 하나씩 생성합니다.

int rows = sheet.getPhysicalNumberOfRows();

for (int r = 0; r < rows; r++) {
   HSSFRow row   = sheet.getRow(r);

   System.out.println("Row : "+row.getRowNum());

}

역시나 생성된 행을 이용하여 그 셀의 수만큼 돌면서 셀을 하나씩 생성합니다.

int cells = row.getPhysicalNumberOfCells();

for (short c = 0; c < cells; c++) {              <--!! short 형입니다. 255개가 max!
    HSSFCell cell  = row.getCell(c);

    int celltype = cell.getCellType();

    ...

}

셀을 생성하여 셀 타입에 따라 처리를 해주면 끝~

주의사항

만약 엑셀에서 A열에 아무런 값이 없으면 그 행은 읽지 못합니다.
행을 읽지 못하니 셀또한 처리 할 수 없습니다

VI. 엑셀읽기 샘플소스

샘플 데이터

사용자 삽입 이미지

A열은 B열에 대한 셀 타입을 나타내며 C열은 D열에대한 셀 타입을 나타냅니다.
즉 B:1 의 123456의 셀 타입은 A:1 일반 이라는 것이며 마찬가지로
D:1의 2005-02-09의 셀타입은 C:1 사용자정의로 세팅하였다는 겁니다

이 엑셀의 데이터를 다음 소스로 읽어 보겠습니다.

<%@ page
language="java"
contentType="text/html;charset=euc-kr"
import="java.io.*,
 org.apache.poi.poifs.filesystem.POIFSFileSystem,
 org.apache.poi.hssf.record.*,
 org.apache.poi.hssf.model.*,
 org.apache.poi.hssf.usermodel.*,
 org.apache.poi.hssf.util.*" %>


<html>
<head><title>Read example</title></head>
<body>

<%

  String excelfile = "C:\\Tomcat 5.0\\webapps\\ROOT\\example.xls";

  try {
       POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(excelfile));


       //워크북을 생성!               

       HSSFWorkbook workbook = new HSSFWorkbook(fs);

       int sheetNum = workbook.getNumberOfSheets();


       for (int k = 0; k < sheetNum; k++) {


            //시트 이름과 시트번호를 추출
%>

            <br><br>
            Sheet Number <%= k %> <br>
            Sheet Name <%= workbook.getSheetName(k) %><br>
<%
            HSSFSheet sheet = workbook.getSheetAt(k);
            int rows = sheet.getPhysicalNumberOfRows();


            for (int r = 0; r < rows; r++) {


                // 시트에 대한 행을 하나씩 추출
                HSSFRow row   = sheet.getRow(r);
                if (row != null) {
                     int cells = row.getPhysicalNumberOfCells();
%>
                     ROW  <%= row.getRowNum() %> <%=cells%></b><br>
<%

                     for (short c = 0; c < cells; c++) {


                         // 행에대한 셀을 하나씩 추출하여 셀 타입에 따라 처리
                         HSSFCell cell  = row.getCell(c);
                         if (cell != null) {
                              String value = null;

                              switch (cell.getCellType()) {

                                   case HSSFCell.CELL_TYPE_FORMULA :
                                       value = "FORMULA value=" + cell.getCellFormula();
                                        break;
                                   case HSSFCell.CELL_TYPE_NUMERIC :
                                       value = "NUMERIC value=" + cell.getNumericCellValue(); //double
                                       break;
                                  case HSSFCell.CELL_TYPE_STRING :
                                       value = "STRING value=" + cell.getStringCellValue(); //String
                                       break;
                                  case HSSFCell.CELL_TYPE_BLANK :
                                      value = null;
                                     break;
                                 case HSSFCell.CELL_TYPE_BOOLEAN :
                                     value = "BOOLEAN value=" + cell.getBooleanCellValue(); //boolean
                                    break;
                                case HSSFCell.CELL_TYPE_ERROR :
                                     value = "ERROR value=" + cell.getErrorCellValue(); // byte
                                     break;
                                default :
                             }
%>        
                          <%= "CELL col=" + cell.getCellNum() + " VALUE=" + value %> <br>
<%
                        }
                    }
                }
            }
       }
   } catch (Exception e) {
%>
       Error occurred:  <%= e.getMessage() %>
<%  
       e.printStackTrace();
    }

%>


</body>
</html>

위 소스의 결과입니다.

Sheet Number 0
Sheet Name 한글
ROW 0 4
CELL col=0 VALUE=STRING value=일반
CELL col=1 VALUE=NUMERIC value=123456.0
CELL col=2 VALUE=STRING value=사용자정의
CELL col=3 VALUE=NUMERIC value=38392.0
ROW 1 4
CELL col=0 VALUE=STRING value=숫자
CELL col=1 VALUE=NUMERIC value=123456.0
CELL col=2 VALUE=STRING value=날짜 (yy-m-d h:mm)
CELL col=3 VALUE=NUMERIC value=38393.0
ROW 2 4
CELL col=0 VALUE=STRING value=통화
CELL col=1 VALUE=NUMERIC value=123456.0
CELL col=2 VALUE=STRING value=날짜 (yy年 mm月 dd日)
CELL col=3 VALUE=NUMERIC value=38394.0
ROW 3 4
CELL col=0 VALUE=STRING value=텍스트
CELL col=1 VALUE=NUMERIC value=123456.0
CELL col=2 VALUE=STRING value=날짜 (yyyy년 mm월 dd일)
CELL col=3 VALUE=NUMERIC value=38395.0


결과를 보니 사용자가 지정한 셀 타입에 관계없이 숫자관련 셀은 POI에서 모두 숫자 타입으로 인식해 버렸습니다.날짜 역시 지정한 셀 타입에 관계없이 모두 숫자 타입으로 인식해 버리는군요!
그럼 어떻게 날짜를 제대로 표현할까요?
날짜 타입을 제대로 나타내기 위해서는 날짜 Cell에는 getDateCellValue()를 사용하면 정상적으로 처리 할 수 있습니다.

SimpleDateformat sdf = new SimpleDateformat("yyyy-MM-dd hh:mm");
String date = sdf.format(cell.getDateCellValue());

등을 이용하면 나타내고자 하는 알짜를 표현 하기 더 쉽겠지요 나머지 수식을 가져 올때도 마찬가지입니다. 이런 사항을 도표로 나타내보았습니다.

org.apache.poi.hssf.usermodel.HSSFCell 에는 모두 6가지의 Cell Type이 있는데, cell.getCellType()을 하면 그 셀의 반환값을 알 수 있으며 그에 상응하는 static 필드타입은 다음과 같습니다.

셀타입 필드타입

함수

함수반환값
0 CELL_TYPE_NUMERIC

getNumericCellValue()
-> 숫자 타입일때
getDateCellValue()
-> 날짜 타입일때

double

Date

1 CELL_TYPE_STRING

getStringCellValue()

String
2 CELL_TYPE_FORMULA

getCellFormula()
-> 수식자체를 가져올때
getNumericCellValue()
-> 수식 반환값이 숫자일때
getStringCellValue()
-> 수식 반환값이 문자일때

String

double

String

3 CELL_TYPE_BLANK

4 CELL_TYPE_BOOLEAN

getBooleanCellValue()

boolean
5 CELL_TYPE_ERROR

getErrorCellvalue()

byte

'java' 카테고리의 다른 글

Jakarta POI - 쓰기  (0) 2005.11.30
이미지포함된 워드 파일 다운로드 시  (0) 2005.11.30
스케쥴러 구현  (0) 2005.11.30
JavaMail 을 이용하여 pop3로 메일 가져오기  (1) 2005.11.30
정규식  (0) 2005.11.30
Posted by 알 수 없는 사용자
|