gpt4 book ai didi

java - Apache POI 无法检测哈希格式的数字

转载 作者:行者123 更新时间:2023-12-02 12:06:58 25 4
gpt4 key购买 nike

我需要将通过 xls/xlsx 上传的电话号码读取到 Java 字符串变量中,尽可能接近 Excel 文件上显示的内容。

所以我填写了这些数据: enter image description here

如您所见,单元格中的实际值是 166609999,其格式为 60##############,所以最后我们看到60166609999出现在单元格上。

我想将单元格内容捕获为字符串中的60166609999,但到目前为止我只能捕获166609999,有人可以告诉我出了什么问题吗?

注意:如果我将格式从 60############ 更改为 60000000000,我可以捕获 60166609999 code> 没有任何问题,但 Excel 是通过公共(public)网站上传的,因此我无法强制执行。

代码很简单:

Cell cell = getTheCell(); // Got this after reading the sheets and rows
DataFormatter df = new DataFormatter();
String value = df.formatCellValue(cell);
// Here in value
// If format is 600000000, I can get 60166609999 (right)
// If format is 60#######, I get 166609999 (wrong)

我正在使用的库:

  • POI(POI)3.17
  • poi(poi-ooxml)3.17
  • poi(poi-ooxml-模式)3.17
  • Java 7

有人知道我需要做什么才能做到这一点吗?

谢谢。

最佳答案

问题是多维的。

首先,数字格式60############无法使用Java应用。使用DecimalFormat会导致java.lang.IllegalArgumentException:格式错误的模式“60############” .

但如果需要每个数字都带有“60”前缀,则 Excel 数字格式为 \6\0#"60"# 应该是可能的,并且应该转换为 DecimalFormat 模式 '60'#。但 apache poiDataFormatter 不会,因为它只是删除了 Excel 格式字符串中的所有引用,这导致 60 # 这也是格式错误的模式。

问题出在 DataFormatter.java:671ff .

我已经在我的 MyDataFormatter 中修补了这个,如下所示:

...
// Now, handle the other aspects like
// quoting and scientific notation
for(int i = 0; i < sb.length(); i++) {
char c = sb.charAt(i);
/*
// remove quotes and back slashes
if (c == '\\' || c == '"') {
sb.deleteCharAt(i);
i--;
*/
// handle quotes and back slashes
if (c == '\\') {
sb.setCharAt(i, '\'');
sb.insert(i+2, '\'');
i+=2;
} else if (c == '"') {
sb.setCharAt(i, '\'');
// for scientific/engineering notation
} else if (c == '+' && i > 0 && sb.charAt(i - 1) == 'E') {
sb.deleteCharAt(i);
i--;
}
}

formatStr = sb.toString();
formatStr = formatStr.replace("''", "");
return formatStr;
}
...

在此示例中使用它:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;

import java.io.FileInputStream;

import java.lang.reflect.Method;

class ExcelDataformatterExample {

public static void main(String[] args) throws Exception {

Workbook wb = WorkbookFactory.create(new FileInputStream("ExcelExample.xlsx"));

DataFormatter df = new DataFormatter();
MyDataFormatter mydf = new MyDataFormatter();

Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
if (cell.getCellTypeEnum() == CellType.NUMERIC) {
CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex());
System.out.println("Cell " + cellRef.formatAsString());

System.out.print("Excel's data format string: ");
String formatStr = cell.getCellStyle().getDataFormatString();
System.out.println(formatStr);

System.out.print("Value using poi's data formatter: ");
Method cleanFormatForNumber = DataFormatter.class.getDeclaredMethod("cleanFormatForNumber", String.class);
cleanFormatForNumber.setAccessible(true);
String cleanFormatStr = (String)cleanFormatForNumber.invoke(df, formatStr);
System.out.print("using poi's cleanFormatStr: ");
System.out.print(cleanFormatStr + " result: ");
String value = df.formatCellValue(cell);
System.out.println(value);

System.out.print("Value using my data formatter: ");
cleanFormatForNumber = MyDataFormatter.class.getDeclaredMethod("cleanFormatForNumber", String.class);
cleanFormatForNumber.setAccessible(true);
cleanFormatStr = (String)cleanFormatForNumber.invoke(mydf, formatStr);
System.out.print("using my cleanFormatStr: ");
System.out.print(cleanFormatStr + " result: ");
value = mydf.formatCellValue(cell);
System.out.println(value);

}
}
}
wb.close();

}

}

如果值 199901234 位于采用 Excel 格式的单元格 A1A4 中,则会产生以下输出如图:

Cell A1
Excel's data format string: \60##########
Value using poi's data formatter: using poi's cleanFormatStr: 60########## result: 199901234
Value using my data formatter: using my cleanFormatStr: '6'0########## result: 199901234
Cell A2
Excel's data format string: \60000000000
Value using poi's data formatter: using poi's cleanFormatStr: 60000000000 result: 60199901234
Value using my data formatter: using my cleanFormatStr: '6'0000000000 result: 60199901234
Cell A3
Excel's data format string: "60"#
Value using poi's data formatter: using poi's cleanFormatStr: 60# result: 199901234
Value using my data formatter: using my cleanFormatStr: '60'# result: 60199901234
Cell A4
Excel's data format string: \6\0#
Value using poi's data formatter: using poi's cleanFormatStr: 60# result: 199901234
Value using my data formatter: using my cleanFormatStr: '60'# result: 60199901234

关于java - Apache POI 无法检测哈希格式的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46834555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com