读取Excel表格报错问题分析总结(用apache POI读取,表格稍微改动就报错导入不进去)

首先是建立在用apachePOI解析Excel时一定几率是能成功解析导入的,如果一点也不能的话,也可以参考看看我总结的原因,也许也是导致你屡次导入不能的原因之一。

       这个问题是前天客户反应的,不用下载的好的模版套进内容再导入的话就报错,怎么也导入不进去,客户即想用从其他直接导出的数据导入我们的产品中用想能自己复制一些其他的内容到自己建立的excel表格中导入进去。今天晚上特意抽出时间来总结一产生这个问题的几个原因。

       1、第一个原因就是,我最后发现我们的产品中excel导入这个组件(用apache POI实现)里边出现的问题,进一步跟踪,发现:

[java]  view plain  copy
  1. switch (cell.getCellType()) {        
  2.                 case HSSFCell.CELL_TYPE_STRING:        
  3.                     strCell = "'" +cell.getStringCellValue()+ "'";        
  4.                     break;        
  5.                 case HSSFCell.CELL_TYPE_NUMERIC:      
  6.                     if (HSSFDateUtil.isCellDateFormatted(cell)){  
  7.                         String temp = String.valueOf(sdf.format(cell.getDateCellValue()));  
  8.                         strCell="to_date('"+temp+"','yyyy_mm_dd')";  
  9.                           
  10.                     }else{  
  11.                         strCell = String.valueOf(cell.getNumericCellValue());    
  12.                         }  
  13.                      break;  
  14.                 }      

到了这个case匹配时就有错误了,但是就是没抛出异常信息,纳闷了,调试几次都是这样,看了官方的API文档:

getStringCellValue
java.lang.String getStringCellValue()
Get the value of the cell as a string

For numeric cells we throw an exception. For blank cells we return an empty string. For formulaCells that are not string Formulas, we throw an exception.

意思是如果单元格不是能解析的字符串格式的话,我们会抛出异常,为空的话就返回一个空字符串。看来不是调用getStringCellValue出的问题,不过一读取到为空的单元格时就出现这个问题。最后发现程序上没有写如果2种格式都匹配不上的情况(声明:这块代码不是我写的哦),于是加上:

[java]  view plain  copy
  1. <span style="font-size:18px;"default:strCell="''";</span>  

问题才解决了一个原因。

       2、第二个原因就是excel表格中日期类型的格式不对,应该选中日期所在列,右击点击菜单里的单元格格式,由常规设置为日期格式。

       3、第三个原因就是excel为空的单元格,也要设置一下单元格格式,为字符即可,否则常规格式的空数据excel解析时未能匹配成STRING。

       4、第四个原因就是excel表格中删除数据时,尤其是最下边删除时,不是选中删除的内容,而是选中删除的内容所在的行,否则在解析时还是以为有数据呢只不过数据为空而已,这就很容易造成错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apache POI 是一个用于读写 Microsoft Office 格式文件(如 Excel、Word、PowerPoint 等)的 Java 库。下面是使用 Apache POI 读取 Excel 表格数据的步骤: 1. 添加 Apache POI 依赖包。 在项目的 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 创建 Workbook 对象。 使用 FileInputStream 类加载 Excel 文件,然后创建 Workbook 对象。Workbook 对象可以是 HSSFWorkbook(处理 .xls 格式)或 XSSFWorkbook(处理 .xlsx 格式)。 ```java FileInputStream file = new FileInputStream(new File("path/to/excel/file.xlsx")); XSSFWorkbook workbook = new XSSFWorkbook(file); ``` 3. 获取 Sheet 对象。 Sheet 对象代表一个 Excel 表格,可以通过 Workbook 对象的 getSheet() 方法获取。也可以通过 Sheet 对象的名字获取,如 getSheet("Sheet1")。 ```java Sheet sheet = workbook.getSheetAt(0); // 获取第一个表格 ``` 4. 遍历行和单元格。 遍历行和单元格,读取数据。 ```java Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.iterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); switch (cell.getCellType()) { case STRING: System.out.print(cell.getStringCellValue() + "\t"); break; case NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; default: } } System.out.println(); } ``` 完整代码示例: ```java 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.xssf.usermodel.XSSFWorkbook; public class ReadExcel { public static void main(String[] args) throws IOException { FileInputStream file = new FileInputStream(new File("path/to/excel/file.xlsx")); XSSFWorkbook workbook = new XSSFWorkbook(file); Sheet sheet = workbook.getSheetAt(0); Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.iterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); switch (cell.getCellType()) { case STRING: System.out.print(cell.getStringCellValue() + "\t"); break; case NUMERIC: System.out.print(cell.getNumericCellValue() + "\t"); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + "\t"); break; default: } } System.out.println(); } workbook.close(); file.close(); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值