<!--连接xhsell服务器-->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
<!-- 操作excel-->
<!--xls(03)-->
<!-- <dependency>-->
<!-- <groupId>org.apache.poi</groupId>-->
<!-- <artifactId>poi</artifactId>-->
<!-- <version>4.1.2</version>-->
<!-- </dependency>-->
<!-- <!–xlsx(07)–>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.poi</groupId>-->
<!-- <artifactId>poi-ooxml</artifactId>-->
<!-- <version>4.1.2</version>-->
<!-- </dependency>-->
<!--阿里巴巴 easyexcel 阿里巴巴的包括上面两个版本的依赖 防止依赖冲突 引入阿里巴巴的 上面就注释调 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.0-beta2</version>
</dependency>
<!-- 日期格式化工具 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<!--HttpServlet servlet-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.64</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>compile</scope>
</dependency>
<!-- JSON -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
</dependencies>
hssfworkbook 03 (xls) 03版本数据最多65536行
sxssfworkbook 07升级版 效率高
xssfworkbook 07 (xlsx);
public class Demo01ExcelWritePoiV03 {
public static void main(String[] args) throws IOException {
//创建的excel文件位置; //Random随机数
String fileName="2测试excel"+new Date().getSeconds()+".xls";
String path="E:\\javaTestdirectory\\"+fileName;
//1.创建工作簿;
Workbook workbook = new HSSFWorkbook();
//2.创建一个工作表;
Sheet sheet=workbook.createSheet("我是sheet1表");
//3.创建行
Row row=sheet.createRow(0); //创建第一行;
//4.创建列(创建一个单元格)
Cell cell=row.createCell(0);//此时已经创建好第一行第一列的那个 就是最左上角那个;
cell.setCellValue("我是第一行,第一列的值"); //往单元格赋值
Cell cell1=row.createCell(1);
cell1.setCellValue("我是第一行,第二列的值");
//创建第二行
Row row1=sheet.createRow(1);
row1.createCell(0).setCellValue("我是第二行,第一列的值");
row1.createCell(1).setCellValue("我是第二行,第二列的值--时间"+new DateTime().toString("yyyy-MM-dd HH:mm:ss"));//这个time需要jar包;
/**
* 合并单元格;
*/
// sheet.addMergedRegion(new CellRangeAddress(起始行,终止行,起始列,终止列));
// sheet.addMergedRegion(new CellRangeAddress(0,1,0,1));
//生成表;(io流) 03版本是xls结尾的文件
FileOutputStream fos = new FileOutputStream(path);
workbook.write(fos);
//关流;
fos.close();
System.out.println("文件生成完毕!");
}
}
public class Demo03ExcelReadPoiV03 {
public static void main(String[] args) throws IOException {
String path="E:\\javaTestdirectory\\测试[email protected]";
//创建io流 读取文件
FileInputStream fis = new FileInputStream(path);
//1.创建一个工作簿;
Workbook workbook = new HSSFWorkbook(fis);
//根据索引获取sheet表 0表示第一个sheet表
Sheet sheet = workbook.getSheetAt(0);
//获取第几行
Row row = sheet.getRow(0);
//获取第几列;
Cell cell = row.getCell(0);
//获取值:-->注意读取的类型;
String cellValue = cell.getStringCellValue();
//关流
fis.close();
System.out.println("(0,0)--》"+cellValue);
}
}
07版本关流之前需要清空一下临时文件--具体原因--看存储过程;
//new SXSSFWorkbook(1000); //07更快 1000表示先把超过这个数 就先把前面的数据写进去
//((sxssfworkbook)workbook).dispose //清除临时文件 因为他会生成临时文件;
//获取这个值的类型
/**
* _NONE(-1),
* NUMERIC(0), 数字(日期和普通数字)
* STRING(1), 字符串
* FORMULA(2), 计算公式;
* BLANK(3), 空
* BOOLEAN(4), 布尔
* ERROR(5); 错误
*/
int cellType = cell.getCellType();
System.out.println("--celltype-->"+cellType);
switch (cellType){
case HSSFCell.CELL_TYPE_STRING;
System.out.println("string类型"):
break;
case HSSFCell.CELL_TYPE_NUMERIC:
System.out.println("num类型");
break;
default:
System.out.println("---走着-->");
break;
}
/**
* 合并单元格;
*/
// sheet.addMergedRegion(new CellRangeAddress(起始行,终止行,起始列,终止列));
// sheet.addMergedRegion(new CellRangeAddress(0,1,0,1));
private static void setHeaderStyle(XSSFCellStyle cellStyle, Workbook workbook, Cell cell) {
// 首行样式
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setWrapText(true);
cellStyle.setBorderBottom(BorderStyle.THIN); // 下边框
cellStyle.setBorderLeft(BorderStyle.THIN);// 左边框
cellStyle.setBorderTop(BorderStyle.THIN);// 上边框
cellStyle.setBorderRight(BorderStyle.THIN);// 右边框
cellStyle.setFillForegroundColor(IndexedColors.ROYAL_BLUE.index);
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 填充模式
Font font = workbook.createFont();
font.setFontHeightInPoints((short) 11);
font.setFontName("宋体");
font.setColor(IndexedColors.WHITE.index);
font.setBold(true);
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
}
private static void setDataStyle(XSSFCellStyle cellStyle, Workbook workbook, Cell cell) {
// 数据样式
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setWrapText(true);
cellStyle.setBorderBottom(BorderStyle.THIN); // 下边框
cellStyle.setBorderLeft(BorderStyle.THIN);// 左边框
cellStyle.setBorderTop(BorderStyle.THIN);// 上边框
cellStyle.setBorderRight(BorderStyle.THIN);// 右边框
cellStyle.setFillForegroundColor(IndexedColors.WHITE.index);
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 填充模式
Font font = workbook.createFont();
font.setFontHeightInPoints((short) 10);
font.setFontName("宋体");
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
}
private static String stripHtml(String content) {
// 替换为换行
content = content.replaceAll(""
, "\n");
//
替换为换行
content = content.replaceAll("
", "\n");
// 替换为换行
content = content.replaceAll("", "\n");
// 去掉其它的<>之间的东西
content = content.replaceAll("\\<.*?>", "");
return content;
}
easyexcel --直接看代码 ,不解释了
1.实体类
package com.me.modules.excel.easyexcel;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
*/
@Data
public class Student {
@ExcelProperty("人员id")
private int id;
@ExcelProperty("人员姓名")
private String name;
@ExcelProperty("人员年龄")
private String age;
@ExcelProperty("人员电子邮件")
private String email;
@ExcelProperty("日期")
private Date date;
@ExcelProperty("人员性别")
private boolean sex;
/**
* 忽略这个字段;
*/
@ExcelIgnore
private String ignore;
}
2.写
package com.me.modules.excel.easyexcel;
import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
使用easyexcel写入数据
*/
public class DemoEasyexcelWrite01 {
public static void main(String[] args) {
String path="E:\\javaTestdirectory\\easyexcle_"+System.currentTimeMillis()+".xlsx";
/**
* 模拟数据-创建对象数组;
*/
Date date = new Date();
List<Student> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Student student = new Student();
student.setAge("2"+i);
student.setDate(date);
student.setId(i);
student.setEmail("我是email_"+i);
student.setSex(true);
student.setIgnore("我是ingnore_"+i);
student.setName("我是名字——"+i);
list.add(student);
}
// System.out.println(list.toString());
//写入文件
/**
* 方法1;
* 这里需要指定写用哪个class去写,然后写到第一个sheet,名字为我是模板1,然后文件流会自动关闭
* 如果这里i想用03版 则传入exceltype参数即可;
*/
EasyExcel.write(path,Student.class).sheet("我是模板1").doWrite(list);
}
}
3.读–创建监听;
package com.me.modules.excel.easyexcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
/**
*/
public class DemoEasyexcelReadListener extends AnalysisEventListener<Student> {
private static final Logger LOGGER= LoggerFactory.getLogger(DemoEasyexcelReadListener.class);
private static final int BATCH_COUNT=5;
List<Student>list=new ArrayList<Student>();
//读取数据会执行invoke方法; student类型; AnalysisContext分析上问
@Override
public void invoke(Student data, AnalysisContext analysisContext) {
System.out.println("数据--》"+ JSON.toJSONString(data));
list.add(data);
//达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易oom
if (list.size()>=BATCH_COUNT){ //此时list里面有五个; //每五个会走进这个里面;
//持久化逻辑
saveData();
//存储完成清理list;
list.clear();
}
}
private void saveData() {
System.out.println("自定义操作--"+"一条条的读取数据");
}
/**
* 所有数据解析完成了 都会来调用
* @param analysisContext
*/
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//这里也要保存数据,确保最后遗留的数据也存储到数据库种;
saveData();
System.out.println("所有数据解析完成!"); //最后一条数据走这
}
}
4.读
package com.me.modules.excel.easyexcel;
import com.alibaba.excel.EasyExcel;
/**
读取数据;
*/
public class DemoEasyexcelReade01 {
public static void main(String[] args) {
String path="E:\\javaTestdirectory\\easyexcle_1669639882647.xlsx";
/**
* 读取文件
* 有个重点: DemoEasyexcelReadListener不能被sptring管理,要每次读取excel都要new,然后里面用到soring可以构造方法传进
*指定读用student的clss 读取第一个sheet 文件流自动关闭;
*/
EasyExcel.read(path,Student.class,new DemoEasyexcelReadListener()).sheet().doRead();
}
}