java处理excel,心得分享如下,如有不妥或者需要补充的地方,敬请指出,欢迎随时交流
1.加载excel,获得workbook对象
fileTemp = new File(pathOfMExcel);
ins = new FileInputStream(fileTemp);
wb = WorkbookFactory.create(ins);
ins.close();
2.获得workbook对象后,既可以操作sheet和单元格了
获得sheet对象
Sheet sheet = wb.getSheetAt(k);//k=0表示第一个sheet
获得行对象(根据行对象就可以获得单元格对象了)
Row row = sheet.getRow(7);//第6行
Cell cell =row.getCell(2); //第1列
3.对于单元格的操作可以参照API即可。
4.强制刷新sheet公式,
excel里面可能隐含公式,更新和excel公式相关的单元格的时候需要更新。
sheet_1.setForceFormulaRecalculation(true);//sheet_1为sheet对象
5.对于单元格的设置值,我是如此处理的:
先设置单元格全为String类型,然后根据需要,将某一列设置为数字,但是这列也有可能存在空和Sring类型,简单说,就是这列如果是数字需要设置为number类型,参与excel的公式计算,然后可以采用下面进行判断:
if (cell3.getCellType() == 3) {//空类型
continue;
}
if (cell3.getCellType() == 1 && cell3.getCellType() != 3) {//string类型
if (isNumberCheck(cell3.getStringCellValue())) {//判断是否为数字
cell3.setCellValue(Double.parseDouble(cell3.getStringCellValue()));//如果为数字,设置为number
} else {
continue;
}
if (cell3.getCellType() == 0 && cell3.getCellType() != 3) {//数字类型
if (isNumberCheck(cell3.getStringCellValue())) {//判断是否为数字(单元格格式为数字,值不一定)
cell3.setCellValue(Double.parseDouble(cell3.getStringCellValue()));
} else {
continue;
}
6.对于单元格日期全变为数字的处理:
excel的日期起始业数字数字类型的一种,所以如下处理,免得最后都成为数字:
if (0 == cell.getCellType(){//数字类型
if (DateUtil.isCellDateFormatted(cell)) {
// 用于转化为日期格式
Date d = (Date) cell.getDateCellValue();
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
return formater.format(d);
}
}
7.对于百分号的处理,我就要显示为百分数的形式:
double d = Double.valueOf(pertage);
DecimalFormat df = new DecimalFormat("#%");
df.setRoundingMode(RoundingMode.DOWN);
return df.format(d);
8.将已存在的Excel修改,最后写入excel:
out = new FileOutputStream(fileTemp);//fileTemp第1点提到的
wb.write(out);
out.close();
很奇怪的是,如果fileTemp使用一开始加载excel就初始化的File流,那么执行wb.write(out);是很快的,如果再new一个File流,然后用再使用FileOutputStream加载,最后wb.write(out)的时候会极度慢,这也是暂时很疑惑的一点。