2016-05-06 3 views
4

autoSizeColumn метод POI бросает исключение, которое я так и не удалось решить:Android POI: сбой при использовании autoSizeColumn()

"java.lang.ClassNotFoundException: Didn't find class "java.awt.font.FontRenderContext" on path:..." 

с этой ошибкой

"java.lang.NoClassDefFoundError: Failed resolution of: Ljava/awt/font/FontRenderContext;" 

Вот мой код, то метод вызывается после помещения данных в колонку:

private boolean saveExcelFile(Context context, String fileName) { 

    if (!isExternalStorageAvailable() || isExternalStorageReadOnly()) { 
     Log.e("ExcelLog", "Storage not available or read only"); 
     return false; 
    } 

    boolean success = false; 

    Cell c; 

    Workbook wb = new HSSFWorkbook(); 

    CellStyle cs = wb.createCellStyle(); 
    cs.setFillForegroundColor(HSSFColor.LIGHT_ORANGE.index); 
    cs.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 

    Sheet sheet1; 
    sheet1 = wb.createSheet("Historique du "+date); 

    MultiFormatWriter writer = new MultiFormatWriter(); 
    Bitmap ImageBitmap; 

    CreationHelper helper = wb.getCreationHelper(); 

    Drawing drawing = sheet1.createDrawingPatriarch(); 

    Row row = sheet1.createRow(0); 

    c = row.createCell(0); 
    c.setCellValue("Quantité"); 
    c.setCellStyle(cs); 

    c = row.createCell(1); 
    c.setCellValue("Code barre"); 
    c.setCellStyle(cs); 

    c = row.createCell(2); 
    c.setCellValue("Association"); 
    c.setCellStyle(cs); 

    int m = 0; 
    for(int k=0;k<ExpListDistribs.size();++k) { 
     int l = 0; 
     for (int n = 0; n < ExpListDistribs.get(k).getDistribs().size()*2; n++) { 
      while(l<ExpListDistribs.get(k).getDistribs().size()) { 
       if (isOdd(m)) { 
        row = sheet1.createRow(m + 1); 
        row.setHeight((short)800); 
        m++; 
        c = row.createCell(0); 
        c.setCellValue(""); 
       } else { 
        ClientAnchor anchor = helper.createClientAnchor(); 
        row = sheet1.createRow(m + 1); 
        row.setHeight((short)1200); 
        c = row.createCell(0); 
        c.setCellStyle(style); 
        c.setCellValue(ExpListDistribs.get(k).getDistribs().get(l).getQuantite()+" kg"); 
        c = row.createCell(2); 
        c.setCellStyle(style); 
        c.setCellValue(ExpListDistribs.get(k).getAssociation()); 

        l++; 
        int t = wb.addPicture(bytes, Workbook.PICTURE_TYPE_PNG); 
        anchor.setCol1(1); 
        anchor.setCol2(2); 
        anchor.setRow1(m + 1); 
        anchor.setRow2(m + 2); 
        m++; 
        drawing.createPicture(anchor, t); 
       } 
      } 
     } 
    } 

    sheet1.setColumnWidth(0, (15 * 200)); 
    sheet1.setColumnWidth(1, (15 * 800)); 
    sheet1.autoSizeColumn(2); 

    File file = new File(context.getExternalFilesDir(null), fileName); 
    FileOutputStream os = null; 

    try { 
     os = new FileOutputStream(file); 
     wb.write(os); 
     Log.w("FileUtils", "Writing file" + file); 
     success = true; 
    } catch (IOException e) { 
     Log.w("FileUtils", "Error writing " + file, e); 
    } catch (Exception e) { 
     Log.w("FileUtils", "Failed to save file", e); 
    } finally { 
     try { 
      if (null != os) 
       os.close(); 
     } catch (Exception ignored) { 
     } 
    } 
    Toast.makeText(getApplicationContext(), "Success", 
      Toast.LENGTH_LONG).show(); 
    return success; 
} 

У кого-то есть ключ, который поможет мне от t его ?
Спасибо заранее.

ответ

3

Вы отметили этот андроид. На андроиде большинство (все?) Классов AWT недоступны. Но для расчета размеров столбцов для POI требуется FontRenderContext.

Как обходной путь, замените ваш звонок на autoSizeColumn(2) на setColumnWidth(2, width). Приблизительное значение для width может быть рассчитано путем подсчета максимального количества символов, отображаемых в этой строке. Начните с значения около 0.55 * fontSizeInPoints для пропорциональных шрифтов.

PS: В следующий раз, пожалуйста, предоставьте полную трассировку стека и укажите версии JDK и POI, которые вы используете.

+0

Большое спасибо, это решение работает! Таким образом, нет никакого смысла использовать autoSizeColumn в android? Извините, что не предоставил полную трассировку стека, я подумаю об этом в следующий раз. –

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