我有一个Excel文件,其中包含以下内容:
A1:SomeString
A2:2
所有字段都设置为字符串格式。
当我在Java中使用POI读取文件时,它告诉我A2是数字单元格格式。
- 问题在于,A2中的值可以是2或2.0(我希望能够区分它们),因此我不能仅使用
.toString()
。
我该怎么做才能将其作为字符串读取?
我有一个Excel文件,其中包含以下内容:
A1:SomeString
A2:2
所有字段都设置为字符串格式。
当我在Java中使用POI读取文件时,它告诉我A2是数字单元格格式。
.toString()
。我该怎么做才能将其作为字符串读取?
许多答案都参考了旧的POI文档和类。在最新的POI 3.16中,带有int类型的单元格已被弃用。
Cell.CELL_TYPE_STRING
可以使用CellType枚举。
CellType.STRING
请确保将您的pom文件更新为poi依赖项以及poi-ooxml依赖项的新3.16版本,否则您将继续收到异常。这个版本的一个优点是,您可以在创建单元格时指定单元格类型,从而消除了之前答案中描述的所有额外步骤:
titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);
我遇到了同样的问题,最简单的解决方法是将CELL TYPE
设置为STRING
。这样可以避免出现exceptions
。
FileInputStream fis = new FileInputStream(new File(filePath));
XSSFWorkbook wb = new XSSFWorkbook(fis);
XSSFSheet sheet = wb.getSheetAt(0); // get first sheet
row.getCell(1).setCellType(CellType.STRING); // set Cell Type as String
String val = row.getCell(1).getStringCellValue(); // get the value as String type
System.out.println(val); // prints the value;
这对我来说完美地运作了。
Double legacyRow = row.getCell(col).getNumericCellValue();
String legacyRowStr = legacyRow.toString();
if(legacyRowStr.contains(".0")){
legacyRowStr = legacyRowStr.substring(0, legacyRowStr.length()-2);
}
如果单元格类型为数字,getStringCellValue会返回NumberFormatException。如果您不想将单元格类型更改为字符串,可以这样做。
String rsdata = "";
try {
rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
rsdata = cell.getNumericValue() + "";
}
我也曾在一个包含数千个数字的数据集上遇到类似的问题,我认为我已经找到了一个简单的解决方法。我需要在数字前插入撇号,以便单独的数据库导入始终将数字视为文本。在此之前,数字8将被导入为8.0。
解决方案:
嘿,预备,所有数字都被存储为文本。
我更愿意采用Wil或Vinayak Dornala的方法,但不幸的是它们对我的性能影响太大了。 我选择了一个巧妙的解决方案:隐式转换。
for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...
有一个可直接使用的包装器(可以应用一些额外的优化)
它支持数字和字符串单元格
公式会被自动识别和处理
避免一些样板代码
public final class Cell {
private final static DataFormatter FORMATTER = new DataFormatter();
private XSSFCell mCell;
public Cell(@NotNull XSSFCell cell) {
mCell = cell;
if (isFormula()) {
XSSFWorkbook book = mCell.getSheet().getWorkbook();
FormulaEvaluator evaluator = book.getCreationHelper().createFormulaEvaluator();
mCell = (XSSFCell) evaluator.evaluateInCell(mCell);
}
}
/**
* 获取内容
*/
public final int getInt() {
return (int) getLong();
}
public final long getLong() {
return Math.round(getDouble());
}
public final double getDouble() {
return mCell.getNumericCellValue();
}
public final String getString() {
if (!isString()) {
return FORMATTER.formatCellValue(mCell);
}
return mCell.getStringCellValue();
}
/**
* 获取属性
*/
public final boolean isNumber() {
if (isFormula()) {
return mCell.getCachedFormulaResultType().equals(CellType.NUMERIC);
}
return mCell.getCellType().equals(CellType.NUMERIC);
}
public final boolean isString() {
if (isFormula()) {
return mCell.getCachedFormulaResultType().equals(CellType.STRING);
}
return mCell.getCellType().equals(CellType.STRING);
}
public final boolean isFormula() {
return mCell.getCellType().equals(CellType.FORMULA);
}
/**
* 调试信息
*/
@Override
public String toString() {
return getString();
}
}