POI——Office文档的Java处理包之Excel表操作
1、什么是POI
POI是Apache提供的操作Office文档的Java处理工具包。
2、POI能干什么?
- 操作office的ppt。
- 操作office的excel。
- 操作office的word。
3、POI操作Excel表格
POI不同的版本能操作的excel表格的类型是不一样的。
以HSSF开头的类名可以操作excel版本97~2007(.xls);以XSSF开头的类名可以操作excel2007之后的版本(.xlsx)。这是两个不同的版本进行的操作,在使用XSSF的时候需要对之前使用的HSSF做出些许更改。
4、操作Excel表格代码示例
1、创建表格
创建的此表格的缺点是每一行的数据全部都是String类型的,如果需要请自行修改 List < String > 类型为 List< Object > 并在创建列的时候进行类型的判断,以确保每一列的类型都是规范的,以免报错。
/**
* 将数据写入excel表格
*
* @param list 数据
* @param headName 标题
* @param fileName 文件名
* @return file
* @throws IOException
*/
public static File createExcel(List<List<String>> list, String[] headName, String fileName) throws IOException {
//1、创建一个excel表
Workbook workbook = new HSSFWorkbook();
//2、创建一个excel表中的工作簿
Sheet sheet = workbook.createSheet();
//3、开始将内容写入到excel表格当中:判断是否符合要求
if (list != null && list.size() > 0) {
//准备行列,开始向每一行的每一列中写入数据
Row row = null;
Cell cell = null;
//3-1、由表格中的sheet去创建行对象
row = sheet.createRow(0); //表示第一行:
//设置标题:标题信息有多少列,表格的索引就有多少列
for (int cellIndex = 0; cellIndex < headName.length; cellIndex++) {
//3-2、由行去创建列(一行中有多少列)
cell = row.createCell(cellIndex);
cell.setCellType(CellType.STRING); //设置当前列的数值类型
cell.setCellValue(headName[cellIndex]); //设置当前列值
}
//设置内容:除标题的第一行外,其他的都是属于表格的有效数据内容
for (int rowIndex = 0; rowIndex < list.size(); rowIndex++) {
row = sheet.createRow(rowIndex + 1); //除第一行外的行
List<String> rowList = list.get(rowIndex); //获取所有有效数据的行
if (rowList != null && rowList.size() > 0) {
for (int cellIndex = 0; cellIndex < rowList.size(); cellIndex++) {
cell = row.createCell(cellIndex);
cell.setCellType(CellType.STRING); //设置当前列的数值类型
cell.setCellValue(rowList.get(cellIndex)); //设置当前列值
}
}
}
//4、设置列宽
for (int i = 0; i < headName.length; i++) {
sheet.autoSizeColumn(200);
}
//5、输出到文件
File file = new File(fileName);
FileOutputStream out = new FileOutputStream(file);
workbook.write(out);
out.close();
workbook.close();
return file;
}
return null;
}
测试创建excel表格:
public static void main(String[] args) throws IOException {
String[] head = {"id", "学号", "姓名", "年龄"}; //全部string类型的列
String fileName = "创建文件的路径/666.xls";
List<List<String>> result = new ArrayList<>();
List<String> rowList1 = new ArrayList<>();
rowList1.add("1");
rowList1.add("168");
rowList1.add("yyy");
rowList1.add("23");
List<String> rowList2 = new ArrayList<>();
rowList2.add("2");
rowList2.add("169");
rowList2.add("ddd");
rowList2.add("24");
//把两行数据加入到表格的数据集合中
result.add(rowList1);
result.add(rowList2);
File file = ExcelUtil.createExcel(result, head, fileName);
}
2、读取表格
/**
* 读excel表格的内容
*
* @param fileName 文件路径名称
* @param sheetName 工作簿的表名sheet
* @return 返回读取到的结果集合
* @throws IOException
*/
public static List<List<Object>> readExcel(String fileName, String sheetName) throws IOException {
List<List<Object>> resultList = new ArrayList<>();
List<Object> rowList = null;
File file = new File(fileName);
FileInputStream in = new FileInputStream(file);
Workbook workbook = new HSSFWorkbook(in);
Sheet sheet = workbook.getSheet(sheetName);
Row row = null;
Cell cell = null;
//获取到sheet的总行数
int numberOfRows = sheet.getPhysicalNumberOfRows();
for (int rowIndex = 0; rowIndex < numberOfRows; rowIndex++) {
//sheet.getRow(rowIndex + 1); //不读取标题
row = sheet.getRow(rowIndex);//读取标题
//获取当前行的总列数
int numberOfCells = row.getPhysicalNumberOfCells();
rowList = new ArrayList<>();
for (int cellIndex = 0; cellIndex < numberOfCells; cellIndex++) {
Cell cVal = row.getCell(cellIndex);
CellType cellType = cVal.getCellType(); //获取当前单元格的数据格式
//根据不同列的数据类型,用不同的列类型去读取
switch (cellType) {
case STRING:
rowList.add(cVal.getStringCellValue());
break;
case NUMERIC:
rowList.add(cVal.getNumericCellValue());
break;
case BOOLEAN:
rowList.add(cVal.getBooleanCellValue());
break;
case BLANK:
rowList.add(cVal.getStringCellValue());
break;
}
}
resultList.add(rowList);
}
return resultList;
}
测试读取Excel表格:
public static void main(String[] args) throws IOException {
List<List<Object>> lists = ExcelUtil.readExcel("读取文件的路径/666.xls", "sheet0");
for (List<Object> list : lists) {
for (Object s : list) {
System.out.print(s + " ");
}
System.out.println();
}
}