JAVA uses poi and easyexcel to read and write excel files

Apache's poi handles Excel

maven dependency

<!--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 generates 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 reads Excel

​ Poi should pay attention to the excel format when reading excel. It is best to set it to text in advance, otherwise it needs to be processed. For detailed operations, see the toString() source code of the Cell implementation class. Here is a change to the code in the source code.

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 uses a line-by-line analysis mode, and the analysis result of a line is notified in the observer mode (AnalysisEventListener)
maven dependency

<!--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>

Generate 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);
}

Generate excel multiple sheet pages

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();
}

Generate excel based on JAVA objects

  1. Create java object

    @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(){
          
          }
    }
    
  2. Generate excel code

    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);
    }
    

Read excel

  1. Create a listener class, inherit 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) {
          
          
        }
    }
    
  2. Read 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();
    }
    

file download

@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);
    }
}

Guess you like

Origin blog.csdn.net/zhaoqingquanajax/article/details/114849282