zoukankan      html  css  js  c++  java
  • java导入导出excel

    maven

    <!--POI-->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.16</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.14</version>
            </dependency>
    
    
            <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>1.3.1</version>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.4</version>
            </dependency>
    thymeleaf
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>Show User</title>
    </head>
    <body>
        <div >
            <table>
                <th:block>
                    <form id="file_form" action="http://localhost:8080/batchImport"
                          enctype="multipart/form-data" method="post">
                            <input type="file" name="file" id="file_input">
                            <input type="submit" value="导入数据" class="file">
                    </form> 
                    <a href="http://localhost:8080/batchExport" >导出数据</a>
                </th:block>
            </table>
             
        </div>
    </body>
    </html>
    ExcelImportUtil
    public class ExcelImportUtil {
    
        /** @描述:是否是2003的excel,返回true是2003 */
        public static boolean isExcel2003(String filePath)  {
            return filePath.matches("^.+\.(?i)(xls)$");
        }
    
        /**@描述:是否是2007的excel,返回true是2007 */
        public static boolean isExcel2007(String filePath)  {
            return filePath.matches("^.+\.(?i)(xlsx)$");
        }
    
    }
    ZipCompress
    public class ZipCompress {
        /**
         * 目的地Zip文件
         */
        private String zipFileName;
        /**
         * 源文件(待压缩的文件或文件夹)
         */
        private String sourceFileName;
    
        public ZipCompress(String zipFileName,String sourceFileName)
        {
            this.zipFileName=zipFileName;
            this.sourceFileName=sourceFileName;
        }
    
        public void zip() throws Exception
        {
            System.out.println("压缩中...");
            File file = new File(zipFileName);
            if(!file.exists()){
                File fileParent = file.getParentFile();
                if(!fileParent.exists()){
                    fileParent.mkdirs();
                }
            }
            //创建zip输出流
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
    
            //创建缓冲输出流
            BufferedOutputStream bos = new BufferedOutputStream(out);
    
            File sourceFile = new File(sourceFileName);
    
            //调用函数
            compress(out,bos,sourceFile,sourceFile.getName());
    
            bos.close();
            out.close();
            System.out.println("压缩完成");
    
        }
    
        public void compress(ZipOutputStream out,BufferedOutputStream bos,File sourceFile,String base) throws Exception
        {
            //如果路径为目录(文件夹)
            if(sourceFile.isDirectory())
            {
    
                //取出文件夹中的文件(或子文件夹)
                File[] list = sourceFile.listFiles();
    
                //如果文件夹为空,则只需在目的地zip文件中写入一个目录进入点
                if(list.length==0)
                {
                    System.out.println(base+"/");
                    out.putNextEntry(  new ZipEntry(base+"/") );
                }
                else//如果文件夹不为空,则递归调用compress,文件夹中的每一个文件(或文件夹)进行压缩
                {
                    for(int i=0;i<list.length;i++)
                    {
                        compress(out,bos,list[i],base+"/"+list[i].getName());
                    }
                }
            }
            else//如果不是目录(文件夹),即为文件,则先写入目录进入点,之后将文件写入zip文件中
            {
                out.putNextEntry( new ZipEntry(base) );
                FileInputStream fos = new FileInputStream(sourceFile);
                BufferedInputStream bis = new BufferedInputStream(fos);
    
                int tag;
                System.out.println(base);
                //将源文件写入到zip文件中
                while((tag=bis.read())!=-1)
                {
                    bos.write(tag);
                }
                bis.close();
                fos.close();
    
            }
        }
    }
    FileController
    @Controller
    public class FileController {
    
    
        @Autowired
        private BatchService batchService;
    
        @RequestMapping(value = "/file")
        public String file(){
            return "file.html";
        }
        
        @RequestMapping(value = "/batchImport")
        public String batchImport(MultipartFile file) {
            batchService.batchImport(file);
            return "forward:/file";
        }
    
        @RequestMapping(value = "/batchExport")
        public void batchExport(HttpServletResponse response) {
            batchService.batchExport(response);
        }
    }
    BatchService
    @Service
    @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,timeout=36000,rollbackFor=Exception.class)
    public class BatchService {
    
        public static final Logger logger = LoggerFactory.getLogger(BatchService.class);
    
        @Autowired
        private BatchMapper batchMapper;
        /**
         * 导出数据
         * @return
         */
        public int batchExport(HttpServletResponse response) {
            int result = 1;
            HSSFWorkbook wb = new HSSFWorkbook();
            logger.info("开始");
            HSSFSheet sheet = wb.createSheet("信息表");
            HSSFCellStyle style = wb.createCellStyle();
    
            style.setAlignment(HorizontalAlignment.CENTER);
            HSSFFont font = wb.createFont();
            font.setFontHeightInPoints((short)10);
            font.setFontName("宋体");
            style.setFont(font);
    
            /**设置单元格格式为文本格式*/
            HSSFDataFormat format = wb.createDataFormat();
            style.setDataFormat(format.getFormat("@"));
    
    
            HSSFRow row = sheet.createRow(0);
            row.createCell(0).setCellValue("用户信息");
            row.createCell(1);
            row.createCell(2);
            row.createCell(3).setCellValue("车信息");
            row.createCell(4);
            row.createCell(5);
            sheet.addMergedRegion(new CellRangeAddress(
                    0,0,0,2
            ));
            sheet.addMergedRegion(new CellRangeAddress(
                    0,0,3,5
            ));
            HSSFRow row1 = sheet.createRow(1);
            row1.createCell(0).setCellValue("id");
            row1.createCell(1).setCellValue("name");
            row1.createCell(2).setCellValue("age");
            row1.createCell(3).setCellValue("cid");
            row1.createCell(4).setCellValue("carName");
            row1.createCell(5).setCellValue("carPrice");
            List<BatchData> batchData = batchMapper.selectBatchData();
            logger.info(JSONObject.toJSONString(batchData));
            for (int i = 1; i <= batchData.size(); i++) {
                HSSFRow rowX = sheet.createRow(i + 1);
                BatchData dataX = batchData.get(i - 1);
                /**
                 * BatchData的字段设置为String类型则导出数据为文本类型,免得设置cell格式
                 */
                rowX.createCell(0).setCellValue(dataX.getId());
                rowX.createCell(1).setCellValue(dataX.getName());
                rowX.createCell(2).setCellValue(dataX.getAge());
                rowX.createCell(3).setCellValue(dataX.getCid());
                rowX.createCell(4).setCellValue(dataX.getCarName());
                rowX.createCell(5).setCellValue(dataX.getCarPrice().setScale(2,BigDecimal.ROUND_UP).toString()
                );
            }
            HSSFRow row00 = sheet.getRow(0);
            for (Cell cell : row00) {
                cell.setCellStyle(style);
            }
            HSSFRow row01 = sheet.getRow(1);
            for (Cell cell : row01) {
                cell.setCellStyle(style);
            }
            FileOutputStream out = null;
            FileInputStream fis = null;
            BufferedInputStream bis = null;
            String filePath = "D:/dabFile/";
            String fileZipPath = "D:/dabZipFile/";
            try {
                //创建excel文件
                File path = new File(filePath);
                if(!path.exists()){
                    path.mkdirs();
                }
                Integer random = new Random().nextInt(1000);
                String fileName = "dab"+System.currentTimeMillis()+random;
                out = new FileOutputStream(filePath+fileName+".xls");
                wb.write(out);
                //压缩为zip文件
                String fileZipName = "dab"+System.currentTimeMillis()+random;
                ZipCompress zipCom = new ZipCompress(fileZipPath+fileZipName+".zip",filePath+fileName+".xls");
                zipCom.zip();
                //下载zip文件
                File file = new File(fileZipPath+fileZipName+".zip");
                if(file.exists()){
                    logger.info("下载开始.....");
                    // 设置强制下载不打开
                    response.setContentType("application/force-download");
                    // 设置文件名
                    response.addHeader("Content-Disposition", "attachment;fileName=" + fileZipName+".zip");
    
                    byte[] buffer = new byte[1024];
                    fis = new FileInputStream(file);
                    bis = new BufferedInputStream(fis);
                    OutputStream os = response.getOutputStream();
                    int i = bis.read(buffer);
                    logger.info("开始读取.."+i);
                    while (i != -1) {
                        os.write(buffer, 0, i);
                        i = bis.read(buffer);
                        logger.info("读取中.."+i);
                    }
                    logger.info("下载成功.....");
    
                }else{
                    logger.info("下载失败!");
                }
            } catch (Exception e) {
                logger.error("接口内部错误",e);
                throw new MyException("接口内部错误",e);
            }finally {
                logger.info("进入finally代码块");
                if(out != null){
                    try {
                        out.close();
                        logger.info("关闭out输出流");
                    } catch (IOException e) {
                        logger.error("接口内部错误out",e);
                        throw new MyException("接口内部错误out",e);
                    }
                }
                if (bis != null) {
                    try {
                        bis.close();
                        logger.info("关闭bis输出流");
                    } catch (IOException e) {
                        logger.error("接口内部错误bis",e);
                        throw new MyException("接口内部错误bis",e);
                    }
                }
                if (fis != null) {
                    try {
                        fis.close();
                        logger.info("关闭fis输出流");
                    } catch (IOException e) {
                        logger.error("接口内部错误fis",e);
                        throw new MyException("接口内部错误fis",e);
                    }
                }
                //删除数据文件
                deleteDir(fileZipPath);
                deleteDir(filePath);
            }
            return result;
        }
    
        private  boolean deleteDir(String dir) {
            File file = new File(dir);
            boolean delete ;
            if (file.isDirectory()) {
                String[] children = file.list();
                if(children.length>0){
                    /**递归删除目录中的子目录下*/
                    for (int i=0; i<children.length; i++) {
                        boolean success = deleteDir(file.getPath()+"/"+children[i]);
                        if (!success) {
                            return false;
                        }
                    }
                }
                delete = file.delete();
                logger.info("删除目录"+delete);
            }else {
                delete = file.delete();
                logger.info("删除文件"+delete);
            }
            return delete;
        }
    
        public void batchImport(MultipartFile file) {
            try {
                if(!file.isEmpty()){
                    //获取文件名
                    String fileName = file.getOriginalFilename();
                    logger.info("上传的文件名为:" + fileName);
                    // 获取文件的后缀名
                    String suffixName = fileName.substring(fileName.lastIndexOf("."));
                    logger.info("文件的后缀名为:" + suffixName);
                    // 设置文件存储路径
                    String filePath = "D:/dabImport/";
                    String path = filePath + fileName;
                    File dest = new File(path);
                    // 检测是否存在目录
                    if (!dest.getParentFile().exists()) {
                        dest.getParentFile().mkdirs();// 新建文件夹
                    }
                    // 文件写入
                    file.transferTo(dest);
                    logger.info("上传文件成功!");
                    boolean excel2003 = ExcelImportUtil.isExcel2003(fileName);
                    boolean excel2007 = ExcelImportUtil.isExcel2007(fileName);
                    if(!excel2003 && !excel2007){
                        logger.info("上传文件格式不正确");
                        throw new MyException("上传文件格式不正确");
                    }
                    FileInputStream fis = new FileInputStream(dest);
                    Workbook wb = null;
                    if (excel2003) {
                        wb = new HSSFWorkbook(fis);
                    } else {
    
                        wb = new XSSFWorkbook(fis);
                    }
                    Sheet sheet = wb.getSheetAt(0);
                    for (int i = 2; i < sheet.getLastRowNum(); i++) {
                        Row row = sheet.getRow(i);
                        if(row == null){
                            continue;
                        }
                        double id0 = row.getCell(0).getNumericCellValue();
                        Integer id = Integer.valueOf(Double.valueOf(id0).intValue());
                        String name = row.getCell(1).getStringCellValue();
                        double age0 = row.getCell(2).getNumericCellValue();
                        Integer age = Integer.valueOf(Double.valueOf(age0).intValue());
                        User user = User.builder().name(name).age(age).build();
                        int u = batchMapper.addUser(user);
                        logger.info("导入user"+(u>0));
    
                        String carName = row.getCell(4).getStringCellValue();
                        String carPrice0 = row.getCell(5).getStringCellValue();
                        BigDecimal carPrice = BigDecimal.valueOf(Double.valueOf(carPrice0));
                        Car car = Car.builder().uid(id).carName(carName).carPrice(carPrice).build();
                        int c = batchMapper.addCar(car);
                        logger.info("导入car"+(c>0));
    
                    }
                }else{
                    logger.info("上传文件为空!");
                }
            } catch (Exception e) {
                logger.info("上传文件接口内部异常",e);
            }
        }
    }
  • 相关阅读:
    大batch任务对structured streaming任务影响
    spark 集群优化
    linux神器 strace解析
    打个 hadoop RPC的栗子
    netty 入门
    c#硬件对接数值转换
    RabbitMQ 消息队列入门
    RabbitMQ 开发环境安装部署
    Nginx-4.Nginx如何处理请求
    Nginx-3.控制nginx
  • 原文地址:https://www.cnblogs.com/h-c-g/p/9953912.html
Copyright © 2011-2022 走看看