Apache Poi
HSSF(xls) XSSF(xlsx) 和 SXSSF
- HSSF: POI 对 03版本以及之前
excel
(.xls结尾)文件的Java
操作实现类 .xls格式单个工作表最多支持65536行,256列。 - XSSF: POI对07版本以及之后
excel
(.xlsx结尾)文件的Java
操作实现类 .xlsx格式最多支持1048576行,16384列。 - SXSSF: POI对XSSF操作的扩展类,大量文件操作速度更快。
创建Workbook(工作表)和Sheet
- HSSF:
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("new sheet");
- XSSF:
Workbook wb = new XSSFWorkbook();
Sheet sheet1 = wb.createSheet("second sheet");
注意:
1. 工作表名称不得超过31个字符
2. 不得包含{ 0x0000,0x0003,: ,\ ,/,?,* ,[ ,] }
中任何一个字符
创建单元格
// 创建一个工作表
Workbook wb = new XSSFWorkbook();
//创建一个sheet
Sheet sheet = wb.createSheet("new sheet");
//创建一个行 0 表示第1行
Row row = sheet.createRow(0);
//创建一个单元格
Cell cell = row.createCell(0);
//写入单元格
cell.setCellValue("Hello World !");
单元格接收的格式
- 字符型:
setCellValue(String s)
- 浮点型:
setCellValue(double d)
- 布尔型:
setCellValue(boolean b)
- 日期型Date:
setCellValue(Date date)
- 富文本:
setCellValue(RichTextString rt)
- 日历型Calendar:
setCellValue(Calendar calendar)
- 本地日期型:
setCellValue(LocalDateTime localDateTime)
- 日期型LocalDate:
set日期型LocalDateCellValue(LocalDate value)
代码如下:
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
Row row = sheet.createRow(2);
row.createCell(0).setCellValue(1.1); //double
row.createCell(1).setCellValue(new Date()); //Date
row.createCell(2).setCellValue(Calendar.getInstance()); //Calendar
row.createCell(3).setCellValue("a string"); //String
row.createCell(4).setCellValue(true); //boolean
row.createCell(5).setCellType(CellType.ERROR);
创建 Excel
Workbook wb = new XSSFWorkbook();
/*
创建sheet row cell 并写入数据......
*/
String fileName = "test.xlsx";
OutputStream file = new FileOutputStream(fileName)
wb.write(file);
file.close();
读取Excel
//获取文件输入流
InputStream inputStream = new FileInputStream("/Users/Shared/区域数据.xls");
//获取Excel工作簿对象
HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
//获取sheet
HSSFSheet sheetAt = workbook.getSheetAt(0);
for (Row row : sheet) {
if (row.getRowNum() == 0) {
continue;
}
//读取当前行中单元格数据,索引从0开始
String areaNum = row.getCell(0).getStringCellValue();
String province = row.getCell(1).getStringCellValue();
String city = row.getCell(2).getStringCellValue();
String district = row.getCell(3).getStringCellValue();
String postcode = row.getCell(4).getStringCellValue();
}
//关闭流
workbook.close();
单元格类型判断
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC: // 数字
//如果为时间格式的内容
if (HSSFDateUtil.isCellDateFormatted(cell)) {
//注:format格式 yyyy-MM-dd hh:mm:ss 中小时为12小时制,若要24小时制,则把小h变为H即可,yyyy-MM-dd HH:mm:ss
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
value=sdf.format(HSSFDateUtil.getJavaDate(cell.
getNumericCellValue())).toString();
break;
} else {
value = new DecimalFormat("0").format(cell.getNumericCellValue());
}
break;
case HSSFCell.CELL_TYPE_STRING: // 字符串
value = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
value = cell.getBooleanCellValue() + "";
break;
case HSSFCell.CELL_TYPE_FORMULA: // 公式
value = cell.getCellFormula() + "";
break;
case HSSFCell.CELL_TYPE_BLANK: // 空值
value = "";
break;
case HSSFCell.CELL_TYPE_ERROR: // 故障
value = "非法字符";
break;
default:
value = "未知类型";
break;
}
EasyExcel
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。