zoukankan      html  css  js  c++  java
  • postman上传excel,java后台读取excel生成到指定位置进行备份,并且把excel中的数据添加到数据库

    最近要做个前端网页上传excel,数据直接添加到数据库的功能。。在此写个读取excel的demo。

    首先新建springboot的web项目 导包,读取excel可以用poi也可以用jxl,这里本文用的是poi

    poi的 pom依赖如下:

    <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.17</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.17</version>
            </dependency>

    service层的实现类为:

    @Service
    public class ExcelServiceImpl  implements ExcelService {
        @Autowired
        private  CorpTaxService corpTaxService;
    
        @Override
        public void read(HttpServletRequest request, HttpServletResponse response, MultipartFile file) {
            String fileName = "";
            String filePath = "D://";
            if (file != null && !file.isEmpty()){
                fileName = file.getOriginalFilename();
            }else {
                throw new CECException(501, "上传的文件为空,请重新选择。");
            }
            BigDecimal tenThsoud = new BigDecimal(10000);
            ArrayList<CorpTax> list = new ArrayList<>();
    
            //excel文件路径
           // String excelPath2 =  "F:\工作簿2.xlsx";
            try {
                FileInputStream fis = null;
                if (file != null && !file.isEmpty()) {   //判断文件是否存在
    
                    String[] split = file.getOriginalFilename().split("\.");  //.是特殊字符,需要转义!!!!!
                    Workbook wb;
                    //根据文件后缀(xls/xlsx)进行判断
                    if ( "xls".equals(split[1])){
                        //fis = new FileInputStream(excel);   //文件流对象
                        wb = new HSSFWorkbook(file.getInputStream());
                    }else if ("xlsx".equals(split[1])){
                        wb = new XSSFWorkbook(file.getInputStream());
                    }else {
                        System.out.println("文件类型错误!");
                        throw new CECException(501, "文件类型错误");
                    }
    
                    //开始解析
                    Sheet sheet = wb.getSheetAt(0);     //读取sheet 0
    
                    int firstRowIndex = sheet.getFirstRowNum()+1;   //第一行是列名,所以不读
                    int lastRowIndex = sheet.getLastRowNum();
                    System.out.println("firstRowIndex: "+firstRowIndex);
                    System.out.println("lastRowIndex: "+lastRowIndex);
    
                    for(int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) {   //遍历行
                        System.out.println("rIndex: " + rIndex);
                        Row row = sheet.getRow(rIndex);
                        if (row != null) {
                            CorpTax corpTax = new CorpTax();
                            corpTax.setCorpName(row.getCell(0).getStringCellValue());
                            corpTax.setTaxData(new BigDecimal(row.getCell(1).getNumericCellValue()).divide(tenThsoud, 6, RoundingMode.HALF_UP));
                            corpTax.setFiscalRet(new BigDecimal(row.getCell(2).getNumericCellValue()).divide(tenThsoud, 6,RoundingMode.HALF_UP));
                            corpTax.setIndustry(row.getCell(3).toString());
                            corpTax.setCorpType(row.getCell(4).toString());
                            corpTax.setCorpBelong(row.getCell(5).toString());
                            corpTax.setCorpYear((int)row.getCell(6).getNumericCellValue());
                            corpTax.setCorpMonth((int)row.getCell(7).getNumericCellValue());
                            System.out.println(corpTax);
                            list.add(corpTax);
                  // 往数据库库添加数据,这里就是一个王数据库的添加操作
    int insert = corpTaxService.insert(corpTax); System.out.println(insert); int firstCellIndex = row.getFirstCellNum(); int lastCellIndex = row.getLastCellNum(); for (int cIndex = firstCellIndex; cIndex < lastCellIndex; cIndex++) { //遍历列 Cell cell = row.getCell(cIndex); if (cell != null) { System.out.println(cell.toString()); } } } } wb.close(); } else { System.out.println("找不到指定的文件"); } } catch (Exception e) { e.printStackTrace(); }       // 把excel生成到指定位置进行备份。 FileInputStream fileInputStream; try { fileInputStream = (FileInputStream) file.getInputStream(); BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream); FileOutputStream fileOutputStream = new FileOutputStream(filePath + fileName); BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream); byte[] bytes = new byte[1024]; while (bufferedInputStream.read(bytes) != -1){ bufferedOutputStream.write(bytes); } bufferedOutputStream.flush(); bufferedOutputStream.close(); bufferedInputStream.close(); } catch (IOException e) { e.printStackTrace(); } for (CorpTax corpTax : list){ System.out.println(corpTax); } } public List<CorpTax> test(){ BigDecimal tenThsoud = new BigDecimal(10000); ArrayList<CorpTax> list = new ArrayList<>(); //excel文件路径 String excelPath2 = "F:\工作簿2.xlsx"; try { FileInputStream fis = null; //String encoding = "GBK"; File excel = new File(excelPath2); if (excel.isFile() && excel.exists()) { //判断文件是否存在 String[] split = excel.getName().split("\."); //.是特殊字符,需要转义!!!!! Workbook wb; //根据文件后缀(xls/xlsx)进行判断 if ( "xls".equals(split[1])){ fis = new FileInputStream(excel); //文件流对象 wb = new HSSFWorkbook(fis); }else if ("xlsx".equals(split[1])){ wb = new XSSFWorkbook(excel); }else { System.out.println("文件类型错误!"); return null; } //开始解析 Sheet sheet = wb.getSheetAt(0); //读取sheet 0 int firstRowIndex = sheet.getFirstRowNum()+1; //第一行是列名,所以不读 int lastRowIndex = sheet.getLastRowNum(); System.out.println("firstRowIndex: "+firstRowIndex); System.out.println("lastRowIndex: "+lastRowIndex); for(int rIndex = firstRowIndex; rIndex <= lastRowIndex; rIndex++) { //遍历行 System.out.println("rIndex: " + rIndex); Row row = sheet.getRow(rIndex); if (row != null) { CorpTax corpTax = new CorpTax(); corpTax.setCorpName(row.getCell(0).getStringCellValue()); corpTax.setTaxData(new BigDecimal(row.getCell(1).getNumericCellValue()).divide(tenThsoud, 6, RoundingMode.HALF_UP)); corpTax.setFiscalRet(new BigDecimal(row.getCell(2).getNumericCellValue()).divide(tenThsoud, 6,RoundingMode.HALF_UP)); corpTax.setIndustry(row.getCell(3).toString()); corpTax.setCorpType(row.getCell(4).toString()); corpTax.setCorpBelong(row.getCell(5).toString()); corpTax.setCorpYear((int)row.getCell(6).getNumericCellValue()); corpTax.setCorpMonth((int)row.getCell(7).getNumericCellValue()); System.out.println(corpTax); list.add(corpTax); // int insert = corpTaxService.insert(corpTax); int firstCellIndex = row.getFirstCellNum(); int lastCellIndex = row.getLastCellNum(); for (int cIndex = firstCellIndex; cIndex < lastCellIndex; cIndex++) { //遍历列 Cell cell = row.getCell(cIndex); if (cell != null) { System.out.println(cell.toString()); } } } } wb.close(); // fis.close(); } else { System.out.println("找不到指定的文件"); } } catch (Exception e) { e.printStackTrace(); } return list; } }

    上面这个实现类包含两个方法,上面的那个方法是,可以把excel生成到D盘进行备份,并且读取其中的数据,添加到数据库的(这里读取excel中的数据添加到数据库,是我根据自己的数据库格式,剪切了excel就只剩下了8列,而且每一列的格式都是手动处理的,并没有使用工具类进行处理,网友想要用工具类进行处理,可以参考https://www.cnblogs.com/zhanghaoliang/p/6526089.html)。

    controller层就是一个简单的对service层的调用

    @RequestMapping("excel")
    @RestController
    public class ExcelController {
    
        @Autowired
        private ExcelService excelService;
    
    
        @RequestMapping(value = "upload",method = RequestMethod.POST)
        public String upLoadExcel(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "file") MultipartFile file){
            excelService.read(request, response, file);
            return "ok";
        }
    
    
    
    }

    参考文章:https://www.cnblogs.com/zhanghaoliang/p/6526089.html

    https://blog.csdn.net/gxx_csdn/article/details/79085713

    https://www.cnblogs.com/cx-code/p/9111336.html

    下面说一下,过程中的坑;

    1 org.springframework.beans.BeanInstantiationException  这是因为

    HttpServletRequest request, HttpServletResponse response  写成了
    HttpRequest request, HttpResponse response





  • 相关阅读:
    python爬虫循环导入MySql数据库
    以洛谷P2661信息传递为例总结找环的常见的几种方法
    CF1339E-Perfect Triples (打表找规律)
    CF1339D-Edge Weight Assignment (dfs)
    CF1335E2-Three Blocks Palindrome (hard version) (二分+双指针)
    CF1327D-Infinite Path (循环置换)
    洛谷P3178 [HAOI2015]树上操作 (树链剖分)
    洛谷P2590 [ZJOI2008]树的统计 (树链剖分)
    洛谷P3833 [SHOI2012]魔法树 (树链剖分)
    树链剖分板子
  • 原文地址:https://www.cnblogs.com/prader6/p/11128225.html
Copyright © 2011-2022 走看看