Apache POI
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。我们一般针对excel进行操作。
POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁的模糊实现”。
HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。
HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”
POI结构说明
HSSF提供读写Microsoft Excel XLS格式档案的功能。
XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。
以及用来读写其他Office的
操作excel常用的类和方法
https://blog.csdn.net/vbirdbest/article/details/72870714
- HSSFWorkbook :工作簿,代表一个excel的整个文档
HSSFWorkbook(); // 创建一个新的工作簿
HSSFWorkbook(InputStream inputStream); // 创建一个关联输入流的工作簿,可以将一个excel文件封装成工作簿
HSSFSheet createSheet(String sheetname); 创建一个新的Sheet
HSSFSheet getSheet(String sheetName); 通过名称获取Sheet
HSSFSheet getSheetAt(int index); // 通过索引获取Sheet,索引从0开始
HSSFCellStyle createCellStyle(); 创建单元格样式
int getNumberOfSheets(); 获取sheet的个数
setActiveSheet(int index); 设置默认选中的工作表
write();
write(File newFile);
write(OutputStream stream); - HSSFSheet:工作表
HSSFRow createRow(int rownum); 创建新行,需要指定行号,行号从0开始
HSSFRow getRow(int index); 根据索引获取指定的行
int addMergedRegion(CellRangeAddress region); 合并单元格
CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol); 单元格范围, 用于合并单元格,需要指定要合并的首行、最后一行、首列、最后一列。
autoSizeColumn(int column); 自动调整列的宽度来适应内容
getLastRowNum(); 获取最后的行的索引,没有行或者只有一行的时候返回0
setColumnWidth(int columnIndex, int width); 设置某一列的宽度,width=字符个数 * 256,例如20个字符的宽度就是20 * 256 - HSSFRow :行
HSSFCell createCell(int column); 创建新的单元格
HSSFCell setCell(shot index);
HSSFCell getCell(shot index);
setRowStyle(HSSFCellStyle style); 设置行样式
short getLastCellNum(); 获取最后的单元格号,如果单元格有第一个开始算,lastCellNum就是列的个数
setHeightInPoints(float height); 设置行的高度 - HSSFCell:单元格
setCellValue(String value); 设置单元格的值
setCellType(); 设置单元格类型,如 字符串、数字、布尔等
setCellStyle(); 设置单元格样式
String getStringCellValue(); 获取单元格中的字符串值
setCellStyle(HSSFCellStyle style); 设置单元格样式,例如字体、加粗、格式化
setCellFormula(String formula); 设置计算公式,计算的结果作为单元格的值,也提供了异常常用的函数,如求和"sum(A1,C1)"、日期函数、字符串相关函数、CountIf和SumIf函数、随机数函数等 - HSSFCellStyle :单元格样式
setFont(Font font); 为单元格设置字体样式
setAlignment(HorizontalAlignment align); // 设置水平对齐方式
setVerticalAlignment(VerticalAlignment align); // 设置垂直对齐方式
setFillPattern(FillPatternType fp);
setFillForegroundColor(short bg); 设置前景色
setFillBackgroundColor(short bg); 设置背景颜色 - HSSFFont:字体
setColor(short color); // 设置字体颜色
setBold(boolean bold); // 设置是否粗体
setItalic(boolean italic); 设置倾斜
setUnderline(byte underline); 设置下划线 - HSSFName:名称
- HSSFDataFormat :格式化
- HSSFHeader : Sheet的头部
- HSSFFooter :Sheet的尾部
- HSSFDateUtil :日期工具
- HSSFPrintSetup :打印设置
- HSSFErrorConstants:错误信息表
引入pom文件
一般引入poi-ooxml即可,这个包会自动关联引入poi包及其他包
poi用来处理excel2003及以前版本的文件,后缀名为.xls
poi-ooxml用来处理excel2007及以上的文件,后缀名为.xlsx
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
例子(.xlsx)
package com.myown.excel.poi;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.*;
import java.io.*;
import java.util.Calendar;
import java.util.Date;
public class TestXlsx {
public static void main(String[] args) throws IOException {
//创建工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
//创建Sheet页
XSSFSheet sheet = workbook.createSheet("XlsxSheet");
//创建新行
XSSFRow row0 = sheet.createRow(0);
//在行内创建单元格并赋值
row0.createCell(0).setCellValue("学号");
row0.createCell(1).setCellValue("姓名");
row0.createCell(2).setCellValue("语文");
row0.createCell(3).setCellValue("数学");
row0.createCell(4).setCellValue("总分");
row0.createCell(5).setCellValue("出生日期");
//创建新行
XSSFRow row1 = sheet.createRow(1);
//在行内创建单元格
row1.createCell(0).setCellValue("1");
Cell cell1 = row1.createCell(1);
//======================设置字体格式=======================
XSSFCellStyle cellStyle1 = workbook.createCellStyle();
XSSFFont font1 = workbook.createFont();
font1.setFontName("华文行楷");//设置字体名称
font1.setBold(true);//字体加粗
font1.setFontHeight(50);//设置字体高度
//font1.setFontHeightInPoints((short)123);
font1.setColor(IndexedColors.RED.getIndex());//设置字体颜色
cellStyle1.setFont(font1);
cell1.setCellStyle(cellStyle1);//为单元格设置格式
cell1.setCellValue("杰克");
//======================设置保留两位小数=======================
XSSFCellStyle cellStyle2 = workbook.createCellStyle();
XSSFDataFormat dataFormat = workbook.createDataFormat();
cellStyle2.setDataFormat(dataFormat.getFormat("0.00"));
XSSFCell cell2 = row1.createCell(2);
XSSFCell cell3 = row1.createCell(3);
XSSFCell cell4 = row1.createCell(4);
//为单元格设置格式
cell2.setCellStyle(cellStyle2);
cell2.setCellValue(80.5);
cell3.setCellStyle(cellStyle2);
cell3.setCellValue(98);
cell4.setCellStyle(cellStyle2);
cell4.setCellFormula("C2+D2");
//==================设置日期样式========================
XSSFCellStyle cellStyle3 = workbook.createCellStyle();
XSSFDataFormat dataFormat1 = workbook.createDataFormat();
cellStyle3.setDataFormat(dataFormat1.getFormat("yyyy年MM月dd日"));
Calendar c = Calendar.getInstance();
c.set(1997,2,6);
Date date = c.getTime();
Cell cell5 = row1.createCell(5);
cell5.setCellValue(date);
cell5.setCellStyle(cellStyle3);
sheet.setColumnWidth(1, 255*20); // 设置列的宽度
sheet.setColumnWidth(5, 255*20); // 设置列的宽度
//通过outputStream将内存中的Excel文件下载到磁盘
File file = new File("d:/test19.xlsx");
OutputStream outputStream = new FileOutputStream(file);
workbook.write(outputStream);
outputStream.close();
}
}
执行结果:
格式化时,都是调用如下方法
XSSFDataFormat dataFormat = workbook.createDataFormat();
cellStyle.setDataFormat(dataFormat.getFormat(String format));
https://jingyan.baidu.com/article/e2284b2baec838e2e6118ddf.html
实现日期格式的方法代码
cellStyle.setDataFormat(dataFormat.getFormat("yyyy年MM月dd日"));
实现保留两位小数格式的方法代码
cellStyle.setDataFormat(dataFormat.getFormat("0.00"));
实现货币格式的方法代码
cellStyle.setDataFormat(dataFormat.getFormat("¥#,##0"));
实现百分比格式的方法代码
cellStyle.setDataFormat(dataFormat.getFormat("0.00%"));
实现数字转中文大写格式的方法代码
cellStyle.setDataFormat(dataFormat.getFormat("[DbNum2][$-804]0"));
实现科学计数法格式的方法代码
cellStyle.setDataFormat(dataFormat.getFormat("0.00E+00"));