您的位置:首页 > 编程语言 > Java开发

Springboot+Poi实现Excel的导入导出

2018-10-22 22:32 1131 查看
版权声明: https://blog.csdn.net/typ1805/article/details/83279532

一、poi简介

          Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

1、HSSF:HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。

2、POI EXCEL文档结构类

  • HSSFWorkbook excel文档对象
  • HSSFSheet excel的sheet HSSFRow excel的行
  • HSSFCell excel的单元格 HSSFFont excel字体
  • HSSFName 名称 HSSFDataFormat 日期格式
  • HSSFHeader sheet头
  • HSSFFooter sheet尾
  • HSSFCellStyle cell样式
  • HSSFDateUtil 日期
  • HSSFPrintSetup 打印
  • HSSFErrorConstants 错误信息表

3、导入Excel常用的方法:

  • POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("d:/test.xls"));    
  • HSSFWorkbook wb = new HSSFWorkbook(fs);  //得到Excel工作簿对象   
  • HSSFSheet sheet = wb.getSheetAt(0);   //得到Excel工作表对象   
  • HSSFRow row = sheet.getRow(i);  //得到Excel工作表的行   
  • HSSFCell cell = row.getCell((short) j);  //得到Excel工作表指定行的单元格 
  • cellStyle = cell.getCellStyle();  //得到单元格样式  

4、导出Excel常用的方法:

  • HSSFWorkbook wb = new HSSFWorkbook();  //创建Excel工作簿对象   
  • HSSFSheet sheet = wb.createSheet("new sheet");  //创建Excel工作表对象     
  • HSSFRow row = sheet.createRow((short)0);  //创建Excel工作表的行   
  • cellStyle = wb.createCellStyle();  //创建单元格样式   
  • row.createCell((short)0).setCellStyle(cellStyle);  //创建Excel工作表指定行的单元格   
  • row.createCell((short)0).setCellValue(1);  //设置Excel工作表的值  

二、springboot整合poi

    主要是springboot+myBatis+poi+mysql的简单应用,从数据库查询到结果集导出excel到本地,从本地中的excel文件导入到数据库表中。

1、添加依赖

[code]<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>RELEASE</version>
</dependency>

2、创建一个ExcelUtil类,这里的实现比较简单

[code]package com.example.demo.utils;

import com.example.demo.entity.ExcelData;
import com.example.demo.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;

import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import static org.apache.poi.ss.usermodel.CellType.*;

/**
* 路径:com.example.demo.utils
* 类名:
* 功能:导入导出
* 备注:
* 创建人:typ
* 创建时间:2018/10/19 11:21
* 修改人:
* 修改备注:
* 修改时间:
*/
@Slf4j
public class ExcelUtil {

/**
* 方法名:exportExcel
* 功能:导出Excel
* 描述:
* 创建人:typ
* 创建时间:2018/10/19 16:00
* 修改人:
* 修改描述:
* 修改时间:
*/
public static void exportExcel(HttpServletResponse response, ExcelData data) {
log.info("导出解析开始,fileName:{}",data.getFileName());
try {
//实例化HSSFWorkbook
HSSFWorkbook workbook = new HSSFWorkbook();
//创建一个Excel表单,参数为sheet的名字
HSSFSheet sheet = workbook.createSheet("sheet");
//设置表头
setTitle(workbook, sheet, data.getHead());
//设置单元格并赋值
setData(sheet, data.getData());
//设置浏览器下载
setBrowser(response, workbook, data.getFileName());
log.info("导出解析成功!");
} catch (Exception e) {
log.info("导出解析失败!");
e.printStackTrace();
}
}

/**
* 方法名:setTitle
* 功能:设置表头
* 描述:
* 创建人:typ
* 创建时间:2018/10/19 10:20
* 修改人:
* 修改描述:
* 修改时间:
*/
private static void setTitle(HSSFWorkbook workbook, HSSFSheet sheet, String[] str) {
try {
HSSFRow row = sheet.createRow(0);
//设置列宽,setColumnWidth的第二个参数要乘以256,这个参数的单位是1/256个字符宽度
for (int i = 0; i <= str.length; i++) {
sheet.setColumnWidth(i, 15 * 256);
}
//设置为居中加粗,格式化时间格式
HSSFCellStyle style = workbook.createCellStyle();
HSSFFont font = workbook.createFont();
font.setBold(true);
style.setFont(font);
style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
//创建表头名称
HSSFCell cell;
for (int j = 0; j < str.length; j++) {
cell = row.createCell(j);
cell.setCellValue(str[j]);
cell.setCellStyle(style);
}
} catch (Exception e) {
log.info("导出时设置表头失败!");
e.printStackTrace();
}
}

/**
* 方法名:setData
* 功能:表格赋值
* 描述:
* 创建人:typ
* 创建时间:2018/10/19 16:11
* 修改人:
* 修改描述:
* 修改时间:
*/
private static void setData(HSSFSheet sheet, List<String[]> data) {
try{
int rowNum = 1;
for (int i = 0; i < data.size(); i++) {
HSSFRow row = sheet.createRow(rowNum);
for (int j = 0; j < data.get(i).length; j++) {
row.createCell(j).setCellValue(data.get(i)[j]);
}
rowNum++;
}
log.info("表格赋值成功!");
}catch (Exception e){
log.info("表格赋值失败!");
e.printStackTrace();
}
}

/**
* 方法名:setBrowser
* 功能:使用浏览器下载
* 描述:
* 创建人:typ
* 创建时间:2018/10/19 16:20
* 修改人:
* 修改描述:
* 修改时间:
*/
private static void setBrowser(HttpServletResponse response, HSSFWorkbook workbook, String fileName) {
try {
//清空response
response.reset();
//设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
OutputStream os = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/vnd.ms-excel;charset=gb2312");
//将excel写入到输出流中
workbook.write(os);
os.flush();
os.close();
log.info("设置浏览器下载成功!");
} catch (Exception e) {
log.info("设置浏览器下载失败!");
e.printStackTrace();
}

}

/**
* 方法名:importExcel
* 功能:导入
* 描述:
* 创建人:typ
* 创建时间:2018/10/19 11:45
* 修改人:
* 修改描述:
* 修改时间:
*/
public static List<Object[]> importExcel(String fileName) {
log.info("导入解析开始,fileName:{}",fileName);
try {
List<Object[]> list = new ArrayList<>();
InputStream inputStream = new FileInputStream(fileName);
Workbook workbook = WorkbookFactory.create(inputStream);
Sheet sheet = workbook.getSheetAt(0);
//获取sheet的行数
int rows = sheet.getPhysicalNumberOfRows();
for (int i = 0; i < rows; i++) {
//过滤表头行
if (i == 0) {
continue;
}
//获取当前行的数据
Row row = sheet.getRow(i);
Object[] objects = new Object[row.getPhysicalNumberOfCells()];
int index = 0;
for (Cell cell : row) {
if (cell.getCellType().equals(NUMERIC)) {
objects[index] = (int) cell.getNumericCellValue();
}
if (cell.getCellType().equals(STRING)) {
objects[index] = cell.getStringCellValue();
}
if (cell.getCellType().equals(BOOLEAN)) {
objects[index] = cell.getBooleanCellValue();
}
if (cell.getCellType().equals(ERROR)) {
objects[index] = cell.getErrorCellValue();
}
index++;
}
list.add(objects);
}
log.info("导入文件解析成功!");
return list;
}catch (Exception e){
log.info("导入文件解析失败!");
e.printStackTrace();
}
return null;
}

//测试导入
public static void main(String[] args) {
try {
String fileName = "f:/test.xlsx";
List<Object[]> list = importExcel(fileName);
for (int i = 0; i < list.size(); i++) {
User user = new User();
user.setId((Integer) list.get(i)[0]);
user.setUsername((String) list.get(i)[1]);
user.setPassword((String) list.get(i)[2]);
user.setEnable((Integer) list.get(i)[3]);
System.out.println(user.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}

}

具体业务代码在此不赘述,完整代码:https://download.csdn.net/download/typ1805/10737617

三、poi API简述

1、设置sheet名称和单元格内容

[code]workbook.setSheetName(1, "工作表",HSSFCell.ENCODING_UTF_16);          
cell.setEncoding((short) 1);      
cell.setCellValue("单元格内容");  

2、取得sheet的数目 

[code]workbook.getNumberOfSheets()   

3、根据index取得sheet对象

[code]HSSFSheet sheet = wb.getSheetAt(0);  

4、取得有效的行数

[code]int rowcount = sheet.getLastRowNum();  

5、取得一行的有效单元格个数

[code]row.getLastCellNum();    

6、单元格值类型读写

[code]cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格为STRING类型   
cell.getNumericCellValue();//读取为数值类型的单元格内容  

7、设置列宽、行高

[code]sheet.setColumnWidth((short)column,(short)width);      
row.setHeight((short)height);    

8、添加区域,合并单元格

[code]// 合并从第rowFrom行columnFrom列
Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo(short)columnTo);  
// 到rowTo行columnTo的区域 
sheet.addMergedRegion(region);     
// 得到所有区域       
sheet.getNumMergedRegions()   

9、保存Excel文件

[code]FileOutputStream fileOut = new FileOutputStream(path);   
wb.write(fileOut);   

10、根据单元格不同属性返回字符串数值

[code]public String getCellStringValue(HSSFCell cell) {      
        String cellValue = "";      
        switch (cell.getCellType()) {      
        case HSSFCell.CELL_TYPE_STRING://字符串类型   
            cellValue = cell.getStringCellValue();      
            if(cellValue.trim().equals("")||cellValue.trim().length()<=0)      
                cellValue=" ";      
            break;      
        case HSSFCell.CELL_TYPE_NUMERIC: //数值类型   
            cellValue = String.valueOf(cell.getNumericCellValue());      
            break;      
        case HSSFCell.CELL_TYPE_FORMULA: //公式   
            cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);      
            cellValue = String.valueOf(cell.getNumericCellValue());      
            break;      
        case HSSFCell.CELL_TYPE_BLANK:      
            cellValue=" ";      
            break;      
        case HSSFCell.CELL_TYPE_BOOLEAN:      
            break;      
        case HSSFCell.CELL_TYPE_ERROR:      
            break;      
        default:      
            break;      
        }      
       return cellValue;      
}     

11、常用单元格边框格式

[code]HSSFCellStyle style = wb.createCellStyle();      
style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框        
style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框        
style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框        
style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框    

12、设置字体和内容位置

[code]HSSFFont f  = wb.createFont();      
f.setFontHeightInPoints((short) 11);//字号       
f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗       
style.setFont(f);      
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中       
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中       
style.setRotation(short rotation);//单元格内容的旋转的角度       
HSSFDataFormat df = wb.createDataFormat();      
style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式       
cell.setCellFormula(string);//给单元格设公式       
style.setRotation(short rotation);//单元格内容的旋转的角度   

13、插入图片

[code]//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray       
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();      
BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));      
ImageIO.write(bufferImg,"jpg",byteArrayOut);      
//读进一个excel模版       
FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt");       
fs = new POIFSFileSystem(fos);      
//创建一个工作薄       
HSSFWorkbook wb = new HSSFWorkbook(fs);      
HSSFSheet sheet = wb.getSheetAt(0);      
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();      
HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);           
patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));

14、调整工作表位置

[code]HSSFWorkbook wb = new HSSFWorkbook();     
HSSFSheet sheet = wb.createSheet("format sheet");     
HSSFPrintSetup ps = sheet.getPrintSetup();     
sheet.setAutobreaks(true);     
ps.setFitHeight((short)1);     
ps.setFitWidth((short)1);   

15、设置打印区域

[code]HSSFSheet sheet = wordbook.createSheet("Sheet1");     
wordbook.setPrintArea(0, "$A$1:$C$2");    

16、标注脚注

[code]HSSFSheet sheet = wordbook.createSheet("format sheet");     
HSSFFooter footer = sheet.getFooter()     
footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );  

17、在工作单中清空行数据,调整行位置

[code]HSSFWorkbook wb = new HSSFWorkbook();     
HSSFSheet sheet = wb.createSheet("row sheet");     
// Create various cells and rows for spreadsheet.      
// Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5)      
sheet.shiftRows(5, 10, -5);    

18、选中指定的工作表

[code]HSSFSheet sheet = wb.createSheet("row sheet");     
heet.setSelected(true);  

19、工作表的放大缩小

[code]HSSFSheet sheet1 = wb.createSheet("new sheet");     
sheet1.setZoom(1,2);   // 50 percent magnification    

20、头注和脚注

[code]HSSFSheet sheet = wb.createSheet("new sheet");     
HSSFHeader header = sheet.getHeader();     
header.setCenter("Center Header");     
header.setLeft("Left Header");     
header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +     
HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");  

21、自定义颜色

[code]HSSFCellStyle style = wb.createCellStyle();     
style.setFillForegroundColor(HSSFColor.LIME.index);     
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);     
HSSFFont font = wb.createFont();     
font.setColor(HSSFColor.RED.index);     
style.setFont(font);     
cell.setCellStyle(style);     

22、填充和颜色设置

[code]HSSFCellStyle style = wb.createCellStyle();     
style.setFillBackgroundColor(HSSFColor.AQUA.index);     
style.setFillPattern(HSSFCellStyle.BIG_SPOTS);     
HSSFCell cell = row.createCell((short) 1);     
cell.setCellValue("X");     
style = wb.createCellStyle();     
style.setFillForegroundColor(HSSFColor.ORANGE.index);     
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);     
cell.setCellStyle(style);   

23、强行刷新单元格公式

[code]HSSFFormulaEvaluator eval=new HSSFFormulaEvaluator((HSSFWorkbook) wb);    
private static void updateFormula(Workbook wb,Sheet s,int row){     
        Row r=s.getRow(row);     
        Cell c=null;     
        FormulaEcaluator eval=null;     
        if(wb instanceof HSSFWorkbook)     
            eval=new HSSFFormulaEvaluator((HSSFWorkbook) wb);     
        else if(wb instanceof XSSFWorkbook)     
            eval=new XSSFFormulaEvaluator((XSSFWorkbook) wb);     
        for(int i=r.getFirstCellNum();i
            c=r.getCell(i);     
            if(c.getCellType()==Cell.CELL_TYPE_FORMULA)     
                eval.evaluateFormulaCell(c);     
        }     
}    

24、设置不显示excel网格线 

[code]sheet.setDisplayGridlines(false);//其中sheet是Sheet对象 

25、设置excel单元格中的内容换行 

[code]cellStyle.setWrapText(true);

注意:其中cellStyle是WorkBook创建的CellStyle对象,然后将cellStyle设置到要换行的Cell对象,最后在要换行的对象(一般为字符串)加入"/r/n"。例如: 

[code]topTile.append("/r/n" +"cellContent"); 

26、单元格的合并 

[code]sheet.addMergedRegion(new CellRangeAddress(0, 4, 0, 2));// 本示例为合并4行2列 

27、设置页眉和页脚的页数 

[code] HSSFHeader header = sheet.getHeader(); 
header.setCenter("Center Header"); 
 header.setLeft("Left Header"); 
 header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") + 
 HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16"); 
HSSFFooter footer = (HSSFFooter )sheet.getFooter() 
 footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() ); 

28、使得一个Sheet适合一页 

[code] sheet.setAutobreaks(true); 

29、设置放大属性(Zoom被明确为一个分数,例如下面的75%使用3作为分子,4作为分母) 

[code]sheet.setZoom(3,4);   

30、设置打印 

[code]  HSSFPrintSetup print = (HSSFPrintSetup) sheet.getPrintSetup(); 
  print.setLandscape(true);//设置横向打印 
  print.setScale((short) 70);//设置打印缩放70% 
  print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//设置为A4纸张 
  print.setLeftToRight(true);//設置打印顺序先行后列,默认为先列行            
  print.setFitHeight((short) 10);设置缩放调整为10页高 
  print.setFitWidth((short) 10);设置缩放调整为宽高 

  sheet.setAutobreaks(false); 
  if (i != 0 && i % 30 == 0) {
      sheet.setRowBreak(i);//設置每30行分頁打印 
}

31、反复的行和列(设置打印标题) 

[code]HSSFWorkbook wb = new HSSFWorkbook(); 
wb.setRepeatingRowsAndColumns(0, 0, 12, 1, 6);//设置1到12列,行1到6每一页重复打印 

32、调整单元格宽度 

[code]sheet.setAutobreaks(true); 
sheet.setColumnWidth((short)i,colsWidth[i]); //设定单元格长度 
sheet.autoSizeColumn((short) i);//自动根据长度调整单元格长度 

 

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: