2016-03-13 2 views
1

У меня есть рабочий лист Excel с некоторыми ячейками Text, который содержит надстрочный указатель и гиперссылку. Гиперссылку просто извлечь, но я не мог извлечь верхний индекс: /, программа обнаруживает его как обычный текст. "8^2 -> 82". My Excel with superscriptЧтение надстрочного текста excel с Apache POI в Java

Код

excel = WorkbookFactory.create(new File("filename.xlsx")); 
     Sheet hoja = excel.getSheetAt(4); 
     List<String> datos = new ArrayList<String>(); 

     List<String> links = new ArrayList<String>(); 

     //recorrido 
     Iterator<Row> filas = hoja.rowIterator(); 
     while (filas.hasNext()) { 
      Row fila = filas.next(); 
      Iterator<Cell> celdas = fila.cellIterator(); 
      while (celdas.hasNext()) { 
       Cell celda = celdas.next(); 
       System.out.print(celda.toString() + " || "); 
       datos.add(String.valueOf(celda)); 
       Hyperlink linkAddress = celda.getHyperlink(); 
       if (linkAddress != null) { 
        links.add(linkAddress.getAddress()); 
       } 
      } 
      System.out.println(); 
     } 

код показывает, как я whatching клетка содержит, только код зонда.

Я использую Apache POI 3.14.

+0

Вы проверили [эту аналогичную тему] (http://stackoverflow.com/questions/11499918/reading-superscript-and-subscript-in-excel-cell-using-apache-poi-in-java)? – Spidey

+0

Да! На самом деле я просто решил проблему с этим потоком! Я искал ответ yesterdey в течение нескольких часов, в том числе в стоп-потоке, но нет. Но когда я отправил вопрос, через несколько минут я нашел ответ! Благодарю. Вы знаете, как проверить вопрос «разрешен»? – Juanmi14

+0

Чтобы отметить вопрос как разрешенный, вы можете опубликовать код, который работал для вас как ответ и принять этот ответ. – Spidey

ответ

0

Я решил эту проблему, используя некоторые свойства RichTextString. Я создал два метода для извлечения значения и надстроки RichTextString ячейки. Чтобы получить значение, нам может потребоваться выполнить итерацию и конкатенацию всего содержимого String, кроме последнего. Последний - это полный надстрочный индекс.

private static String getValue(XSSFRichTextString cellContent){ 
    String value = ""; 
    for (int i = 0; i < cellContent.numFormattingRuns() - 1; i++) { 
     int lenVal = cellContent.getLengthOfFormattingRun(i); 
     int iVal = cellContent.getIndexOfFormattingRun(i); 
     value += cellContent.toString().substring(iVal, lenVal + iVal); 
    } 
    return value; 
} 
private static String getSuperScript(XSSFRichTextString cellContent) { 
    int lenSuper = cellContent.getLengthOfFormattingRun(cellContent.numFormattingRuns() - 1); 
    int iSuper = cellContent.getIndexOfFormattingRun(cellContent.numFormattingRuns() - 1); 
    return cellContent.toString().substring(iSuper, lenSuper + iSuper); 
} 

Он получает от 8^1 -> значение = 8, например, superScript = 1. Или из примера «сверху»^A, B »-> value =« пример надстроки », superScript =« A, B ».

+0

Это работает специально для вашего конкретного случая использования. Вы сказали, вы получили это от ответа SO. Не могли бы вы предоставить ссылку на этот ответ? Возможно, это будет более общим. –

+0

Здесь вы: [ссылка] (http://svn.apache.org/repos/asf/poi/trunk/src/java/org/apache/poi/hssf/extractor/ExcelExtractor.java) – Juanmi14