if (v.getId() == R.id.button9) {
try {
Workbook wbDangqian = Workbook.getWorkbook(new File(getActivity().getFilesDir(), "sfyuan.xls"));
WritableWorkbook book2 = Workbook.createWorkbook(new File(getActivity().getFilesDir(), "sfyuan.xls"), wbDangqian);
WritableSheet sheetDangqian0 = book2.getSheet(0);
int xuhao;
xuhao = Integer.valueOf(sheetDangqian0.getCell(0, 0).getContents().toString());
xuhao=xuhao+1;
textView8.setText(String.valueOf(xuhao));
Label label1 = new Label(0, 0, String.valueOf(xuhao));
sheetDangqian0.addCell(label1);
book2.write();
book2.close();
wbDangqian.close();
} catch (Exception e) {
System.out.println(e);
}
}
我编写了一个android简易APP,我通过引入了一个包,可以用java来实现对excel表格数据的操作(被操作的excel数据文件放在手机的存储器里),上面的代码,我先读取表格sheet1第一行第一列单元格的内容,转化成整形数据后后加上1,然后再写回表格sheet1第一行第一列单元格,同时通过textView8来展示这个变化。奇了怪了,这个按钮点击10次后,点击第11次时程序就崩溃了,也就是说点击第1至第10次时,都能正常运行,点击第11次时程序就崩溃了,哪位给找找原因。
如果跟点击次数有关系,大概率是有内存泄漏
很可能前面点击都进了catch,导致资源并没有释放
关闭的操作,写到finally模块里。假如有异常的话,关闭逻辑不会执行。
book2.close();
wbDangqian.close();
你可以在try和catch中间加一个log。在logcat里面看一下抛出什么异常。但是你try里面有内容报错了。
打个断点 或者输出一下 看一下是不是 取的excel 行数超出了
try-catch加
finally(
book2.close();
wbDangqian.close();)
是源文件excel本身出了问题,重新建了一个源文件,问题就解决了。
是不是excel本身权限或者宏问题。获取单元格没有第十一个。可以输出日志到可以查看的地方
把点击11次的异常打印出来
前边的问题我也都看了,就不再询问,excel 一共有多少行数据? 是否考虑先将这个excel 读取到,然后再进行展示或者点击,减少重复读取excel的次数,也避免出现 读取超过行的空指针报错。
实在不行的话可以联系我远程看一下
可能是由于 Workbook 对象和 WritableWorkbook 对象未正确关闭引起的。在每次操作完 Excel 表格后,应确保调用 close() 方法来释放资源。
批量地读取excel表中的数据:
package com.dongmu;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.helpers.XSSFFormulaUtils;
import java.io.FileInputStream;
public class TestExcelRead {
public static void main(String[] args) throws Exception {
FileInputStream inputStream = new FileInputStream("D:\\word文档\\武汉理工大学\\过去文件夹\\通信1904班云动会参赛情况.xlsx");
Workbook workbook = new XSSFWorkbook(inputStream);
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(2);
int physicalNumberOfCells = row.getPhysicalNumberOfCells();
for (int i = 0; i < physicalNumberOfCells; i++) {
Cell cell = row.getCell(i);
String stringCellValue = cell.getStringCellValue();
System.out.print(stringCellValue+"| ");
}
System.out.println("一共"+physicalNumberOfCells+"列。");
int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();
for (int i = 4; i < physicalNumberOfRows; i++) {
Row row1 = sheet.getRow(i);
int physicalNumberOfCells1 = row1.getPhysicalNumberOfCells();
for (int i1 = 0; i1 < physicalNumberOfCells1; i1++) {
Cell cell = row1.getCell(i1);
if (cell!=null){
int cellType = cell.getCellType();
switch (cellType){
// case XSSFCell.
case XSSFCell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue()+"| ");
break;
case XSSFCell.CELL_TYPE_BLANK:
System.out.print("空值| ");break;
case XSSFCell.CELL_TYPE_BOOLEAN:
System.out.print(cell.getBooleanCellValue()+"| ");
break;
case XSSFCell.CELL_TYPE_FORMULA:
FormulaEvaluator formulaEvaluator = new XSSFFormulaEvaluator((XSSFWorkbook) workbook);
//获得计算公式
String cellFormula = cell.getCellFormula();
CellValue evaluate = formulaEvaluator.evaluate(cell);
String s = evaluate.formatAsString();
System.out.print(s+"| ");
break;
case XSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)){
System.out.print(cell.getDateCellValue()+"| ");
}else {
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
System.out.print(cell.getStringCellValue()+"| ");
}
break;
case XSSFCell.CELL_TYPE_ERROR:
System.out.print("数据类型错误| ");
break;
}
}
// System.out.println();
}
System.out.println();
}
}
}
你在try catch里面把错误的信息打印出来看具体是什么类型的错误。其次,如果跟使用次数有关系,那么你要检查下是否存在内存方面的问题,打开的文件流之类是否有及时关闭掉等等。检查下代码或者调试下看看。
根据你提供的代码和描述,这个崩溃的原因可能是:
每次点击按钮时,你都会创建一个新的 WritableWorkbook 来打开原来的 excel 文件。但前面的 WritableWorkbook 并没有关闭,所以会越积越多未关闭的 WritableWorkbook。
Excel 每个文件同一时刻只允许一个 WritableWorkbook 打开,多开会引发异常。
所以点击多次后,积累多个未关闭的 WritableWorkbook,超过 Excel 的限制就会崩溃。
可以修改代码,使每次点击只打开一个 WritableWorkbook,并在操作完成后立即关闭它:
WritableWorkbook book = null;
try {
book = Workbook.createWorkbook(new File(file));
// 你的其他代码
book.write();
} finally {
if(book != null) {
book.close();
}
}
另外也要关闭 wbDangqian,不要积累太多未关闭的 Workbook 对象。
这样每次点击只打开一个 WritableWorkbook,用完立即关闭,就可以避免崩溃的问题。
你的问题可能出在Excel文件的操作上,尤其是读取和写入的操作。你在每次点击按钮时都打开了Excel文件,并进行了读取和写入操作,然后再关闭。这种频繁的操作可能导致文件在某次读写操作中发生了错误,导致程序崩溃。
这个问题的解决方式有两个建议:
减少对Excel文件的频繁操作。例如,你可以在程序开始时打开文件,并在程序结束时关闭文件,而不是每次点击按钮时都打开和关闭。这样可以降低文件操作的频率,避免可能的错误。
增加错误处理机制。在文件操作的代码中增加try-catch语句,可以捕获并处理可能出现的错误,防止程序崩溃。你的代码中已经包含了一些错误处理,但可能还不够全面。你可以尝试增加更多的错误处理代码,例如处理文件打开失败、读取失败或写入失败的情况。
你可以修改你的代码,参考以下样例:
if (v.getId() == R.id.button9) {
Workbook wbDangqian = null;
WritableWorkbook book2 = null;
try {
wbDangqian = Workbook.getWorkbook(new File(getActivity().getFilesDir(), "sfyuan.xls"));
book2 = Workbook.createWorkbook(new File(getActivity().getFilesDir(), "sfyuan.xls"), wbDangqian);
WritableSheet sheetDangqian0 = book2.getSheet(0);
int xuhao = Integer.valueOf(sheetDangqian0.getCell(0, 0).getContents().toString());
xuhao = xuhao + 1;
textView8.setText(String.valueOf(xuhao));
Label label1 = new Label(0, 0, String.valueOf(xuhao));
sheetDangqian0.addCell(label1);
book2.write();
} catch (Exception e) {
System.out.println(e);
} finally {
if (book2 != null) {
try {
book2.close();
} catch (Exception e) {
System.out.println(e);
}
}
if (wbDangqian != null) {
try {
wbDangqian.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
}
这个修改的代码使用了try-finally语句,确保了无论是否发生异常,Workbook和WritableWorkbook都会被正确地关闭。这样做可以避免资源泄漏,有助于稳定程序运行。
最后,你也可以尝试打印更详细的异常信息,或者使用调试工具进行调试,这样可以帮助你更准确地找到问题的位置。