Java 如何将Excel单元格中的数字字符串读取为字符串(而不是数字)?
我有包含以下内容的excel文件:Java 如何将Excel单元格中的数字字符串读取为字符串(而不是数字)?,java,excel,apache-poi,Java,Excel,Apache Poi,我有包含以下内容的excel文件: A1:一些字符串 A2:2 所有字段都设置为字符串格式 当我使用POI读取java中的文件时,它告诉我A2是数值单元格格式 问题是A2中的值可以是2或2.0(我希望能够区分它们),所以我不能只使用.toString() 如何将值读取为字符串?强制转换为int,然后执行.toString()。它很难看,但很有效。我们也遇到了同样的问题,在输入值之前,我们强迫用户将单元格格式化为“文本”。这样Excel就可以正确地将偶数存储为文本。 如果随后更改了格式,Exc
- A1:一些字符串
- A2:2
.toString()
如何将值读取为字符串?强制转换为int,然后执行
.toString()
。它很难看,但很有效。我们也遇到了同样的问题,在输入值之前,我们强迫用户将单元格格式化为“文本”。这样Excel就可以正确地将偶数存储为文本。
如果随后更改了格式,Excel仅会更改值的显示方式,但不会更改值的存储方式,除非再次输入值(例如,在单元格中按return键)
如果Excel认为单元格包含数字,但格式为文本,则Excel在单元格左上角显示的绿色小三角形指示是否将值正确存储为文本 您是否控制excel工作表?用户是否有提供输入的模板?如果是这样的话,您可以用代码格式化输入单元格。我也有同样的问题。我做了
cell.setCellType(cell.cell\u TYPE\u字符串)在读取字符串值之前进行编码>,该字符串值解决了问题,无论用户如何格式化单元格。基于以下事实,在当前版本的POI中似乎无法执行此操作:
仍然是未完成的。当我们使用Apache POI库读取MS Excel的数值单元格值时,它将其读取为数值。但有时我们希望它读作字符串(例如电话号码等)。我就是这样做的:
插入第一个单元格为CONCATENATE(“!”,D2)的新列。我假设D2是您的电话号码列的手机id。将新单元格向上拖动到末尾
现在,如果使用POI读取单元格,它将读取公式而不是计算值。现在,请执行以下操作:
添加另一列
选择在步骤1中创建的完整列。然后选择编辑->复制
转到步骤3中创建的列的顶部单元格。然后选择编辑->粘贴特殊
在打开的窗口中,选择“值”单选按钮
选择“确定”
现在请阅读使用POI API。。。在读了Java之后。。。只需删除第一个字符,即“!”
尝试:
应该正确设置数字的格式。我认为当你问这个问题时,我们没有上过这门课,但今天有一个简单的答案
您要做的是使用。您将其传递给一个单元格,它会尽力返回一个字符串,其中包含Excel将为该单元格显示的内容。如果你给它一个字符串单元格,你会得到字符串。如果您将应用了格式规则的数字单元格传递给它,它将根据这些规则对数字进行格式设置,并返回字符串
对于您的情况,我假设数值单元格应用了整数格式规则。如果您要求DataFormatter格式化这些单元格,它将返回一个包含整数字符串的字符串
另外,请注意,许多人建议执行cell.setCellType(cell.cell\u TYPE\u STRING)
,但是!执行setCellType
调用将丢失格式,因为转换为保留格式的字符串的唯一方法是使用。我也遇到过类似的问题,关于数千个数字的数据集,我认为我找到了一个简单的解决方法。我需要在数字之前插入撇号,以便单独的DB导入始终将数字视为文本。在此之前,数字8将作为8.0导入
解决方案:
- 将所有格式保持为常规格式
- 这里我假设数字存储在A列中,从第1行开始李>
- 在B列中输入“并根据需要复制尽可能多的行”。工作表中没有显示任何内容,但单击单元格可以在公式栏中看到撇号李>
- 在C列中:=B1和A1李>
- 选择C列中的所有单元格,并使用“值”选项在D列中进行特殊粘贴
Hey Presto所有数字,但存储为文本。只要在用户键入数字之前单元格为文本格式,POI将允许您以字符串形式获取值。一个关键是,如果单元格左上角有一个小的绿色三角形,它的格式为文本,您将能够以字符串的形式检索它的值(只要看起来是数字的内容被强制转换为文本格式,绿色三角形就会出现)。如果您有包含数字的文本格式单元格,但POI不允许您以字符串形式获取这些值,则可以对电子表格数据执行以下操作:
- 双击单元格,使编辑光标出现在单元格内,然后单击Enter(一次只能完成一个单元格)
- 使用Excel 2007文本转换功能(可以一次在多个单元格上完成)
- 将有问题的值剪切到另一个位置,将电子表格单元格重新格式化为文本,然后将先前剪切的值作为未格式化的值重新粘贴回适当的区域
您可以做的最后一件事是,如果您使用POI从Excel 2007电子表格中获取数据,则可以使用单元格类“getRawValue()”方法。这与格式无关。它将简单地返回一个包含原始数据的字符串。是的,这非常有效
建议:
DataFormatter dataFormatter = new DataFormatter();
String value = dataFormatter.formatCellValue(cell);
旧的:
即使您在从具有公式的单元格中检索值时遇到问题,这仍然有效。以下代码适用于任何类型的单元格
InputStream inp =getClass().getResourceAsStream("filename.xls"));
Workbook wb = WorkbookFactory.create(inp);
DataFormatter objDefaultFormat = new DataFormatter();
FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb);
Sheet sheet= wb.getSheetAt(0);
Iterator<Row> objIterator = sheet.rowIterator();
while(objIterator.hasNext()){
Row row = objIterator.next();
Cell cellValue = row.getCell(0);
objFormulaEvaluator.evaluate(cellValue); // This will evaluate the cell, And any type of cell will return string value
String cellValueStr = objDefaultFormat.formatCellValue(cellValue,objFormulaEvaluator);
}
InputStream inp=getClass().g
cell.setCellType(Cell.CELL_TYPE_STRING);
InputStream inp =getClass().getResourceAsStream("filename.xls"));
Workbook wb = WorkbookFactory.create(inp);
DataFormatter objDefaultFormat = new DataFormatter();
FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb);
Sheet sheet= wb.getSheetAt(0);
Iterator<Row> objIterator = sheet.rowIterator();
while(objIterator.hasNext()){
Row row = objIterator.next();
Cell cellValue = row.getCell(0);
objFormulaEvaluator.evaluate(cellValue); // This will evaluate the cell, And any type of cell will return string value
String cellValueStr = objDefaultFormat.formatCellValue(cellValue,objFormulaEvaluator);
}
String rsdata = "";
try {
rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
rsdata = cell.getNumericValue() + "";
}
if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}
cell.setCellType(Cell.CELL_TYPE_STRING);
DataFormatter df = new DataFormatter();
String value = df.formatCellValue(cell);
Cell.CELL_TYPE_STRING
CellType.STRING
titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);
Double legacyRow = row.getCell(col).getNumericCellValue();
String legacyRowStr = legacyRow.toString();
if(legacyRowStr.contains(".0")){
legacyRowStr = legacyRowStr.substring(0, legacyRowStr.length()-2);
}
for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...
public class Excellib {
public String getExceldata(String sheetname,int rownum,int cellnum, boolean isString) {
String retVal=null;
try {
FileInputStream fis=new FileInputStream("E:\\Sample-Automation-Workspace\\SampleTestDataDriven\\Registration.xlsx");
Workbook wb=WorkbookFactory.create(fis);
Sheet s=wb.getSheet(sheetname);
Row r=s.getRow(rownum);
Cell c=r.getCell(cellnum);
if(c.getCellType() == Cell.CELL_TYPE_STRING)
retVal=c.getStringCellValue();
else {
retVal = String.valueOf(c.getNumericCellValue());
}
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);
}
}
/**
* Get content
*/
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();
}
/**
* Get properties
*/
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);
}
/**
* Debug info
*/
@Override
public String toString() {
return getString();
}
}