当前位置: 首页 > 面试题库 >

Android POI:使用autoSizeColumn()时崩溃

孙成益
2023-03-14
问题内容

autoSizeColumn POI方法引发了一个我无法解决的异常

 "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;
}

有人对此有任何帮助的线索吗?
提前致谢。


问题答案:

您已标记此android。在android上,大多数(所有?)AWT类都不可用。但是POI需要a FontRenderContext来计算列大小。

作为一种变通方法,代替您的来电autoSizeColumn(2)通过setColumnWidth(2, width)width可以通过将该列中显示的最大字符数乘以一个因子来计算的近似值。首先尝试0.55 * fontSizeInPoints为比例字体设置大约的值。

PS:下次,请提供完整的堆栈跟踪,并提及您使用的JDK和POI版本。



 类似资料:
  • 我使用getStringArrayListExtra()搜索将列表从一个活动传输到另一个活动。这在第一次(从MainActivity到Diag2Activity)时运行良好,但在第二次(从Diag2Activity到SSToActivity)时应用程序崩溃。 每次我使用相同的方法:第一次活动: 第二项活动: 谁能告诉我错误可能来自哪里?提前谢谢 请在下面找到完整的代码: 主要活动。JAVA } 主

  • 我正在尝试使用地址消毒剂与MSVC。 Visual Studio安装程序说我有“Visual Studio Community 2019”16.9.0版。 我有最基本的C++程序: cmakelists.txt也是非常基本的: 程序在调试和发布模式下都能正确地编译和链接。在发布模式下,我有以下警告,这似乎是完全合法的: LINK:warning LNK4302:请将“/debug”添加到LINK命

  • 问题内容: 我想每5分钟检查一次服务中的实际时间,然后根据时间将手机静音或取消静音。早些时候,我尝试在线程.sleep(300000)的末尾使用while(true),但是它总是与ANR一起崩溃,所以我尝试使用计时器任务,但是现在它在带有NullPointerException 的行之后崩溃 LogCat: 问题答案: 您需要在onCreate内初始化audioManager。

  • 我有一个非常奇怪的问题。 我所设置的是一个文件,它向雅虎财经网站发送一个url请求,然后使用结果在JFrame中绘制一个JFreeChart。 我就是不明白以下几点: 对于某些url请求,JFrame崩溃 它会启动,但只显示一个白色屏幕。而对于其他请求,我的程序运行良好。 例如: 本请求: 很好。 但是这个要求: 导致错误。 这怎么可能? 我知道以下几点: JFrame崩溃,但JVM没有注意到它(

  • 主要活动 碎片 这是一个简单对话框的代码。 这里有一个我从中学习的链接。如果我只需通过调用按钮创建对话框,它就可以完全正常工作。

  • 我在MacOS上创建了一个新的Android应用程序项目,当我试图在Android Studio中更改时,我遇到了这个错误。