我正在使用Apache-POI 3.14。我需要将一个单元锁定到一个" Text"格式。我单元格中的数据可能都是数字,但仍然被视为字符串。当我写单元格时,我这样做:
cell.setCellValue("001");
cell.setCellType(Cell.CELL_TYPE_STRING);
当我在Excel中打开输出工作簿时,单元格包含正确的值(" 001"),并在角落显示一个小的绿色三角形。将鼠标悬停在感叹号上会显示悬停文本The number in this cell is formatted as text or preceded by an apostrophe
。当我查看单元格格式(右键单击 - >格式化单元格)时,"类别"显示为" General"。我希望这是" Text"。
当用户通过仅输入数字来修改单元格中的值时,就会出现问题。因为"类别"是"一般",输入值并显示为数字,删除前导零和右对齐。
如何获得与Excel"格式化单元格相同的结果"对话框?
答案 0 :(得分:8)
您可以尝试通过
将单元格格式设置为文本DataFormat fmt = wb.createDataFormat();
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(
fmt.getFormat("@"));
cell.setCellStyle(cellStyle);
注意:CellStyles应该重复用于所有适用的单元格,不要为每个单元格创建新的单元格。
您也可以尝试使用.xlsx格式的“忽略错误”功能,但是对它的支持还没有完全完成,请参阅Issue 46136和Issue 58641进行一些讨论。
另请参阅this MSDN page了解更多信息
答案 1 :(得分:4)
对于HSSF,
DataFormat fmt = workbook.createDataFormat();
CellStyle textStyle = workbook.createCellStyle();
textStyle.setDataFormat(fmt.getFormat("@"));
sheet.setDefaultColumnStyle(0, textStyle);
它只将整个列样式设置为Text,并将类别设置为Text。
但是,如果您使用的是XSSF格式,则它无法正常工作(我使用的是Apache Poi 3.15并且不适用于我)。 在这种情况下,除了以上代码之外,您还要将样式设置为要作为文本处理的每个单元格:
cell.setCellStyle(textStyle);
关于错误,您可以使用
sheet.addIgnoredErrors(new CellRangeAddress(0,9999,0,9999),IgnoredErrorType.NUMBER_STORED_AS_TEXT );
它忽略了第0行到9999以及第0列到9999的NUMBER_STORED_AS_TEXT错误,你不会看到它。
答案 2 :(得分:1)
看起来OP正在寻求Apache解决方案。经过一番搜索,我找到了这个答案:
HSSFCellStyle style = book.createCellStyle();
style.setDataFormat(BuiltInFormats.getBuiltInFormat("text"));
答案 3 :(得分:0)
我无法对此进行测试,但您是否尝试过使用模板 - 一个空的excel文件,其中所有单元格都被格式化为文本?
答案 4 :(得分:0)
在这种情况下,我使用的是Apache-POI 3.15,并且我遇到了同样的问题,因此我以自己的风格验证了数据,我需要数字> 0和字符串:
try {
if (Integer.parseInt(field + "") >= 0) {
int valor = Integer.parseInt(field + "");
cell.setCellValue(valor); //Int
}
} catch (NumberFormatException nfe) {
// no int
try {
if (Double.parseDouble(field + "") >= 0) {
double valor = Double.parseDouble(field + ""); //double
cell.setCellValue(valor);
}
} catch (NumberFormatException nfe2) {
cell.setCellValue(field + ""); //String
}
}
答案 5 :(得分:0)
对于Apache POI 4.0.1:
XSSFSheet sheet = workbook.createSheet("MySheetName");
sheet.addIgnoredErrors(new CellRangeAddress(0, 9999, 0, 9999), IgnoredErrorType.NUMBER_STORED_AS_TEXT);
请注意将工作表投射到org.apache.poi.xssf.usermodel.XSSFSheet而不是org.apache.poi.ss.usermodel.Sheet,否则方法addIgnoredErrors将是未知的。