POI 对Excel读取和excel导入导出
poi分为2003版(.xls文件)和2007版(.xlsx文件),我只使用过xlsx的,所以只介绍07版Excel的基础操作。
阿里巴巴还有一个开源框架EasyExcel,但是我没有用过,各方面应该都更好。
EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单,节省内存著称,EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
一、首先导入jar包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
二、对Excel的一些基础操作
写入的基础操作
Workbook wb = new XSSFWorkbook();// 创建excel工作簿
Sheet sheet = wb.creaetShheet();// 在工作簿上创建表格-无参
wb.creaetShheet("表格1");// 有参-创建表格的表名
Row row = wb.createRow(row); //创建表格上的第row行 从0开始
Cell cell = row.createCell(col); // 创建row行上的第col列创建一个单元格,col要求 0 <= col <= 16384
cell.setCellValue("内容");// 为单元格赋值-有多种类型可选,我一般都是传string类型
读取操作
Sheet sheet = workbook.getSheet("表格1");
Row row = shhet.getRow(row);
Cell cell = row.getCell(col);
DataFormatter df = new DataFormatter();
String value = df.formatCellValue(cell);//获取cell中的值,不管什么类型都会转为String类型
合并单元格
CellRangeAddress addressCode = new CellRangeAddress (row, endRow, col, endCol);//创建一个合并单元个,row行到endRow行,col列到endCol列
sheet.addMergedRegion(addressCode );//合并单元格添加到具体的工作表中
样式
XSSFCellstyle style xssfWorkbook.createCellstyle();
style.setAlignment(HorizontalAlignment.CENTER);// 设置对水平齐方式
style.setverticalAlignment(VerticalAlignment.CENTER);// 设置垂直对齐方式
Font font xssfWorkbook.createFont(); //创建字体样式
font.setFontName("微软雅黑"); // 设置字体名字 默认是 Calibri.
font.setColor(IndexedColors.RED.getIndex());// 设置字体颜色
font.setBold(true);// 设置粗体
style.setFont(font);
style.setBorderBottom(Borderstyle.THIN); // 设置边框,多种可选
style.setBorderLeft(Borderstyle.THIN);
style.setBorderRight(Borderstyle.THIN);
style.setBorderTop(Borderstyle.THIN);
三、导入已经导出
导入-读取上传的Excel文件
public void importExcel(MultipartFile file,String uuid){
try(XSSFWorkbook workbook new XSSFWorkbook(file.getInputstream())){
// 具体操作
catch (IOException e){
e.printstackTrace();
log.error(e.getMessage());
}
}
导出-从数据库中拿对应的数据按格式输出
public void exportExcel(HttpServletResponse response,String id) {
try (ServletOutputstream out = response.getOutputstream())
String fileName URLEncoder.encode("文件名"+".xlsx",enc:"UTF-8");// 设置文件名,改UTF-8编码,防止中文名字乱码
response.setContentType(type:"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
response.setHeader(name:"Content-Disposition","attachment filename="+fileName);
XSSFWorkbook wb = new XSSFWorkbook ();
// 对文件内容进行输出
wb.write(out);
wb.close();
} catch (IOException e){
e.printstackTrace();
log.error("导出失败");
}
}