Apache POI操作Excel表格
1、引入依赖包
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
2、使用封装类生成Excel文件
package edu.beihua.crm.Commons;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import java.io.*;
public class Apache_POI {
public static void main(String[] args) {
//创建HSSFWorkbook对象,对应一个excel文件
HSSFWorkbook wb = new HSSFWorkbook();
//创建sheet页面
HSSFSheet sheet = wb.createSheet("学生列表");
//创建行 使用sheet创建HSSFRow对象,对应sheet中的一行
HSSFRow row = sheet.createRow(0);//行号:从0 开始,依次增加
//使用行对象 创建HSSFCell列对象,对应行row中的列
HSSFCell cell = row.createCell(0);//列的编号:从0开始,依次增加
cell.setCellValue("学号");
cell = row.createCell(1);
cell.setCellValue("姓名");
cell = row.createCell(2);
cell.setCellValue("年龄");
cell = row.createCell(3);
cell.setCellValue("班级");
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
for (int i = 1; i < 11 ; i++) {
row = sheet.createRow(i);
cell = row.createCell(0);
cell.setCellStyle(cellStyle);
cell.setCellValue(101+i);
cell = row.createCell(1);
cell.setCellValue("TomCAT LINA"+i);
cell = row.createCell(2);
cell.setCellValue(20+i);
cell = row.createCell(3);
cell.setCellValue("A"+i);
}
//调用工具函数生成excel文件
FileOutputStream of = null;
try {
//目录必须实现存在 否者会出错
of = new FileOutputStream("E:\\实习技术复习\\CRM\\crm_project\\src\\test\\java\\student.xls");
wb.write(of);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
3、使用POI读入时间时出现了double类型数据,时间导入格式被转化成double格式
错误描述:之前使用的是获取cell里面的类型只要等于 HSSFCell.CELL_TYPE_NUMERIC
,就直接返回成 cell.getNumericCellValue()+""
,
return cell.getNumericCellValue()+"";
如同这样的日期被上传成了4893.0这样的Double数字。解决方式,编写一个单独的cell类型读取公共类。
public static String getCellValueForString(HSSFCell cell){
int ty = cell.getCellType();
if (ty == HSSFCell.CELL_TYPE_STRING){
return cell.getStringCellValue();
}else if (ty == HSSFCell.CELL_TYPE_NUMERIC){
String value = "";
if (HSSFDateUtil.isCellDateFormatted(cell)) {// 日期类型
// 短日期转化为字符串
Date date = cell.getDateCellValue();
if (date != null) {
// 标准0点 1970/01/01 08:00:00
if (date.getTime() % 86400000 == 16 * 3600 * 1000 && cell.getCellStyle().getDataFormat() == 14) {
value = new SimpleDateFormat("yyyy-MM-dd").format(date);
} else {
value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
}
}
} else {// 数值
//System.out.println("Value:"+cell.getNumericCellValue());
String numberStr = new HSSFDataFormatter().formatCellValue(cell);
// 货币格式,如:1,200.00
if (numberStr.contains(",")) {
numberStr = numberStr.replace(",", "");
}
if (numberStr.contains("E")) { // 科学计算法
numberStr = new DecimalFormat("0").format(cell.getNumericCellValue()); //4.89481368464913E14还原为长整数
value = Long.parseLong(numberStr)+"";
} else {
if (numberStr.contains(".")) { // 小数
value = Double.parseDouble(numberStr) + "";
} else { // 转换为整数
value = Long.parseLong(numberStr)+ "";
}
}
}
return value;
}else if (ty == HSSFCell.CELL_TYPE_BOOLEAN){
return cell.getBooleanCellValue()+"";
} else if (ty == HSSFCell.CELL_TYPE_FORMULA) {
return cell.getCellFormula();
}else {
return "";
}
}
根据资料可知,CELL_TYPE_NUMERIC总的包含了以下类型,我们需要单独的进行单独处理
CELL_TYPE_NUMERIC是Apache POI中单元格类型之一,表示数值类型的单元格。具体包含以下类型:
- 整型数值类型,例如:1、2、3等。
- 浮点数值类型,例如:1.2、3.14159等。
- 百分数类型,例如:0.75、1.23%等。
- 科学计数法类型,例如:3.14E+2、2.0E-3等。
- 日期和时间类型,例如:42050.5、0.25等。
需要注意的是,虽然日期和时间值可以被表示为数值类型,但是它们的值和含义与普通的数值类型不同。因此,在读取单元格时,需要通过调用DateUtil类中的静态方法来判断单元格是否包含日期或时间类型的值,然后使用相应的方法来获取日期或时间值。