2013-12-12 3 views
0

Я пытаюсь использовать XLS2CSV для преобразования файла Excel в текстовый файл csv. Я немного изменил существующий класс, чтобы изменить PrintStream на Writer, чтобы я мог писать в файл с помощью FileWriter.FileWriter неожиданно останавливается

В любом случае, он записывает в System.out.PrintStream в порядке, все появляется. Но когда я открываю файл, последние несколько строк отсутствуют. Мое первое предположение заключалось в том, что приложение закрывало соединение, прежде чем оно могло завершить записи, но я использовал бесконечный цикл, чтобы попробовать его протестировать, но даже оставляя приложение открытым, он делает то же самое.

Есть ли у кого-нибудь идеи, почему это будет печатать на PrintStream в порядке, но не писать в файл? Я изменил FileWriter на CSVWriter и, казалось, написал меньше данных, поэтому я думаю, что он имеет какое-то отношение к закрытию соединения, но я довольно новичок в отношении ввода и вывода, поэтому любая помощь будет оценена.

Вот функциональный пример (вам нужно изменить имя файла для ввода и вывода)

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.Writer; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Iterator; 

import org.apache.poi.hssf.usermodel.HSSFDateUtil; 
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator; 
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.CellValue; 
import org.apache.poi.ss.usermodel.FormulaEvaluator; 
import org.apache.poi.ss.usermodel.Row; 

public class XLS2CSV { 
private InputStream in; 
private Writer out; 
private DateFormat dateFormat = new SimpleDateFormat("dd/MM/yy"); 

public XLS2CSV(InputStream in, Writer out) { 
    if (null == in) { 
     throw new IllegalArgumentException("in cannot be null."); 
    } 
    if (null == out) { 
     throw new IllegalArgumentException("out cannot be null."); 
    } 
    this.in = in; 
    this.out = out; 
} 

public void process() throws IOException { 
    process(in); 
} 

private void process(InputStream in) throws IOException { 
    HSSFWorkbook w = new HSSFWorkbook(in); 
    int numSheets = w.getNumberOfSheets(); 
    for (int i = 0; i < numSheets; i++) { 
     HSSFSheet sheet = w.getSheetAt(i); 
     int lastRow = 0; 
     for (Iterator rows = sheet.rowIterator(); rows.hasNext();) { 
      Row row = (Row) rows.next(); 
      int lastCol = 0; 
      for (Iterator cells = row.cellIterator(); cells.hasNext();) { 
       Cell cell = (Cell) cells.next(); 
       String cellValue = ""; 
       switch (cell.getCellType()) { 
       case Cell.CELL_TYPE_FORMULA: 
        FormulaEvaluator fe = new HSSFFormulaEvaluator(w); 
        CellValue v = fe.evaluate(cell); 
        switch (v.getCellType()) { 
        case Cell.CELL_TYPE_BOOLEAN: 
         cellValue = String.valueOf(v.getBooleanValue()); 
         break; 
        case Cell.CELL_TYPE_NUMERIC: 
         cellValue = String.valueOf(v.getNumberValue()); 
         break; 
        case Cell.CELL_TYPE_STRING: 
         cellValue = String.valueOf(v.getStringValue()); 
         break; 
        case Cell.CELL_TYPE_BLANK: 
         break; 
        case Cell.CELL_TYPE_ERROR: 
         break; 
         // CELL_TYPE_FORMULA will never happen 
        case Cell.CELL_TYPE_FORMULA: 
         break; 
        } 
        break; 
       case Cell.CELL_TYPE_NUMERIC: 
        if (HSSFDateUtil.isCellDateFormatted(cell)) { 
         Date date = cell.getDateCellValue(); 
         cellValue = dateFormat.format(date); 
        } else { 
         cellValue = String.valueOf(cell); 
        } 
        break; 
       default: 
        cellValue = String.valueOf(cell); 
       } 
       int cellIndex = cell.getColumnIndex(); 
       while (lastCol < cellIndex) { 
        System.out.print(","); 
        out.append(","); 
        lastCol++; 
       } 
       System.out.print(cellValue); 
       out.append(cellValue); 
      } 
      while (lastRow <= row.getRowNum()) { 
       System.out.println(); 
       out.append('\n'); 
       lastRow++; 
      } 
     } 
    } 
} 

public void setDateFormat(DateFormat dateFormat) { 
    if (null == dateFormat) { 
     throw new IllegalArgumentException("dateFormat cannot be null."); 
    } 
    this.dateFormat = dateFormat; 
} 

public DateFormat getDateFormat() { 
    return dateFormat; 
} 

public static void process(File file, Writer out) throws IOException { 
    FileInputStream fis = null; 
    try { 
     fis = new FileInputStream(file); 
     new XLS2CSV(new BufferedInputStream(fis), out).process(); 
    } finally { 
     if (null != fis) { 
      try { 
       fis.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

public static void main(String[] args) { 

    File xlsFile = new File("C:/Documents and Settings/berlgeof/Desktop/Commit Dates 12-10-2013.xls"); 
    if (!xlsFile.exists()) { 
     System.err.println("Not found or not a file: " + xlsFile.getPath()); 
     return; 
    } 

    Writer writer = null; 
    try { 
     writer = new FileWriter("lib/files/converted/Temp Commit Data.csv"); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    XLS2CSV xls2csv = null; 
    try { 
     xls2csv = new XLS2CSV(new FileInputStream(xlsFile), writer); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    try { 
     xls2csv.process(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

//  while(true) {} // Let me close the application 


} 

ответ

4

Вы не загораживая писатель, а это значит, что есть данные еще в буфере. Вы должны закрыть его (и все другие потоки и т. Д.) В блоках finally или использовать оператор try-with-resources, если вы используете Java 7.

Также обратите внимание, что способ, которым вы в настоящее время обрабатываете исключения должен в значительной степени игнорировать их и продолжать - а это значит, что после того, как одна вещь потерпит неудачу, вы почти наверняка получите еще один провал. Вырвите эти блоки try/catch и просто позвольте распространению распространения. (Заявите, что ваш метод main может выбросить IOException.)

+0

Стреляй! Я всегда забываю смывать и/или закрывать мои потоки. Обычно Eclipse предупреждает меня, что он никогда не закрывается, интересно, что его здесь нет. Спасибо за решение, я исправлю свою обработку исключений, в основном я занимался выяснением другой проблемы, но теперь, когда я работаю, я могу исправить обработку ошибок. Еще раз спасибо. – Geoff

Смежные вопросы