2016-08-20 6 views
0

Я пытаюсь использовать POI Apache для чтения файла excel, который будет иметь два столбца: название и язык. Заголовок будет иметь некоторые предложения на языке, языковой столбец будет пустым. После того, как Apache POI читает предложение в заголовке, он должен сохранить его в переменной, а затем вызвать библиотеку обнаружения языка (https://code.google.com/archive/p/language-detection/). Я особенно имея ошибку с линией, где имеет место утверждениеОшибка типа ячейки Apache POI

import java.util.ArrayList; 
import com.cybozu.labs.langdetect.Detector; 
import com.cybozu.labs.langdetect.DetectorFactory; 
import com.cybozu.labs.langdetect.Language; 
import java.util.Scanner; 
import com.cybozu.labs.langdetect.LangDetectException; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.util.Iterator; 

import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class LangDetectSample { 
    public static void main(String[] args) throws IOException, LangDetectException { 
     String excelFilePath = "C:\\LD\\Books.xlsx"; 
     FileInputStream inputStream = new FileInputStream(new File(excelFilePath)); 

     Workbook workbook = new XSSFWorkbook(inputStream); 
     Sheet firstSheet = workbook.getSheetAt(0); // Assuming that the data is sheet in one 
     Iterator<Row> iterator = firstSheet.iterator(); 
     DataFormatter formatter = new DataFormatter(); 

     LangDetectSample lang = new LangDetectSample(); 

     //creating variables 
     String title; 
     String language; 
     int rowNumber; 

     //Blank workbook 
     XSSFWorkbook wb = new XSSFWorkbook(); //new workbook //fixed 

     //Create a blank sheet 
     Sheet sheet1 = wb.createSheet("Predicted language"); //fixed 
     while (iterator.hasNext()) 
     { 
      Row nextRow = iterator.next(); 
      rowNumber = nextRow.getRowNum(); 
      Cell cell = nextRow.getCell(2); // title is in column 2 
      switch (cell.getCellType()) { 
       case Cell.CELL_TYPE_STRING: 
        title = cell.getStringCellValue(); 
        break; 
     case Cell.CELL_TYPE_BOOLEAN: 

     title = formatter.formatCellValue(cell); 
     break; 


     case Cell.CELL_TYPE_NUMERIC: 

     title = formatter.formatCellValue(cell); 
     break; 
      } 

      System.out.print(title); 

      //Title should now have the title. 
      // Call the language detector: 
      language = lang.detect(title); 
      System.out.println(lang); 

      // if language detected, attempt to output the result to the new excel file with the following commands: 

      // Write the title, language 

      Row row = sheet1.createRow(rowNumber); //changed var 
      Cell cell2 = row.createCell(2); //changed variable name 
      cell.setCellValue(title); 
      Cell cell3 = row.createCell(3); 
      cell.setCellValue(language); 
     } 
     try { 
      //Write the workbook in file system 
      FileOutputStream out = new FileOutputStream(new File("title-language.xlsx")); 
      workbook.write(out); 
      out.close(); 
     } catch (Exception e) 

     { 
      e.printStackTrace(); 
     } 
     workbook.close(); 
     inputStream.close(); 
    } 

    public void init(String profileDirectory) throws LangDetectException { 
     DetectorFactory.loadProfile(profileDirectory); 
    } 

    public String detect(String text) throws LangDetectException { 
     DetectorFactory.loadProfile("C:\\LD\\profiles"); 
     Detector detector = DetectorFactory.create(); 
     detector.append(text); 
     return detector.detect(); 
    } 

    public ArrayList detectLangs(String text) throws LangDetectException { 
     Detector detector = DetectorFactory.create(); 
     detector.append(text); 
     return detector.getProbabilities(); 
    } 
} 

Ошибка я получаю

переменного названия не может быть инициализирован

+1

Почему не только [использование DataFormatter. formatCellValue] (http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/DataFormatter.html#formatCellValue (org.apache.poi.ss.usermodel.Cell))? (как подсказывает большинство документов) – Gagravarr

+0

как я могу это сделать в моем случае? – karir

+0

Создайте объект DataFormatter за пределами цикла, а затем просто замените весь оператор switch вызовом 'formatter.formatCellValue' на вашей ячейке. – Gagravarr

ответ

0

для первой ошибки проверки булева , держать vaiable «Объект» класс, например

Object title; 

switch (cell.getCellType()) { 
case Cell.CELL_TYPE_BOOLEAN: 
     title = cell.getBooleanCellValue(); 
     break; 
} 

для второй ошибки, ява читает по умолчанию значения ячейки в «двойном» тип формата данных, так что вам нужно, чтобы преобразовать его в текст/String, используя следующий метод ...

Object title=""; 

title = new DecimalFormat("0").format(Cell.getNumericCellValue()); 

надеюсь, что это поможет ...

благодаря

+0

привет спасибо за это. Второй говорит, что нестатический метод getNumericCellValue() не может ссылаться на статический контекст, а для первого - не может найти значение переменной, что я должен создать эту переменную как? – karir

+0

Я отредактировал код, пожалуйста, попробуйте сейчас –

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