Java使用POI对excel得操作
我们这里只支持 03 和 07 得 文件后缀.xlsx
引入我们需要得坐标(普通得mevan项目)
<dependencies>
<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>
</dependencies>
简单输出Excel
package com.itheima.test;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
/**
* HSSFWorkbook :操作excel03版本的poi对象
* XSSFWorkbook :操作excel07版本及以后的poi对象
* SXSSFWorkbook:百万级数据POI使用的对象
*/
public class test01 {
public static void main(String[] args) throws Exception {
//1.创建excel对象 ---> excel文件
XSSFWorkbook wb = new XSSFWorkbook();
//2.创建sheet对象 ---->excel文件中得 表格 sheet
Sheet sheet = wb.createSheet();
//3.创建行对象 (指定位置得行 row) 索引从0开始
Row row = sheet.createRow(1); //-->XSSFRow row = sheet.createRow(1)
//4.创建单元格对象 (指定位置的单元格) 索引从0开始
Cell cell = row.createCell(1);
//5.设置单元格内容 及 样式
cell.setCellValue("哈哈");
//创建样式对象
XSSFCellStyle cellStyle = wb.createCellStyle();
//创建字体对象 字体样式
Font font = wb.createFont(); //创建字体对象
font.setFontName("微软雅黑"); //设置字体
font.setBold(true); //字体加粗
font.setFontHeightInPoints((short)48);//设置字体大小
font.setColor((short)10); //设置字体颜色 红色 --->font.setColor (Font.COLOR_RED)
cellStyle.setFont(font); // 给样式对象添加字体特征
cell.setCellStyle(cellStyle); //添加单元格样式
//6.把excle的内存对象生成文件 此处会出现异常 2种异常
// FileOutputStream os = new FileOutputStream("C:\Users\wuxin\Desktop\test001.xlsx"); //输出到的位置
OutputStream os = new FileOutputStream("C:\\Users\\wuxin\\Desktop\\test001.xlsx");
wb.write(os); //输出 文件下载
//7.关闭资源 内存
os.close(); //关闭流
wb.close(); //关闭excel内存对象
}
}
获取模板 入门
package com.itheima.test;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class test02 {
public static void main(String[] args) throws Exception {
//1.创建excel对象,利用有参构造 获取模板对象 //会有找不到的流的异常 //读取的是模板文件
XSSFWorkbook wb = new XSSFWorkbook("C:\\Users\\wuxin\\Desktop\\a.xlsx");
//2.读取excel模板对象 根据索引 0 开始
Sheet sheet = wb.getSheetAt(0);
//3.读取行
Row row = sheet.getRow(0);
//4.读取单元格
Cell cell = row.getCell(0);
//5.获取cell单元格样式
CellStyle cellStyle = cell.getCellStyle();
//6.获取单元格内容
String stringCellValue = cell.getStringCellValue();
System.out.println(cellStyle); //打印样式对象
System.out.println(stringCellValue); //打印单元格内容
wb.close();
}
}
##上传
@RequestMapping("/import")
public String imports(String contractId ,MultipartFile file) throws IOException {
//使用file 获取字流
InputStream in = file.getInputStream();
//使用字节输入流构建一个EXcel对象
XSSFWorkbook wb = new XSSFWorkbook(in);
//获取需要的表格
XSSFSheet sheet = wb.getSheetAt(0);
//获取全部的行 迭代器 不确定有多少行
// int last = sheet.getLastRowNum(); 获取row总数
Iterator<Row> iterator = sheet.iterator();
int index = 0 ;
Object[] box = new Object[10];
//货物对象集合
List<ContractProduct> list = new ArrayList();
while (iterator.hasNext()){
Row next = iterator.next();
if(index == 0){ //不要标题头 第一次结束当前循环
index++;
continue;
}
//获取当前行的中的没有单元格的文字内容
for (int i = 1; i < 10; i++) {
//这里取出的都是字符串 不是我们想要的 我们定义个方法 处理一下
box[i] = getValue( next.getCell(i));
}
ContractProduct cp = new ContractProduct(box,super.companyId,super.companyName);
cp.setContractId(contractId);
list.add(cp);
}
//list中存这全部的数据 调用service 实现保存
contractProductService.BatchSave(list);
return "redirect:/cargo/contract/list.do";
}
private Object getValue(Cell cell ) {
//定义一个返回值
Object rtValue = null ;
CellType cellType = cell.getCellType(); //获取cell中内容类型
switch (cellType){
case STRING : //字符串
rtValue = cell.getStringCellValue() ;
break;
case NUMERIC : //日期 和 数字都是这个类型
if(DateUtil.isCellDateFormatted(cell)){
rtValue = cell.getDateCellValue() ;
}else{ //全看作double
rtValue = cell.getNumericCellValue() ;
}
break;
case BOOLEAN : //布尔类型
rtValue = cell.getBooleanCellValue() ;
break;
default:
return null;
}
return rtValue;
}