在使用Apache POI库读取Excel文件时,可能会遇到有连续数字的单元格被解析为日期单元格的问题。例如,当单元格内的数字为"10-1",Apache POI可能会将其解释为10月1日。这可能会导致应用程序逻辑错误,因为实际上单元格中包含了完全不同的信息。 为解决此问题,需要明确告诉POI有关数字单元格类型的信息。例如,设置单元格格式为文本(org.apache.poi.ss.usermodel.BuiltinFormats.TEXT),或者使用将默认格式设为文本的Workbook对象。下面是一个示例代码,它获取名为“test.xlsx”的Excel文件,将所有数字单元格的格式设为文本,并遍历所有单元格以获取它们的值。
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import org.apache.poi.ss.usermodel.BuiltinFormats;
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.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class ReadExcelFile {
public static void main(String[] args) throws IOException {
FileInputStream inputStream = new FileInputStream(new File("test.xlsx"));
Workbook workbook = WorkbookFactory.create(inputStream);
// set default cell format to text
workbook.getCreationHelper().createCellStyle().setDataFormat(BuiltinFormats.TEXT);
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
String value = "";
switch (cell.getCellType()) {
case STRING:
value = cell.getStringCellValue();
break;
case NUMERIC:
value = String.valueOf(cell.getNumericCellValue());
break;
case BOOLEAN:
value = String.valueOf(cell.getBooleanCellValue());
break;
default:
break;
}
System.out.print(value + "\t");
}
System.out.println();
}
workbook.close();
inputStream.close();
}
}