Apache Poi 主要是用来处理excel 文件的:
我们先来介绍一下目前市面上的Excel分为两个大的版本Excel2003和Excel2007及以上两个版本,两者之间的区别如下
灬 | Excel2003 | Excel2007 |
---|---|---|
后缀 | xls | xlsx |
结构 | 二进制格式.其核心结构是复核文档类型的结构 | XML类型的结构 |
单sheet 数量 | 行:65535 列 256 | 行:1048576 列:16384 |
特点 | 存储容量有限 | 基于xml压缩 占用空间小 操作效率高 |
可以通用的方法
- 解决科学计数法()
new DecimalFormat("#").format(value);
/**
* 通用方法
* 获取 Cell 里面的值
* @param cell
* @return
*/
public static String getCellValue(Cell cell){
Object value = null ;
if (cell != null) {
switch (cell.getCellType()){
case STRING :
value = cell.getStringCellValue();
break;
case BOOLEAN :
value = cell.getBooleanCellValue();
break;
case NUMERIC :
if(DateUtil.isCellDateFormatted(cell)){
value = cell.getDateCellValue();
}else{
value = cell.getNumericCellValue();
//读取为字符串会存在科学记数法问题,转化处理
value = new DecimalFormat("#").format(value);
}
break;
case FORMULA :
value = cell.getCellFormula();
break ;
default:
System.out.println("读取失败!"+cell.getCellType());
break ;
}
}
return value== null? null:value.toString();
}
下面是举例
- 需要引入的依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.0.1</version>
</dependency>
POI 结构说明
- HSSF提供读写Microsoft Excel XLS格式档案的功能。
- XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。 HWPF提供读写Microsoft Word DOC格式档案的功能。
- HSLF提供读写Microsoft PowerPoint格式档案的功能。 HDGF提供读Microsoft Visio格式档案的功能。 HPBF提供读Microsoft Publisher格式档案的功能。
- HSMF提供读Microsoft Outlook格式档案的功能。
API 对象
- Workbook Excel的文档对象,针对不同的Excel类型分为:HSSFWorkbook(2003)和 XSSFWorkbool(2007)
- Sheet Excel的表单
- Row Excel的行
- Cell Excel的格子单元
- Font Excel字体
- CellStyle 格子单元样式
创建XLSX 常用方法
package com.poi;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class PoiTest01 {
public static void main(String[] args) throws IOException {
//创建workbook 对象
XSSFWorkbook wb = new XSSFWorkbook();
Font font = wb.createFont();
//创建字体对象 ? ? ? ?
font.setFontName("华文行楷");
font.setFontHeightInPoints((short)28);
//创建sheet 对象
XSSFSheet sheet = wb.createSheet();
//创建行对象,从0开始
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0);
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setFont(font);
//边框 ?
cellStyle.setBorderBottom(BorderStyle.DASH_DOT);
cellStyle.setBorderTop(BorderStyle.HAIR);
//设置居中显示
// 水平居中? ? ? ?
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 垂直居中? ? ? ?
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cell.setCellStyle(cellStyle);
cell.setCellValue("第一个文件!");
//合并
CellRangeAddress region =new CellRangeAddress(0, 3, 0, 2);
sheet.addMergedRegion(region);
//插入图片
//向Excel添加一张图片,并返回该图片在Excel中的图片集合中的下标 ? ? ? ?
FileInputStream stream=new FileInputStream("C:\\Users\\zhangguojing\\Pictures\\Saved Pictures\\mv001.jpg");
byte[] bytes = IOUtils.toByteArray(stream);
int pictureIdx = wb.addPicture(bytes,Workbook.PICTURE_TYPE_JPEG);
CreationHelper helper = wb.getCreationHelper();
//读取图片到二进制数组 ? ? ? ?
stream.read(bytes);
//创建一个绘图对象 ? ? ? ?
Drawing<?> patriarch = sheet.createDrawingPatriarch();
//创建锚点,设置图片坐标 ? ? ? ?
ClientAnchor anchor = helper.createClientAnchor();
anchor.setCol1(5);
//从0开始 ? ? ? ?
anchor.setRow1(5);//从0开始
//创建图片 ? ? ? ?
Picture picture = patriarch.createPicture(anchor, pictureIdx);
picture.resize();
//文件输出流
FileOutputStream fos = new FileOutputStream("E:\\test.xlsx");
wb.write(fos);
fos.close();
}
}
加载xlsx 方法:
package com.poi;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.IOException;
import java.text.DecimalFormat;
public class PoiReadTest {
public static void main(String[] args) throws IOException {
//1.创建工作薄
XSSFWorkbook wk = new XSSFWorkbook("E:\\test2.xlsx");
//2.获取sheet从 0开始
XSSFSheet sheet = wk.getSheetAt(0);
int lastRowNum = sheet.getLastRowNum();
Row row = null ;
Cell cell = null ;
//循环所有的行数据
for (int rowNum= 0; rowNum<= lastRowNum; rowNum++) {
row = sheet.getRow(rowNum);
//循环遍历每行的单元格
for (int cellNum = 0; cellNum <row.getLastCellNum(); cellNum++) {
cell = row.getCell(cellNum);
System.out.println(getCellValue(cell));
}
}
//
}
/**
* 通用方法
* 获取 Cell 里面的值
* @param cell
* @return
*/
public static String getCellValue(Cell cell){
Object value = null ;
if (cell != null) {
switch (cell.getCellType()){
case STRING :
value = cell.getStringCellValue();
break;
case BOOLEAN :
value = cell.getBooleanCellValue();
break;
case NUMERIC :
if(DateUtil.isCellDateFormatted(cell)){
value = cell.getDateCellValue();
}else{
value = cell.getNumericCellValue();
//读取为字符串会存在科学记数法问题,转化处理
value = new DecimalFormat("#").format(value);
}
break;
case FORMULA :
value = cell.getCellFormula();
break ;
default:
System.out.println("读取失败!"+cell.getCellType());
break ;
}
}
return value== null? null:value.toString();
}
}