excel类型
excel分为03版本和07版本
- 03版本 new HSSFWorkbook();
优点:速度快
缺点:只能写入65536行数据
文件类型:.xls - 07版本 new XSSFWorkbook();
优点:不限制写入数量
缺点:容易造成内存溢出(OOM),速度慢
文件类型:.xlsx - 07加速版 new SXSSFWorkbook();
在写入过程中会产生临时文件,需要手动清除:((SXSSFWorkbook)wb).dispose();
文件类型:.xlsx
依赖
xml
<!--03-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.12</version>
</dependency>
<!--07-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.12</version>
</dependency>
写入
java
private static void write(){
// 创建一个工作簿
Workbook wb = new HSSFWorkbook();
// 创建一个工作表
Sheet sheet = wb.createSheet("sheet页名称");
// 创建一行
Row row = sheet.createRow(0);
// 创建一个单元格
Cell cell = row.createCell(0);
// 生成一张表
FileOutputStream outputStream = new FileOutputStream(PATH + "demo.xls");
wb.write(outputStream);
}
读取
java
private static void read(){
FileInputStream inputStream = new FileInputStream(PATH + "demo.xls");
Workbook wb = new HSSFWorkbook(inputStream);
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
// 获取sheet页总行数
int rowCount = sheet.getPhysicalNumberOfRows();
// 获取一行的列数
int cellCount = row.getPhysicalNumberOfCells();
// 获取单元格的数据类型
int cellType = cell.getCellType();
switch (cellType) {
case HSSFCell.CELL_TYPE_STRING:cell.getStringCellValue();break;// 读字符串
case HSSFCell.CELL_TYPE_BOOLEAN:cell.getBooleanCellValue();break;// 读布尔值
case HSSFCell.CELL_TYPE_FORMULA:cell.getCellFormula();break;// 读公式
case HSSFCell.CELL_TYPE_BLANK:break;
case HSSFCell.CELL_TYPE_ERROR:break;
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
cell.getDateCellValue();// 读日期
} else {
// 为防止数字过长,将数字以字符串的格式输出
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.getStringCellValue();
}
break;
}
}
通用版-写入
java
private void autoWrite(){
FileOutputStream outputStream = null;
try {
创建工作簿
HSSFWorkbook wb = new HSSFWorkbook();
创建一种字体
HSSFFont font = wb.createFont();
// 粗体
font.setBold(true);
// 设置字号
font.setFontHeightInPoints((short) 14);
创建一种风格
HSSFCellStyle style = wb.createCellStyle();
// 设置边框:双线
style.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);// 上
style.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);// 下
style.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);// 左
style.setBorderTop(HSSFCellStyle.BORDER_DOUBLE);// 右
// 顶端对齐
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP);
// 垂直居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 水平居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 设置字体
style.setFont(font);
// 设置背景颜色
style.setFillBackgroundColor(HSSFColor.GREY_40_PERCENT.index);
// 设置前景颜色:excel一般使用前景色
style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
// 设置模式
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// 设置自动换行
style.setWrapText(true);
创建sheet页
HSSFSheet sheet = wb.createSheet("sheet页名称");
// 设置某列为自动列宽
sheet.autoSizeColumn(0);
// 设置默认列宽
sheet.setDefaultColumnWidth(20);
// 设置列宽(列索引,字节长度 * 2 * 256)
sheet.setColumnWidth(0,4 * 2 * 256);
// 合并单元格
sheet.addMergedRegion(new Region(0,(short)1,0,(short)2));
创建一行
HSSFRow row = sheet.createRow(0);
// 设置行高
row.setHeight((short) 1000);
创建一个单元格
HSSFCell cell = row.createCell(0);
// 设置单元格风格
cell.setCellStyle(style);
cell.setCellValue(new HSSFRichTextString("支持富文本"));
生成文件
outputStream = new FileOutputStream(PATH + "demo.xls");
wb.write(outputStream);
outputStream.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
计算公式
java
// 创建公式计算器
FormulaEvaluator formulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb);
// 执行计算
CellValue evaluate = formulaEvaluator.evaluate(cell);
evaluate.formatAsString();