POI读取和写入.xlsx 文档

注意读取的时候与字体大小,粗细没有关系

package com.cnpc.epai.usermanagement.controller;

import com.cnpc.epai.usermanagement.StartApplication;

import com.sun.tools.internal.xjc.reader.xmlschema.bindinfo.BIConversion;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Controller;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.io.*;
import java.util.*;

/**
 * @author 
 * @version 1.0.6
 * @ClassName: SysPoiController
 * @Description: TODO
 * @date 2019-10-15 16:51
 */
@Controller
@RequestMapping("/api/sys/poi")
public class SysPoiController {
    //所要读取源文件
    static final String filename = "F:/A/A11.xlsx";
    //用户名和邮箱相同的为一类
    static final String fileNameNew = "F:/ANew/A11NewSame.xlsx";
    //用户名相同,邮箱不同的为一类
    static final String fileNameNotNew = "F:/ANew/A11NewNotSame.xlsx";
    //组织机构不明确
    static final String fileNameLostOrg = "F:/ANew/A11NewLostOrg.xlsx";
    //每一行(row)未导入用户和系统中已存在用户,用户姓名不一致的
    static final String fileNameNotSameName = "F:/ANew/A11NewNotSameName.xlsx";
    /*
     *
     * @Author 李静
     * @Description POI读取Excel数据  可以自动生成 .xlsx 文件
     * @Date 17:02 2019-10-15
     * @Param []
     * @return void
     **/
    @RequestMapping(value = "/datagroup", method = RequestMethod.GET, produces = "application/json")
    @ResponseBody
    public static List<Map<String, Object>> readExcel() {
        List<Map<String, Object>> list = new ArrayList<>();
        FileInputStream fis = null;
        // 读取Excel
        Workbook wb = null;
        try {
            fis = new FileInputStream(filename);
            wb = new XSSFWorkbook(fis);
            // 使用wb。getNumberOfSheets获得sheet数目。。
            // 获取sheet数目
            Sheet sheet = wb.getSheetAt(0);
            Row row = null;
            int lastRowNum = sheet.getLastRowNum();
            // 循环读取
            for (int i = 0; i <= lastRowNum; i++) {

                row = sheet.getRow(i);
                if (row != null) {
                    // 获取每一列的值f放到map中
                    Map<String, Object> mapA = new HashMap<>();
                    mapA.put("用户姓名", getCellValue(row.getCell(0)).trim());
                    mapA.put("应用系统账号", getCellValue(row.getCell(1)).trim());
                    mapA.put("员工内网邮箱", getCellValue(row.getCell(2)).trim());
                    mapA.put("单位", getCellValue(row.getCell(3)).trim());
                    mapA.put("用户姓名1", getCellValue(row.getCell(4)).trim());
                    mapA.put("应用系统账号1", getCellValue(row.getCell(5)).trim());
                    mapA.put("员工内网邮箱1", getCellValue(row.getCell(6)).trim());
                    mapA.put("单位1", getCellValue(row.getCell(7)).trim());
                    mapA.put("备注", getCellValue(row.getCell(8)).trim());
                    mapA.put("未导入原因", getCellValue(row.getCell(9)).trim());
                    list.add(mapA);
                }
            }
            wb.close();
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                wb.close();
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return list;
    }


    private static String getCellValue(Cell cell) {
        Object result = "";
        if (cell != null) {
            switch (cell.getCellTypeEnum()) {
                case STRING:
                    result = cell.getStringCellValue();
                    break;
                case NUMERIC:
                    result = cell.getNumericCellValue();
                    break;
                case BOOLEAN:
                    result = cell.getBooleanCellValue();
                    break;
                case FORMULA:
                    result = cell.getCellFormula();
                    break;
                case ERROR:
                    result = cell.getErrorCellValue();
                    break;
                case BLANK:
                    result = " ";
                    break;
                default:
                    break;
            }
        }
        return result.toString();
    }

    /*
     *
     * @Author 
     * @Description
     *    flag:1 用户名和邮箱相同的为一类 可以自动生成 .xlsx 文件   A1:152   A2:480  A5:97   A8:10   A11:11
     *   flag:2 用户名相同,邮箱不同的为一类 可以自动生成 .xlsx 文件   A1:36  A2:610  A5:220   A8:9  A11:11
     *    flag:3 缺失组织机构的为一类 可以自动生成 .xlsx 文件   A1:16   A2:0  A5:0   A8:0  A11:0
     *    flag:4 每一行(row)未导入用户和系统中已存在用户,用户姓名不一致的(除去 组织机构不明确) 例如:(曾忠  曾  忠  这两个也算名称不一致).xlsx 文件   A1:16   A2:248  A5:41  A8:4  A11:1
     * @Date 11:25 2019-10-16
     * @Param [list, outputStream]
     * @return void
     **/
    @RequestMapping(value = "/writedatagroup", method = RequestMethod.POST, produces = "application/json")
    public static void writeSameExcel(String flag) {

        //创建工作簿
        XSSFWorkbook xssfWorkbook = null;
        xssfWorkbook = new XSSFWorkbook();

        //创建工作表
        XSSFSheet xssfSheet;
        xssfSheet = xssfWorkbook.createSheet();
        xssfSheet.setColumnWidth(0,80 * 100);
        xssfSheet.setColumnWidth(1,80 * 100);
        xssfSheet.setColumnWidth(2,80 * 100);
        xssfSheet.setColumnWidth(3,80 * 100);
        xssfSheet.setColumnWidth(4,80 * 100);
        xssfSheet.setColumnWidth(5,80 * 100);
        xssfSheet.setColumnWidth(6,80 * 100);
        xssfSheet.setColumnWidth(7,80 * 100);
        xssfSheet.setColumnWidth(8,80 * 100);
        xssfSheet.setColumnWidth(9,80 * 100);
        //自适应列宽度
      //  xssfSheet.autoSizeColumn(1, true);
        //创建行
        XSSFRow xssfRow;

        //创建列,即单元格Cell
        XSSFCell xssfCell;


        xssfRow = xssfSheet.createRow(0);

        //第一行合并单元格
                /*
        说明:
            1, // 起始行
            1, // 结束行
            0, // 起始列
            2  // 结束列
        */
        xssfSheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));
        xssfSheet.addMergedRegion(new CellRangeAddress(0, 0, 4, 9));


        xssfCell = xssfRow.createCell(0);
        xssfCell.setCellValue("A11未导入用户");
        //合并单元格之后这也不能写1 得按上面写4
        XSSFCell xs = xssfRow.createCell(4);
        xs.setCellValue("系统中已存在账户");

        //设置第一行居中显示(表头)
        XSSFCellStyle cellStyle = xssfWorkbook.createCellStyle();
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        xssfCell.setCellStyle(cellStyle);
        xs.setCellStyle(cellStyle);

        XSSFRow xRow =  xssfSheet.createRow(1);
        xRow.createCell(0).setCellValue("用户姓名");
        xRow.createCell(1).setCellValue("应用系统账号");
        xRow.createCell(2).setCellValue("员工内网邮箱");
        xRow.createCell(3).setCellValue("单位");
        xRow.createCell(4).setCellValue("用户姓名");
        xRow.createCell(5).setCellValue("应用系统账号");
        xRow.createCell(6).setCellValue("员工内网邮箱");
        xRow.createCell(7).setCellValue("单位");
        xRow.createCell(8).setCellValue("备注");
        xRow.createCell(9).setCellValue("未导入原因");



        List<Map<String, Object>> writeList = SysPoiController.readExcel();
        List<Map<String, Object>> writeListSame = new ArrayList<>();
        //把List里面的数据写到excel中
        //根据条件归类放到list中去
        //flag:1 用户名,应用系统账号,邮箱相同且都不为空的为一类 可以自动生成 .xlsx 文件   A1:147
        if ("1".equals(flag)) {
            writeList.stream().forEach(a -> {
                if (!Objects.equals((String) a.get("用户姓名"), "A1未导入用户")
                        && !Objects.equals((String) a.get("用户姓名"), "用户姓名")
                        && Objects.equals((String) a.get("应用系统账号"), (String) a.get("应用系统账号1"))
                        && Objects.equals((String) a.get("员工内网邮箱"), (String) a.get("员工内网邮箱1"))
                        && StringUtils.isNotBlank((String) a.get("员工内网邮箱"))
                        && StringUtils.isNotBlank((String) a.get("员工内网邮箱1"))
                ) {
                    writeListSame.add(a);
                }
            });
        };
//flag:2 应用系统账相同,邮箱不同的或有一个邮箱为空的为一类 可以自动生成 .xlsx 文件   A1:30
        if ("2".equals(flag)) {
            writeList.stream().forEach(a -> {
                if (!Objects.equals((String) a.get("用户姓名"), "A1未导入用户") && !Objects.equals((String) a.get("用户姓名"), "用户姓名")
                        &&  Objects.equals((String) a.get("应用系统账号"), (String) a.get("应用系统账号1"))
                        && !Objects.equals((String) a.get("员工内网邮箱"), (String) a.get("员工内网邮箱1"))
                        && StringUtils.isNotBlank((String) a.get("员工内网邮箱"))
                        && StringUtils.isNotBlank((String) a.get("员工内网邮箱1"))){
                    writeListSame.add(a);
                }
            });
        };
//flag:3 缺失组织机构的为一类 可以自动生成 .xlsx 文件   A1:16
        if ("3".equals(flag)){
            writeList.stream().forEach(a -> {
                if (Objects.equals((String)a.get("应用系统账号1"),"组织机构不明确")){
                    writeListSame.add(a);
                }
            });
        }

//flag:4 除上面方式之外的  A1:50
        if ("4".equals(flag)){
            writeList.stream().forEach(a -> {
                if (!Objects.equals((String) a.get("用户姓名"), "A1未导入用户")
                        && !Objects.equals((String) a.get("用户姓名"), "用户姓名") && !Objects.equals((String)a.get("应用系统账号1"),"组织机构不明确")) {
                    if ( !Objects.equals((String) a.get("应用系统账号"), (String) a.get("应用系统账号1"))
                            || StringUtils.isBlank((String) a.get("员工内网邮箱")) || StringUtils.isBlank((String) a.get("员工内网邮箱1"))
                    ){
                        writeListSame.add(a);
                    }
                }
            });
        }

        for (int i = 0; i < writeListSame.size(); i++) {

            //从第一行开始写入
            xssfRow = xssfSheet.createRow(i+2);
            //创建每个单元格Cell,即列的数据
            Map<String, Object> mapNew = writeListSame.get(i);
            xssfCell = xssfRow.createCell(0); //创建单元格
            xssfCell.setCellValue((String) mapNew.get("用户姓名")); //设置单元格内容

            xssfCell = xssfRow.createCell(1); //创建单元格
            xssfCell.setCellValue((String) mapNew.get("应用系统账号")); //设置单元格内容

            xssfCell = xssfRow.createCell(2); //创建单元格
            xssfCell.setCellValue((String) mapNew.get("员工内网邮箱")); //设置单元格内容

            xssfCell = xssfRow.createCell(3); //创建单元格
            xssfCell.setCellValue((String) mapNew.get("单位")); //设置单元格内容

            xssfCell = xssfRow.createCell(4); //创建单元格
            xssfCell.setCellValue((String) mapNew.get("用户姓名1")); //设置单元格内容

            xssfCell = xssfRow.createCell(5); //创建单元格
            xssfCell.setCellValue((String) mapNew.get("应用系统账号1")); //设置单元格内容

            xssfCell = xssfRow.createCell(6); //创建单元格
            xssfCell.setCellValue((String) mapNew.get("员工内网邮箱1")); //设置单元格内容

            xssfCell = xssfRow.createCell(7); //创建单元格
            xssfCell.setCellValue((String) mapNew.get("单位1")); //设置单元格内容

            xssfCell = xssfRow.createCell(8); //创建单元格
            xssfCell.setCellValue((String) mapNew.get("备注")); //设置单元格内容

            xssfCell = xssfRow.createCell(9); //创建单元格
            xssfCell.setCellValue((String) mapNew.get("未导入原因")); //设置单元格内容

        }
        //新建一输出文件流
        FileOutputStream fOut = null;
        try {
            if ("1".equals(flag)){
                fOut = new FileOutputStream(fileNameNew);
            };
            if ("2".equals(flag)){
                fOut = new FileOutputStream(fileNameNotNew);
            };
            if ("3".equals(flag)){
                fOut = new FileOutputStream(fileNameLostOrg);
            }
            if ("4".equals(flag)){
                fOut = new FileOutputStream(fileNameNotSameName);
            }
            xssfWorkbook.write(fOut);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (fOut != null) {
                try {
                    // 把相应的Excel 工作簿存盘
                    fOut.flush();
                    // 操作结束,关闭文件
                    fOut.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        System.out.println("文件生成...");
    }
}

虽然显示报错,但是文档生成没问题!!!!!!

{
    "timestamp": "2019-10-18 14:30:13",
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/api/sys/poi/writedatagroup"
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值