2014-04-14 2 views
0

.csv 파일로 .xls를 변환했습니다. 코드가 올바르게 작동하지만 마지막 출력이 마지막 쉼표로 표시됩니다. 내 코드에서 쉼표를 사용하고 싶지 않습니다. 예를 들어 내 출력 ss, dd, ee처럼 보이지만 마지막 쉼표가 필요하지 않습니다. 어떻게 수정합니까?.xls를 .csv java로 변환합니다.

여기에 코드

import java.io.*; 

import java.util.Iterator; 

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; 

import org.apache.poi.xssf.usermodel.XSSFSheet; 

import org.apache.poi.xssf.usermodel.XSSFWorkbook; 


class convert { 

    static void convertToXls(File inputFile, File outputFile) 
    { 
     // For storing data into CSV files 
     StringBuffer cellDData = new StringBuffer(); 
     String cellDDataString=null; 
     try 
     { 
      FileOutputStream fos = new FileOutputStream(outputFile); 

      // Get the workbook instance for XLS file 
      HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(inputFile)); 
      // Get first sheet from the workbook 
      HSSFSheet sheet = workbook.getSheetAt(0); 
      Cell cell; 
      Row row; 

      // Iterate through each rows from first sheet 
      Iterator<Row> rowIterator = sheet.iterator(); 
      while (rowIterator.hasNext()) 
      { 
      row = rowIterator.next(); 

      // For each row, iterate through each columns 
       System.out.println("row"+row); 

       Iterator<Cell> cellIterator = row.cellIterator(); 
       while (cellIterator.hasNext()) 
       { 
        cell = cellIterator.next(); 
        System.out.println("cell" +cell); 
        switch (cell.getCellType()) 
       { 

         case Cell.CELL_TYPE_BOOLEAN: 
         cellDData.append(cell.getBooleanCellValue() + ","); 
         break; 

         case Cell.CELL_TYPE_NUMERIC: 
         cellDData.append(cell.getNumericCellValue() + ","); 
         break; 

        case Cell.CELL_TYPE_STRING: 
        cellDData.append(cell.getStringCellValue() + ","); 
        System.out.println(cell.getStringCellValue()); 
        break; 

        case Cell.CELL_TYPE_BLANK: 
        cellDData.append("" + ","); 
        break; 

       default: 
       cellDData.append(cell + ","); 

       } 
      } 
     cellDData.append("\n"); 
     } 
     //cellDData.append("\n"); 


//String out=cellDData.toString(); 
//System.out.println("res"+out); 

//String o = out.substring(0, out.lastIndexOf(",")); 
//System.out.println("final"+o); 
fos.write(cellDData.toString().getBytes()); 
//fos.write(cellDDataString.getBytes()); 
fos.close(); 

} 
    catch (FileNotFoundException e) 
    { 
    System.err.println("Exception" + e.getMessage()); 
    } 
    catch (IOException e) 
    { 
     System.err.println("Exception" + e.getMessage()); 
    } 
} 



    public static void main(String[] args) 
    { 



    File inputFile = new File("Book1.xls"); 

    File outputFile = new File("output1.csv"); 

    convertToXls(inputFile, outputFile); 

    } 
    } 
+0

항상 쉼표 뒤에 항목이 추가되므로 예상됩니다. 프로세스가 완료되면 StringBuffer의 마지막 문자를 수동으로 잘라내거나 "마지막 항목이 아닌 경우에는 쉼표를 추가하고 그렇지 않으면 아무것도 추가하지 않습니다."와 같은 검사를 할 수 있습니다. – Kon

+0

어떻게해야할까요? 간단히 말해 주시겠습니까 – sakthi

답변

0

그냥 cellIterator.hasNext()에 해당하는 경우 String szMyComma = ""; while (cellIterator.hasNext()) { cell = cellIterator.next(); .... cellDData.append(szMyComma + cell.getStringCellValue()); .... szMyComma = ","; }

0

+0

그 아이디어를 시도했지만 여전히 정확한 출력을 얻을 수 없습니다 – sakthi

+0

아마 모든 스위치에 대해 그렇게하지 않고 있을까요? –

0

을 시도 쉼표를 추가하여 쉼표를위한 AA preconstruct을하고 APPEND의 상태를 앞에 추가 입력
cellDData.replace(cellDData.length() - 1, cellDData.length(), ""); 

ju 세인트 줄 앞에

두 번째의 내부
0
import java.io.*; 
import jxl.*;//libary file jxl-2.6.jar need to download 
import java.util.*; 

class ConvertCSV 
{ 
    public static void main(String[] args) 
    { 
    try 
    { 
     //File to store data in form of CSV 
     File f = new File("E:\\rajju.csv"); 

     OutputStream os = (OutputStream)new FileOutputStream(f); 
     String encoding = "UTF8"; 
     OutputStreamWriter osw = new OutputStreamWriter(os, encoding); 
     BufferedWriter bw = new BufferedWriter(osw); 

     //Excel document to be imported 
     String filename = "D:\\RAJAT\\tds.xls"; 
     WorkbookSettings ws = new WorkbookSettings(); 
     ws.setLocale(new Locale("en", "EN")); 
     Workbook w = Workbook.getWorkbook(new File(filename),ws); 

     // Gets the sheets from workbook 
     for (int sheet = 0; sheet < w.getNumberOfSheets(); sheet++) 
     { 
     Sheet s = w.getSheet(sheet); 

     bw.write(s.getName()); 
     bw.newLine(); 

     Cell[] row = null; 

     // Gets the cells from sheet 
     for (int i = 0 ; i < s.getRows() ; i++) 
     { 
      row = s.getRow(i); 

      if (row.length > 0) 
      { 
      bw.write(row[0].getContents()); 
      for (int j = 1; j < row.length; j++) 
      { 
       bw.write(','); 
       bw.write(row[j].getContents()); 
      } 
      } 
      bw.newLine(); 
     } 
     } 
     bw.flush(); 
     bw.close(); 
    } 
    catch (UnsupportedEncodingException e) 
    { 
     System.err.println(e.toString()); 
    } 
    catch (IOException e) 
    { 
     System.err.println(e.toString()); 
    } 
    catch (Exception e) 
    { 
     System.err.println(e.toString()); 
    } 
    } 
} 
+0

질문에 설명 된 문제를 해결하기 위해 수행 한 것에 대한 설명과 초점이 ​​좋을 것입니다. – Breeze

0

당신은 항상 cellDData.append의 형태를 호출하는 루프 동안 (셀 + ","); 이는 쉼표가 항상 끝에 추가되도록하는 원인입니다. 당신은 당신이 전에이 작업을 수행 할 수 있습니다

는 추가 :

if(cellIterator.hasNext()) { 
    cellDData.append(value + ","); 
} else { 
    cellDData.append(value); 
} 

불행하게도,이 체크 당신이 switch 문 내부 cellDData.append를 호출 할 때마다이해야합니다. 클리너 솔루션은 값을 Object로 저장 한 다음 switch 문 다음에 cellDData.append를 호출하는 것입니다. 그러나 값을 Object로 저장하기 전에 코드에서 예상대로 작동하는지 테스트해야합니다.