Apache的poi处理Excel
maven依赖
<!--xls -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<!-- xlsx -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
POI生成excel
private static void write() {
//创建HSSFWorkbook
HSSFWorkbook workbook = new HSSFWorkbook();
//创建sheet
HSSFSheet hssfSheet = workbook.createSheet("sheet_name");
//创建下面的row和cell
for(int i = 0 ; i < 10 ;i ++){
HSSFRow row = hssfSheet.createRow(i);
for(int j = 0;j < 5; j ++){
row.createCell(j).setCellValue("cell["+i+"]" + "["+j+"]");
}
}
try (OutputStream out = new FileOutputStream("D:\\easyexcel\\a.xls")){
//写出文件,导出excel只需要在response中获取OutputStream,设置响应类型即可
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
}
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
POI读取Excel
poi读取excel要注意excel格式,最好提前都设置成文本,否则需要处理,详细操作看Cell实现类的toString()源码,这里是对源码里的代码改了一下。
private static void read() throws Exception{
//String fileName = "D:\\easyexcel\\de.xls";
String fileName = "D:\\easyexcel\\de1.xlsx";
//xls
//Workbook workbook = new HSSFWorkbook(new FileInputStream(fileName));
//使用工厂创建Workbook
//Workbook workbook = WorkbookFactory.create(new FileInputStream(fileName));
//xlsx
Workbook workbook = new XSSFWorkbook(fileName);
Sheet sheet = workbook.getSheetAt(0);
for(int i = 0 ;i <= sheet.getLastRowNum(); i ++){
Row row = sheet.getRow(i);
for(int j = 0; j < row.getLastCellNum();j ++){
Cell cell = row.getCell(j);
System.out.println(getVal(cell));
}
}
workbook.close();
}
/**
* 读取值。这里直接复制Cell实现类的toString()方法,改了日期格式、公式和科学计数法的处理
* 最好导入的时候excel单元格格式设置成文本
* @param cell
* @return
*/
private static String getVal(Cell cell){
if(cell == null){
return null;}
switch(cell.getCellType()) {
case STRING:
//字符串
return cell.getStringCellValue();
case BLANK:
//空值
return "";
case FORMULA:
//公式 改成CellType.STRING ,读取到公式的值,否则返回的是公式本身 例如 E5 + E6
cell.setCellType(CellType.STRING);
return cell.getStringCellValue();
//return cell.getCellFormula();
case NUMERIC:
//默认时间格式会读成数值型,toString()源码这样处理 改了日期的格式
if (DateUtil.isCellDateFormatted(cell)) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:SS", LocaleUtil.getUserLocale());
sdf.setTimeZone(LocaleUtil.getUserTimeZone());
//数值型 时间格式也是数值型需要转换
return sdf.format(cell.getDateCellValue());
}
String numeric = String.valueOf(cell.getNumericCellValue());
//处理科学计数法
if(numeric.contains("E")){
return new BigDecimal(numeric).toPlainString();
}
//数值型
return String.valueOf(cell.getNumericCellValue());
case BOOLEAN:
// 布尔型
return cell.getBooleanCellValue() ? "TRUE" : "FALSE";
case ERROR:
//错误
return null;
default:
return "Unknown Cell Type: " + cell.getCellType();
}
}
Easyexcel
Easyexcel:EasyExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)
maven依赖
<!--Easyexcel-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>
<!-- 日志实现-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
生成excel
private static void writedemo() {
//excel表头,有深度的表头,表头可以不止占一行的表格,根据List数组大小
List<List<String>> head = new ArrayList<>();
head.add(Collections.singletonList("姓名"));
head.add(Collections.singletonList("年龄"));
head.add(Collections.singletonList("性别"));
//数据
List<List<String>> dataList = new ArrayList<>();
dataList.add(Arrays.asList("小红","18","女"));
dataList.add(Arrays.asList("小黑","19","男"));
dataList.add(Arrays.asList("小紫","20","女"));
//要创建的excel路径
String fileName = "D:\\easyexcel\\writedemo.xlsx";
//生成excel
EasyExcelFactory.write(fileName).sheet("自定义sheet_name").head(head).doWrite(dataList);
}
生成excel多个sheet页
private static void writeSheets() {
//文件路径
String fileName = "D:\\easyexcel\\writeString2.xlsx";
//获取ExcelWriterBuilder
ExcelWriterBuilder writerBuilder = EasyExcelFactory.write(fileName);
//构建ExcelWriter
ExcelWriter writer = writerBuilder.build();
//创建sheet信息
WriteSheet writeSheet = new WriteSheet();
//sheet页头
writeSheet.setHead(Arrays.asList(Arrays.asList("姓名"),Arrays.asList("性别"),Arrays.asList("爱好")));
//sheet序号
//writeSheet.setSheetNo(0);
//sheet页名称
writeSheet.setSheetName("sheet1");
writer.write(Arrays.asList(Arrays.asList("二哈","男","睡觉")),writeSheet);
//构建第二个sheet页
WriteSheet writeSheet1 = new WriteSheet();
//writeSheet1.setSheetNo(1);
writeSheet1.setHead(Arrays.asList(Arrays.asList("1"),Arrays.asList("2"),Arrays.asList("3")));
writeSheet1.setSheetName("sheet2");
writer.write(Arrays.asList(Arrays.asList("4","5","6")),writeSheet1);
writer.finish();
}
根据JAVA对象生成excel
-
创建java对象
@Data public class User { //value是头部名称,index是下标,以0开始 @ExcelProperty(value = "姓名",index = 0) private String name; @ExcelProperty(value = "部门",index = 1) private String dept; @ExcelProperty(value = "性别",index = 2) private String sex; public User(String name,String dept,String sex){ this.name = name; this.dept = dept; this.sex = sex; } public User(){ } }
-
生成excel代码
private static void write() { //文件路径 String fileName = "D:\\easyexcel\\demo.xlsx"; //创建对象List数组 List<User> list = new ArrayList<>(); for(int i = 0; i < 10 ;i ++){ list.add(new User("name"+i,"dept" + i,"sex" + i)); } ExcelWriterBuilder writerBuilder = EasyExcelFactory.write(fileName,User.class); writerBuilder.sheet("sheet_name1").doWrite(list); }
读取excel
-
创建监听类,继承AnalysisEventListener
public class EasyexcelListener extends AnalysisEventListener<User> { /** * 一行一行读取excel * @param user * @param analysisContext */ @Override public void invoke(User user, AnalysisContext analysisContext) { System.out.println(user.toString()); } /** * excel头读取 * @param headMap * @param context */ @Override public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) { System.out.println(headMap.toString()); super.invokeHeadMap(headMap, context); } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { } }
-
读取excel
private static void read() { String fileName = "D:\\easyexcel\\demo.xlsx"; //创建ExcelReaderBuilder,传入文件路径(也可以输入流),对象类类型(之前创建的User对象),新建的监听类 ExcelReaderBuilder readerBuilder = EasyExcelFactory.read(fileName,User.class,new EasyexcelListener()); //sheet(0) 读取的sheet页 readerBuilder.sheet(0).doRead(); }
文件下载
@RequestMapping(value = "/test")
@RestController
public class TestController {
@GetMapping(value = "/downLoad")
public void downLoad(HttpServletResponse response) throws Exception{
//导出数据
List<List<String>> lists = new ArrayList<>();
for(int i = 0;i < 10;i++){
lists.add(Arrays.asList("name" + i,"性别" + i,"年龄" + i));
}
//响应设置
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Disposition", "attachment; filename=" + System.currentTimeMillis() + ".xlsx");
//在response获取ServletOutputStream
ExcelWriterBuilder writerBuilder = EasyExcelFactory.write(response.getOutputStream());
ExcelWriterSheetBuilder sheetBuilder = writerBuilder.sheet("sheet_name");
sheetBuilder.doWrite(lists);
}
}