java poi 读取excel 数字类型的怎么读到以后1都变成了1.0?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java poi 读取excel 数字类型的怎么读到以后1都变成了1.0?相关的知识,希望对你有一定的参考价值。
参考技术A 这是正常的。通过POI取出的数值默认都是double,即使excel单元格中存的是1,取出来的值也是1.0,这就造成了一些问题,如果数据库字段是int,那么就会wrongdatatype,所以需要对数值类型处理。代码如下:Cellcell=null;//单元格ObjectinputValue=null;//单元格值if(!isEmpty(cell)&&cell.getCellType()==Cell.CELL_TYPE_NUMERIC)longlongVal=Math.round(cell.getNumericCellValue());if(Double.parseDouble(longVal+".0")==doubleVal)inputValue=longVal;elseinputValue=doubleVal;这么处理后,单元格中的小数没有变化,如果是整数,也会取到整数。 参考技术B我也碰到了这个问题,解决很简单,就是修改Excel表的单元格格式(修改成文本)就可以,如果必须需要其他类型,那就只有在java后台手动转换了。
参考技术C 直接(int)强转java读取excel时间格式出现数字怎么处理
在Excel中的日期格式,比如2009-12-24将其转化为数字格式时变成了40171,在用java处理的时候,读取的也将是40171。如果使用POI处理Excel中的日期类型的单元格时,如果仅仅是判断它是否为日期类型的话,最终会以NUMERIC类型来处理。
正确的处理方法是先判断单元格的类型是否则NUMERIC类型,然后再判断单元格是否为日期格式,如果是的话,创建一个日期格式,再将单元格的内容以这个日期格式显示出来。如果单元格不是日期格式,那么则直接得到NUMERIC的值就行了。
具体代码如下:
主要是判断NUMERIC 的时候 同事判断下 单元格是不是日期格式 如果是 日期格式直接 转成日期格式字符串返回值就ok了。
if (0 == cell.getCellType()) //判断是否为日期类型 if(HSSFDateUtil.isCellDateFormatted(cell)) //用于转化为日期格式 Date d = cell.getDateCellValue(); DateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); str[k] = formater.format(d); else // 用于格式化数字,只保留数字的整数部分 DecimalFormat df = new DecimalFormat("########"); str[k] = df.format(cell.getNumericCellValue());
JSch连接SSH问题Exception:Algorithm negotiation fail
使用Jenkins配置完远程SSH服务器,发生无法连接问题,查看Log后找到:
[SSH] Exception:Algorithm negotiation fail
com.jcraft.jsch.JSchException: Algorithm negotiation fail
at com.jcraft.jsch.Session.receive_kexinit(Session.java:520)
at com.jcraft.jsch.Session.connect(Session.java:286)
at com.jcraft.jsch.Session.connect(Session.java:150)
at org.jvnet.hudson.plugins.SSHSite.createSession(SSHSite.java:141)
at org.jvnet.hudson.plugins.SSHSite.executeCommand(SSHSite.java:151)
at org.jvnet.hudson.plugins.SSHBuildWrapper.executePreBuildScript(SSHBuildWrapper.java:75)
at org.jvnet.hudson.plugins.SSHBuildWrapper.setUp(SSHBuildWrapper.java:59)
at hudson.model.Build$BuildExecution.doRun(Build.java:154)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:533)
at hudson.model.Run.execute(Run.java:1754)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:89)
at hudson.model.Executor.run(Executor.java:240)
Finished: FAILURE
原因分析:OpenSSH和 JSch支持的交换算法不同,需要一方打开另一方支持的交换算法。
OpenSSH enables only the following key exchange algorithms by default:
- curve25519-sha256@libssh.org
- ecdh-sha2-nistp256
- ecdh-sha2-nistp384
- ecdh-sha2-nistp521
- diffie-hellman-group-exchange-sha256
- diffie-hellman-group14-sha1
Where as JSch claims to support these algorithms for key exchange:
- diffie-hellman-group-exchange-sha1
- diffie-hellman-group1-sha1
解决办法:
在SSH的配置文件/etc/ssh/sshd_config增加以下两行,让SSH支持相应的算法和MACs。
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-ripemd160-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160,umac-128@openssh.com,hmac-md5,hmac-sha1,hmac-sha1-96,hmac-md5-96
完成后重启SSH即可解决问题。
参考技术A正确的处理方法是先判断单元格的类型是否则NUMERIC类型,判断单元格是否为日期格式,如果是的话,创建一个日期格式,将单元格的内容以这个日期格式显示出来。如果单元格不是日期格式,那么则直接得到NUMERIC的值就行了。
在Excel中的日期格式,比如2009-12-24将其转化为数字格式时变成了40171,在用java处理的时候,读取的也将是40171。如果使用POI处理Excel中的日期类型的单元格时,如果仅仅是判断它是否为日期类型的话,最终会以NUMERIC类型来处理。
三维引用样式
如果要分析同一工作簿中多张工作表上的相同单元格或单元格区域中的数据,就要用到三维引用。三维引用包含单元格或区域引用,前面加上工作表名称的范围。Excel 使用存储在引用开始名和结束名之间的任何工作表。例如,=SUM(Sheet2:Sheet13!B5) 将计算包含在 B5 单元格内所有值的和,单元格取值范围是从工作表2 到工作表 13。
以上内容参考:百度百科-单元格
参考技术B java读取excel时间格式出现数字的处理方法:Excel存储日期、时间均以数值类型进行存储,读取时POI先判断是是否是数值类型,再进行判断转化
1、数值格式(CELL_TYPE_NUMERIC):
1.纯数值格式:getNumericCellValue() 直接获取数据
2.日期格式:处理yyyy-MM-dd, d/m/yyyy h:mm, HH:mm 等不含文字的日期格式
1).判断是否是日期格式:HSSFDateUtil.isCellDateFormatted(cell)
2).判断是日期或者时间
cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")
OR: cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("yyyy-MM-dd")
3.自定义日期格式:处理yyyy年m月d日,h时mm分,yyyy年m月等含文字的日期格式
判断cell.getCellStyle().getDataFormat()值,解析数值格式
yyyy年m月d日----->31
m月d日---->58
h时mm分--->32
举例说明:
private String parseExcel(Cell cell)
String result = new String();
switch (cell.getCellType())
case HSSFCell.CELL_TYPE_NUMERIC:// 数字类型
if (HSSFDateUtil.isCellDateFormatted(cell)) // 处理日期格式、时间格式
SimpleDateFormat sdf = null;
if (cell.getCellStyle().getDataFormat() == HSSFDataFormat
.getBuiltinFormat("h:mm"))
sdf = new SimpleDateFormat("HH:mm");
else // 日期
sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = cell.getDateCellValue();
result = sdf.format(date);
else if (cell.getCellStyle().getDataFormat() == 58)
// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
double value = cell.getNumericCellValue();
Date date = org.apache.poi.ss.usermodel.DateUtil
.getJavaDate(value);
result = sdf.format(date);
else
double value = cell.getNumericCellValue();
CellStyle style = cell.getCellStyle();
DecimalFormat format = new DecimalFormat();
String temp = style.getDataFormatString();
// 单元格设置成常规
if (temp.equals("General"))
format.applyPattern("#");
result = format.format(value);
break;
case HSSFCell.CELL_TYPE_STRING:// String类型
result = cell.getRichStringCellValue().toString();
break;
case HSSFCell.CELL_TYPE_BLANK:
result = "";
default:
result = "";
break;
return result;
参考技术C 那就全部按照字符串读取,然后用Integer.parseInt()方法和new SimpleDateFormat().format()方法操作获得的字符串,没报异常就是对应的数字或时间,全报异常就是字符串本回答被提问者采纳 参考技术D 那就全部按照字符串读取,然后用Integer.parseInt()方法和new SimpleDateFormat().format()方法操作获得的字符串,没报异常就是对应的数字或时间,全报异常就是字符串
以上是关于java poi 读取excel 数字类型的怎么读到以后1都变成了1.0?的主要内容,如果未能解决你的问题,请参考以下文章