当我尝试使用格式获取单元格的值时,我得到的结果不带零。
单元格值:7654
单元格格式值:0“ 0 /10с”
单元格显示值:7654 0 /10с
DataFormatter formatter = new DataFormatter();
String orderNumber = formatter.formatCellValue(cell);
System.out.println(orderNumber);
结果:7654 /1с
截图:Cell format value
最佳答案
将apache poi
数字格式DataFormatter
转换为Excel
时,这是0" 0/10с"
的java.text.Format
中的错误。正确的对应java.text.Format
将是new java.text.DecimalFormat("0' 0/10с'")
。但是apache poi
的DataFormatter
无法正确翻译此内容。
您应该为此向apache poi
提交错误报告。但是在错误报告中,您不应给出Excel
数字格式0" 0/10с"
作为示例,因为它包含西里尔字母с
,因此可能导致对Unicode问题的错误假设。使用0
数字格式Excel
会发生相同的问题(当它们包含在带引号的文本部分中时,会删除0" 0abc0"
)。
作为一种解决方法,可以告诉DataFormatter
如何转换单个特殊的Excel
数字格式。为此,使用方法DataFormatter.addFormat。
例:
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
class DataFormatterAddFormat {
public static void main(String[] args) throws Exception {
Workbook workbook = WorkbookFactory.create(new FileInputStream("ExcelExample.xlsx"));
DataFormatter dataFormatter = new DataFormatter();
FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
dataFormatter.addFormat("0\" 0/10\u0441\"", new java.text.DecimalFormat("0' 0/10\u0441'"));
dataFormatter.addFormat("0\" 0/10c\"", new java.text.DecimalFormat("0' 0/10c'"));
dataFormatter.addFormat("0\" 0abc0\"", new java.text.DecimalFormat("0' 0abc0'"));
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
String value = dataFormatter.formatCellValue(cell, formulaEvaluator);
System.out.println(value);
}
}
workbook.close();
}
}
现在,可以正确翻译添加的特殊数字格式。当然,这并不是最终的解决方案。这就是为什么要向
apache poi
提交错误报告的提示。