2014-04-14 165 views
0

我將.xls轉換爲.csv文件,代碼正常工作,但最終輸出的最後一個逗號會出現,我不想在代碼中輸入逗號,例如我的輸出看起來像SS,DD,EE,但我不需要最後的逗號,如何糾正它。convert .xls to .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

只是做AA preconstruct您的逗號和追加的狀態,在前面加上它 String szMyComma = ""; while (cellIterator.hasNext()) { cell = cellIterator.next(); .... cellDData.append(szMyComma + cell.getStringCellValue()); .... szMyComma = ","; }

0

只追加一個逗號,如果cellIterator.hasNext()是真的

+0

我試過你的想法,但我無法得到正確的輸出 – sakthi

+0

也許你沒有爲所有開關做它? –

0

試試這個

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

裏面你的第二個while循環,你總是調用某種形式的cellDData.append的(電池+ 「」);這是導致逗號總是被添加到最後的原因。

你可以在你面前做這個附加:

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

不幸的是,你必須每次打電話給你的switch語句中cellDData.append時間有這樣的檢查。更清潔的解決方案可能是將您的值存儲爲Object,然後在switch語句後調用cellDData.append。但是,在將您的值存儲爲對象之前,您應該測試以確定它是否會按預期的方式用於您的代碼。