Java 如何使用OpenCSV读取长单元格值?
我正在导入csv文件。我有一个单元格值,比如导入时的1.00E+13,必须读取为100230000000(实际扩展值)。 我正在使用OpenCSV 注意:我是通过对XLS和XLSX文件使用ApachePOI实现的,因为POI不支持CSV,所以我使用的是OpenCSV POI针对上述情况的解决方案是:Java 如何使用OpenCSV读取长单元格值?,java,opencsv,Java,Opencsv,我正在导入csv文件。我有一个单元格值,比如导入时的1.00E+13,必须读取为100230000000(实际扩展值)。 我正在使用OpenCSV 注意:我是通过对XLS和XLSX文件使用ApachePOI实现的,因为POI不支持CSV,所以我使用的是OpenCSV POI针对上述情况的解决方案是: FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator(hWorkbook); HSSFCell cellValue = ro
FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator(hWorkbook);
HSSFCell cellValue = row.getCell(1); //input as 1.00E+13
objFormulaEvaluator.evaluate(cellValue); //result as 10023000000000
如何在OpenCSV中实现这一点
提前感谢。如果您自己解析csvReader中的字符串,那么Kenny的答案就完全正确了。我唯一关心的是csv文件是字符串,因此输入必须是1.0023E+13,而不是1.00E+13 所有这些都表明在opencsv中还有另一种方式,那就是CsvToBean类。您使用公共getter和setter创建一个具有所需值的类,然后CsvToBean将为您处理转换,如下面的通过测试所示
public class CsvToBeanDoubleTest {
private static final double DOUBLE_NUMBER = 10023000000000d;
private static final String TEST_STRING = "name,orderNumber,doubleNum\n" +
"kyle,abc123456,10023000000000\n" +
"jimmy,def098765,1.0023E+13 ";
private CSVReader createReader() {
return createReader(TEST_STRING);
}
private CSVReader createReader(String testString) {
StringReader reader = new StringReader(testString);
return new CSVReader(reader);
}
private MockBean createMockBean(String name, String orderNumber, double num) {
MockBean mockBean = new MockBean();
mockBean.setName(name);
mockBean.setOrderNumber(orderNumber);
mockBean.setDoubleNum(num);
return mockBean;
}
@Test
public void parseBeanWithNoAnnotations() {
HeaderColumnNameMappingStrategy<MockBean> strategy = new HeaderColumnNameMappingStrategy<MockBean>();
strategy.setType(MockBean.class);
CsvToBean<MockBean> bean = new CsvToBean<MockBean>();
List<MockBean> beanList = bean.parse(strategy, createReader());
assertEquals(2, beanList.size());
assertTrue(beanList.contains(createMockBean("kyle", "abc123456", DOUBLE_NUMBER)));
assertTrue(beanList.contains(createMockBean("jimmy", "def098765", DOUBLE_NUMBER)));
}
}
公共类CsvToBeanDoubleTest{
私有静态最终双精度编号=100230000000d;
私有静态最终字符串测试\u String=“name,orderNumber,doubleNum\n”+
凯尔,ABC12345610023000000000\n+
“吉米,def098765,1.0023E+13”;
私有CSVReader createReader(){
返回createReader(测试字符串);
}
私有CSVReader createReader(字符串测试字符串){
StringReader=新的StringReader(testString);
返回新的CSVReader(读卡器);
}
私有MockBean createMockBean(字符串名称、字符串顺序号、双数值){
MockBean MockBean=新MockBean();
mockBean.setName(name);
setOrderNumber(orderNumber);
setDoubleNum(num);
返回mockBean;
}
@试验
public void parseBeanWithNoAnnotations(){
HeaderColumnNameMappingStrategy=新建HeaderColumnNameMappingStrategy();
setType(MockBean.class);
CsvToBean=新的CsvToBean();
List beanList=bean.parse(策略,createReader());
assertEquals(2,beanList.size());
assertTrue(beanList.contains(createMockBean(“kyle”,“abc123456”,双_编号));
assertTrue(beanList.contains(createMockBean(“jimmy”,“def098765”,双_编号));
}
}
如果您自己解析csvReader中的字符串,那么Kenny的答案是完全正确的。我唯一关心的是csv文件是字符串,因此输入必须是1.0023E+13,而不是1.00E+13
所有这些都表明在opencsv中还有另一种方式,那就是CsvToBean类。您使用公共getter和setter创建一个具有所需值的类,然后CsvToBean将为您处理转换,如下面的通过测试所示
public class CsvToBeanDoubleTest {
private static final double DOUBLE_NUMBER = 10023000000000d;
private static final String TEST_STRING = "name,orderNumber,doubleNum\n" +
"kyle,abc123456,10023000000000\n" +
"jimmy,def098765,1.0023E+13 ";
private CSVReader createReader() {
return createReader(TEST_STRING);
}
private CSVReader createReader(String testString) {
StringReader reader = new StringReader(testString);
return new CSVReader(reader);
}
private MockBean createMockBean(String name, String orderNumber, double num) {
MockBean mockBean = new MockBean();
mockBean.setName(name);
mockBean.setOrderNumber(orderNumber);
mockBean.setDoubleNum(num);
return mockBean;
}
@Test
public void parseBeanWithNoAnnotations() {
HeaderColumnNameMappingStrategy<MockBean> strategy = new HeaderColumnNameMappingStrategy<MockBean>();
strategy.setType(MockBean.class);
CsvToBean<MockBean> bean = new CsvToBean<MockBean>();
List<MockBean> beanList = bean.parse(strategy, createReader());
assertEquals(2, beanList.size());
assertTrue(beanList.contains(createMockBean("kyle", "abc123456", DOUBLE_NUMBER)));
assertTrue(beanList.contains(createMockBean("jimmy", "def098765", DOUBLE_NUMBER)));
}
}
公共类CsvToBeanDoubleTest{
私有静态最终双精度编号=100230000000d;
私有静态最终字符串测试\u String=“name,orderNumber,doubleNum\n”+
凯尔,ABC12345610023000000000\n+
“吉米,def098765,1.0023E+13”;
私有CSVReader createReader(){
返回createReader(测试字符串);
}
私有CSVReader createReader(字符串测试字符串){
StringReader=新的StringReader(testString);
返回新的CSVReader(读卡器);
}
私有MockBean createMockBean(字符串名称、字符串顺序号、双数值){
MockBean MockBean=新MockBean();
mockBean.setName(name);
setOrderNumber(orderNumber);
setDoubleNum(num);
返回mockBean;
}
@试验
public void parseBeanWithNoAnnotations(){
HeaderColumnNameMappingStrategy=新建HeaderColumnNameMappingStrategy();
setType(MockBean.class);
CsvToBean=新的CsvToBean();
List beanList=bean.parse(策略,createReader());
assertEquals(2,beanList.size());
assertTrue(beanList.contains(createMockBean(“kyle”,“abc123456”,双_编号));
assertTrue(beanList.contains(createMockBean(“jimmy”,“def098765”,双_编号));
}
}
您可能需要自己动手制作类似于(long)Double.parseDouble(“1.00E+13”)你可能需要自己动手做一些东西,比如(long)Double.parseDouble(“1.00E+13”)代码>