POI API简介

对象:Workbook、Sheet、Row、Cell

Workbook

代表一个Excel文件

  • 实现类
    HSSFWorkbook:xls文件
    XSSFWorkbook:xlsx文件
  • API主要是sheet页的CRUD
    HSSFWorkbook(); // 无需模板,创建一个新的工作簿。
    HSSFWorkbook(InputStream inputStream); // 使用场景:1. 根据模板创建一个新的Excel文件。2. 根据文件上传的输入流,对Excel文件进行解析。
    Sheet createSheet(String sheetName); // 创建一个新的Sheet
    int getNumberOfSheets(); // 获取sheet页的个数
    Sheet getSheetAt(int index); // 读取某个sheet页
    Sheet getSheet(String sheetName); // 通过名称获取Sheet页
    void write(File newFile); // 把文件从内从写入磁盘

Sheet

API主要是行的CRUD
Row createRow(int rownum); // 创建新行,行号从0开始
Row getRow(int index); // 根据索引获取指定的行
int getLastRowNum(); // 没有行或者只有一行的时候返回0。可用于遍历表格。Sheet对象没有getLastColumnNum方法,因为每一行列数可以不一样。毕竟工作表和矩阵还是不一样。
int addMergedRegion(CellRangeAddress region); // 合并单元格
CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol); 单元格范围
autoSizeColumn(int column); // 自动调整列的宽度来适应内容。
setColumnWidth(int columnIndex, int width); // 设置某一列的宽度,width=字符个数 * 256,例如20个字符的宽度就是20 * 256
合并后单元格的值怎么读取?
合并单元格的值属于左上角小单元格的值,其余格子读出来都是空串。

Row

API主要是单元格的CRUD
short getLastCellNum(); // 用于遍历表格
setHeightInPoints(float height); // 设置行高,美化excel
Cell getCell(shot index);
Cell createCell(int column)
注意Row的API返回了Cell,这里可以进行链式写法,直接设置cell的值,避免代码写太多行:row.createCell(1).setCellValue("订单号");

Cell

Excel内容的载体,一系列set方法最重要
setCellValue(String value); // 设置单元格的值
getCellType(); // 获取单元格类型,如 字符串、数字、布尔等
setCellStyle(HSSFCellStyle style); 设置单元格样式,例如字体、加粗、格式化
String getStringCellValue(); // 获取单元格中的字符串值
setHyperlink(Hyperlink hyperlink); // 设置超链接

/**
* 单元格的格式如果与get方法不匹配的话,读取会报错。
* 数字就是数字,读取的时候并不会自动转换为字符串
*/
public static String getCellValue (Cell cell) {    
    if (cell == null) {
        return "";   
    }
    if (cell.getCellType() == Cell.CELL_TYPE_STRING){    //字符串
        return cell.getStringCellValue();    
    } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){   //boolean 
        return String.valueOf(cell.getBooleanCellValue());    
    } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {    //公式
        return cell.getCellFormula() ;    
    } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {    //数字
        return String.valueOf(cell.getNumericCellValue());    
    } else if (cell.getCellType() == Cell.CELL_TYPE_BLANK || cell.getCellType()==Cell.CELL_TYPE_ERROR) {    //空值/故障
        return "";    
    } else {
        return "";
    }    
}
CellStyle

setFont(Font font); 为单元格设置字体样式
setAlignment(HorizontalAlignment align); // 设置水平对齐方式
setVerticalAlignment(VerticalAlignment align); // 设置垂直对齐方式
setFillForegroundColor(short bg); // 设置前景色
setFillBackgroundColor(short bg); // 设置背景颜色

Font

setColor(short color); // 设置字体颜色
setBold(boolean bold); // 设置是否粗体
setItalic(boolean italic); // 设置倾斜
setUnderline(byte underline); // 设置下划线

代码示例

解析上传的excel时,利用嵌套循环遍历表格

HSSFSheet sheet = workbook.getSheet("Sheet1");
int lastRowIndex = sheet.getLastRowNum();
for (int i = 0; i <= lastRowIndex; i++) {
    HSSFRow row = sheet.getRow(i);
    if (row == null) { break; } // 跳过空行!
    short lastCellNum = row.getLastCellNum();
    for (int j = 0; j < lastCellNum; j++) {
        String cellValue = row.getCell(j).getStringCellValue();
        System.out.println(cellValue);
    }
}

数据库表的导出
需要两个对象:表头的集合和表数据记录的集合。利用两个不嵌套的循环实现数据导出

String[] tableHeaders = {"id", "姓名", "年龄"};
List users = dao.getAllUsers();
// 创建表头
for (int i = 0; i < tableHeaders.length; i++) {
    HSSFCell cell = row.createCell(i);
    cell.setCellValue(tableHeaders[i]);
    cell.setCellStyle(cellStyle);    
}
// 写入数据
for (int i = 0; i < users.size(); i++) {
    row = sheet.createRow(i + 2);   
    User user = users.get(i);
    row.createCell(0).setCellValue(user.getId());    
    row.createCell(1).setCellValue(user.getName());    
    row.createCell(2).setCellValue(user.getAge());    
}

日期格式化

HSSFCellStyle cellStyle2 = workbook.createCellStyle(); // 样式也可以直接用wb创建出来
HSSFCreationHelper creationHelper = workbook.getCreationHelper();
cellStyle2.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
sheet.setColumnWidth(2, 20 * 256); // 设置列的宽度

HSSFCell cell2 = row1.createCell(2);
cell2.setCellStyle(cellStyle2);
cell2.setCellValue(new Date()); 
row1.createCell(3).setCellValue(2);

文章转载自:https://blog.csdn.net/vbirdbest/article/details/72870714

你可能感兴趣的:(POI API简介)