对象: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